CentOS7でDRBD9の環境構築

CentOS7でDRBD9の環境構築を行いました。

また、DRBDの設定管理ツールはdrbdmanageを用いました。

* drbdはversion=9.0.0
* drbdmanageはversion=0.49

# 参考

* [DRBD9特集](https://blog.3ware.co.jp/2015/04/drbd9%E7%89%B9%E9%9B%86%E3%81%AB%E3%81%82%E3%81%9F%E3%81%A3%E3%81%A6/#more-400)
* [The DRBD User’s Guide](http://drbd.linbit.com/users-guide-9.0/drbd-users-guide.html)
* [DRBD Source](http://oss.linbit.com/drbd/)

# DRBDって？
* DRDBじゃないです、DRBDです。
* DRBD(Distributed Replicated Block Device)はネットワークを介して、ハードディスクなどのブロックデバイスをリアルタイムにレプリケート可能なオープンソースソフトウェアです。
* 最新~~(といっても、この原稿を書いているときは開発版ですが)~~(リリースはされているが、stableではなく、まだDevelopment branchで開発が進められている状態でした)のバージョンであるDRBD9は多ノードレプリケーションに対応するなど、新機能が盛り込まれています。
* DRBD9と同時開発で、DRBDの管理が格段に楽になるdrbdmanageも公開されています。

# 導入環境
* CentOS7.0系(64bit)
* HDDを2枚持つ仮想マシン
* drbd9-01,drbd9-02,drbd9-03の三台でクラスタを構成
* ここで出てくるマシン名(drbd9-01等)は uname -n で出力されたもの
* drbd9-01のipアドレス: 10.255.10.11
* drbd9-02のipアドレス: 10.255.10.12
* drbd9-03のipアドレス: 10.255.10.13

# 前準備

すべてのノードで行う

1. 必要なパッケージを取得

        # yum update
        # yum groupinstall "Development Tools"      (任意)
        # yum install -y wget
        # yum install -y libxslt pygobject2 help2man
        # yum install -y kernel-headers		(入っているかの確認)
        # reboot

2. 必要なソースを持ってくる

* DRBD kernel module

        $ git clone --recursive git://git.drbd.org/drbd-9.0.git

* DRBD utilities

        $ wget http://oss.linbit.com/drbd/drbd-utils-8.9.3.tar.gz
	
 gitは現状無いためソースを直接取りに行く

* drbdmanage

        $ git clone --recursive http://git.drbd.org/drbdmanage.git

* 注意点
  - drbdmanageはpythonの2系が必要
  - kernel-headers が必要になるので、インストールされているか必ず確認する(Development Toolsで大体は入っているはず)


# DRBD9のインストール

すべてのノードで行う

* DRBD kernel module

        $ cd drbd-9.0
        $ sudo make
        $ sudo make install

makeができないときはmake KDIR=/lib/modules/.../build とする


* DRBD utilities
drbdadmなどのコマンドが入る

        $ tar zxvf drbd-utils-8.9.3.tar.gz
        $ cd drbd-utils-8.9.3
        $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc 
        $ make
        $ sudo make install

* drbdmanage
注意：DRBD utilitiesをインストール後に実行する

        $ cd drbdmanage	
        $ make
        $ sudo make install

* 確認
drbdadam コマンド,drbdmanage コマンドが入っていることを確認


# パーティションの設定

sdbはdrbd用に用意した二枚目のハードディスクデバイス
 
    # fdisk /dev/sdb
        コマンド (m でヘルプ): n			       → 新たに領域を作成
        Partition type:
           p   primary (0 primary, 0 extended, 4 free)
           e   extended
        Select (default p): p			→ primaryで作成
        パーティション番号 (1-4, default 1): 1	        → これでsdb1という名称のパーティションが作られる
        最初 sector (2048-33554431, 初期値 2048):	                      → default(Enterを押す)
        初期値 2048 を使います
            Last sector, +sectors or +size{K,M,G} (2048-33554431, 初期値 33554431):	→ default(Enterを押す)
        初期値 33554431 を使います
        Partition 1 of type Linux and of size 16 GiB is set

        コマンド (m でヘルプ): w		→ ディスクに書き込み、終了
        パーティションテーブルは変更されました！

        ioctl() を呼び出してパーティションテーブルを再読込みします。
        ディスクを同期しています。

/dev配下にsdb1ができていることを確認

* 物理ボリューム(Physical Volume：PV)の作成

        # pvcreate /dev/sdb1

* ボリュームグループ(Volume Group：VG)の作成

        # sudo vgcreate drbdpool /dev/sdb1

  - VGの名称である 「drbdpool」は drbdmanager で使用するデフォルト名なので変更しない

# drbdmanageによるリソースのデプロイ

* すべてのノードで行う

  - drbdmanageで使用するデフォルトのポートを開ける
  - 作成したボリュームは、デフォルトだと7700番ポートから順番に昇順で確保される

ここではコマンドを叩くことでポートを開ける方法と、設定ファイルを作成してポートを開ける方法の2種類を示す

1.コマンドだけで終わらせる方法

    # firewall-cmd --add-port=6999/tcp --zone=public --permanent
    # firewall-cmd --reload
    # firewall-cmd --add-port=7700-7800/tcp --zone=public --permanent
    # firewall-cmd --reload

2.設定ファイルを作成する方法

    # cd /etc/firewalld/services/		
        # vi drbdmanage.xml
        # firewall-cmd --reload
        # firewall-cmd --add-service=drbdmanage --zone=public --permanent
        # firewall-cmd --reload

  * 注意：super userになっていないとfirewalld以下のディレクトリは見えません

  * 設定ファイル例(drbdmanage.xml)

        <?xml version="1.0" encoding="utf-8"?>
        <service>
          <short>drbdmanage</short>
            <description>Drbdmanage is configuration management tool for drbd. 6999 port is used for the control volume "drbdctrl" of drbdmanage. This port number is default. You can change these port number yourself.</description>
          <port protocol="tcp" port="6999"/>
          <port protocol="tcp" port="7700-7800"/>
        </service>

追記(10/16)

* drbdmanageのバージョン0.50からは、デフォルトで使用されるポート番号が7000番からになっているので注意してください。


# クラスタのinitialize
クラスタ内のノード1台だけで実行(今回はdrbd9-01)

    # drbdmanage init 10.255.10.11
        You are going to initalize a new drbdmanage cluster.
        CAUTION! Note that:
          * Any previous drbdmanage cluster information may be removed
          * Any remaining resources managed by a previous drbdmanage installation
            that still exist on this system will no longer be managed by drbdmanage

        Confirm:

          yes/no: yes
          Failed to find logical volume "drbdpool/.drbdctrl"
          Logical volume ".drbdctrl" created.
        initializing activity log
        NOT initializing bitmap
        Writing meta data...
        New drbd meta data block successfully created.
        empty drbdmanage control volume initialized.
        Operation completed successfully

* 追記
10/6に最新版で実行したところ、drbdpool内に作成されるdrbdctrlファイルが".drbdctrl_0"と".drbdctrl_1"の2つが作成されていた。
調べたところ、[gitのlog](http://git.drbd.org/drbdmanage.git/commit/77c440e8f1ac943c9ec522dc95c7f98e3b5d90f3)に、Implemented dual-redundant drbdmanage control volume と書いてあった、おそらくこいつが原因。

# クラスタにノードを追加
クラスタ内のノード1台だけで実行(今回はdrbd9-01)

	# drbdmanage add-node drbd9-02 10.255.10.12
            Operation completed successfully
            Operation completed successfully
            Host key verification failed.

            Join command for node drbd9-02:
            drbdmanage join -p 6999 10.255.10.12 1 drbd9-01 10.255.10.11 0 SecretKey

* 追加したいノードで実行するコマンドが表示される
* 同様にdrbd9-03もadd-nodeする

# ノードのJoin
drbd9-02で実行

    # drbdmanage join -p 6999 10.255.10.12 1 drbd9-01 10.255.10.11 0 SecretKey

* drbd9-03も同様にadd-node時に表示されたコマンドを実行する

# クラスタの状態確認

    # drbdmanage list-nodes		(list-nodeはnに省略可能)
        +------------------------------------------------------------------------------+
        | Name     | Pool Size | Pool Free |                                   | State |
        +------------------------------------------------------------------------------+
        | drbd9-01 |     16380 |     16376 |                                   |    ok |
        | drbd9-02 |     16380 |     16376 |                                   |    ok |
        | drbd9-03 |     16380 |     16376 |                                   |    ok |
        +------------------------------------------------------------------------------+

    # drbdsetup status
        .drbdctrl role:Secondary
          disk:UpToDate
          drbd9-01 role:Secondary
            peer-disk:UpToDate
          drbd9-02 role:Secondary
            peer-disk:UpToDate


* UpToDateではなくConectingになっている場合はportの開け忘れ、もしくは同期がうまくいっていない可能性がある
  - 前者の場合はportが空いているかチェック
  - 後者の場合はdrbdmanage update-pool もしくは、drbdmanage n を実行してみる

# リソース・ボリュームの作成とデプロイ

1. リソースの確保 
ここでコマンドでリソースが使用するポートを選択できる

        # drbdmanage add-resource backups

2. リソース内に新しいボリュームを作成
この時使用するボリュームのサイズを指定する

        # drbdmanage add-volume backups 5GB

3. リソースをデプロイするクラスタ数を定める

        # drbdmanage deploy-resource backups 3

## 別のデプロイ方法
* ボリュームの確保からデプロイまで一回で行う

        # drbdmanage add-volume backups 5GB --deploy 3

* 割り当てを一つずつ行う
add-volumeした後デプロイ先を手動で選ぶことが可能

        # drbdmanage add-resource backups
        # drbdmanage add-volume backups 5GB
        # drbdmanage assign-resource backups drbd9-01
        # drbdmanage assign-resource backups drbd9-02

# portの確認

すべてのノードで行う

ボリュームが使用するポートの確認

    # drbdmanage list-volumes --groupby Size --show Port
        +------------------------------------------------------------------------------+
        | Name    | Vol ID | Size | Minor | Port |                             | State |
        +------------------------------------------------------------------------------+
        | backups |      0 | 2861 |    10 | 7700 |                             |    ok |
        +------------------------------------------------------------------------------+
もしポートが空いていなければ

    # firewall-cmd --add-port=7700/tcp --zone=public --permanent
    # firewall-cmd --reload


# ファイルシステム作成とマウント

    # drbdmanage list-volumes --groupby Size --show Port
        +------------------------------------------------------------------------------+
        | Name    | Vol ID | Size | Minor | Port |                             | State |
        +------------------------------------------------------------------------------+
        | backups |      0 | 2861 |    10 | 7700 |                             |    ok |
        +------------------------------------------------------------------------------+
    # mke2fs -j /dev/drbd10           (上の表でMinorが10になっているのでdrbd10にファイルシステムを作成する)
    # mkdir -p /mnt/drbd/backups
    # mount /dev/drbd10 /mnt/drbd/backups

## ロール切り替えの確認
* 一言メモ
  - drbd8では、PrimaryとSecondaryの変更を手動で行った後にmountする必要があった
  - drbd9からはmountされているノードが自動的にPrimaryとなる

1. drbd9-01

        # drbdsetup status
            .drbdctrl role:Secondary
             disk:UpToDate
             drbd9-02 role:Secondary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate

           backups role:Primary
             disk:UpToDate
             drbd9-02 role:Secondary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate
        # cd /mnt/drbd/backups
        # なにかファイルを作成

2.drbd9-02

    # mkdir -p /mnt/drbd/backups
    # mount /dev/drbd10 /mnt/drbd
    # drbdsetup status
            .drbdctrl role:Secondary
             disk:UpToDate
             drbd9-01 role:Secondary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate

           backups role:Secondary
             disk:UpToDate
             drbd9-01 role:Primary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate
3.drbd9-01

    # umount /mnt/drbd/backups

4.drbd9-02

    # mount /dev/drbd10 /mnt/drbd/backups
    # drbdsetup status
            .drbdctrl role:Secondary
             disk:UpToDate
             drbd9-01 role:Secondary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate

           backups role:Primary
             disk:UpToDate
             drbd9-01 role:Secondary
               peer-disk:UpToDate
             drbd9-03 role:Secondary
               peer-disk:UpToDate

drbd9-01で作ったファイルが見れるか確認

# おわりに
* DRBD9は、ローカルストレージを持たないDRBD Client、データの再配置等の新機能もありますが、それは[別記事](http://qiita.com/Yuki-Inamoto/items/dcea6e7e8400069d3aef)で紹介したいと思います。