drbd
centos7

DRBD8.4の構築手順

1 環境

VMware Workstation 12 Player上の仮想マシンを使いました。
仮想マシンは2台です。それぞれのホスト名は、drbd1 ,drbd2です。
/dev/sdbをdrbdのテスト用のデバイスとして追加しました。

構成
      +---- drbd1 ----+               +---- drbd2 ----+
      |  (CentOS7.3)  |               |  (CentOS7.3)  |
      |               |               |               |
      |               |               |               |
      |   /dev/sda    |               |   /dev/sda    |
      |   /dev/sdb    |               |   /dev/sdb    |
      |               |               |               |
      +----- eth0 ----+               +----- eth0 ----+
              | .50                            | .60
              |                                |
              |                                |
      -------------------------------------------------
                        192.168.0.0/24
OS版数
[root@drbd1 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@drbd1 ~]# uname -r
3.10.0-514.el7.x86_64

2 事前準備

2.1 仮想マシンにディスクの追加(drbd1,drbd2で実施)

私の場合、
「仮想マシン設定の編集(D)」->「追加(A)」->「ハードディスクの追加」->「SCSI(s) (推奨)」
->「仮想ディスクの新規作成(V)」-> 「仮想ディスクを単一ファイルとして格納(O)」を実行して、
ディスク(★)を追加しました。

[root@drbd1 ~]# lsblk -pi
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
/dev/sda      8:0    0   20G  0 disk
|-/dev/sda1   8:1    0    1G  0 part /boot
|-/dev/sda2   8:2    0    1G  0 part [SWAP]
`-/dev/sda3   8:3    0   18G  0 part /
/dev/sdb      8:16   0    2G  0 disk ★
/dev/sr0     11:0    1  4.1G  0 rom

2.2 /etc/hostsファイルの設定(drbd1,drbd2で実施)

[root@drbd1 ~]# cat /etc/hosts
192.168.0.50 drbd1
192.168.0.60 drbd2

2.3 ELRepoのrepoファイルのインストール(drbd1,drbd2で実施)

drbdパッケージはELRepoにあるので、ELRepoのrepoファイルを事前にインストールします。
ELRepoのインストールはここを参照しました。

[root@drbd1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@drbd1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm を取得中
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]

[root@drbd1 ~]# yum clean all
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo: ftp.ne.jp
リポジトリー ID                リポジトリー名                                                                 状態
elrepo                         ELRepo.org Community Enterprise Linux Repository - el7                        222
repolist: 222

2.4 パッケージのインストール(drbd1,drbd2で実施)

パッケージ(drbd84-utils,kmod-drbd84)をインストールする。
私の環境では、最新のkmod-drbd84(8.4.10)をインストールしようとすると、依存関係のエラーがでたため、
1つ古い版数のkmod-drbd84(8.4.9)をインストールしました。

[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo install drbd84-utils-8.9.8-1.el7.elrepo
[root@drbd1 ~]# rpm -qa drbd84-utils
drbd84-utils-8.9.8-1.el7.elrepo.x86_64

[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo install kmod-drbd84-8.4.9-1.el7.elrepo
[root@drbd1 ~]# rpm -qa kmod-drbd84
kmod-drbd84-8.4.9-1.el7.elrepo.x86_64

なお、ELRepoリポジトリに含まれているパッケージ一覧の表示方法は以下のとおりです。
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo --showduplicates list kmod-drbd84
[root@drbd1 ~]# yum --disablerepo=* --enablerepo=elrepo --showduplicates list drbd84-utils

2.5 リソースの作成(drbd1,drbd2で実施)

リソースの設定ファイルを作成する。
r0はリソース名を表します。任意の名前を付けることができます。
[root@drbd1 ~]# vi /etc/drbd.d/test.res
[root@drbd1 ~]# cat /etc/drbd.d/test.res
resource r0 {
  device    /dev/drbd0;
  disk      /dev/sdb;
  meta-disk internal;
  on drbd1 {
    address   192.168.0.50:7788;
  }
  on drbd2 {
    address   192.168.0.60:7788;
  }
}

2.6 7788番ポートへのアクセス許可(drbd1,drbd2で実施)

マニュアル(5.2. Preparing your network configuration)によると、DRBDは7788番ポート以上を使用するようです。

In terms of local firewall considerations, it is important to understand that DRBD (by convention) uses TCP ports
from 7788 upwards, with every resource listening on a separate port. DRBD uses two TCP connections for every
resource configured. For proper DRBD functionality, it is required that these connections are allowed by your
firewall configuration.

7788番ポートへのアクセスを許可する。
[root@drbd1 ~]# firewall-cmd --add-port=7788/tcp
success

パーマネントルールに追加する。
[root@drbd1 ~]# firewall-cmd --runtime-to-permanent
success

3 リソースの有効化

3.1 メタデータの作成(drbd1,drbd2で実施)

[root@drbd1 ~]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success

[root@drbd2 ~]# drbdadm create-md r0
-以下、略-

3.2 リソースの有効化(drbd1,drbd2で実施)

[root@drbd1 ~]# drbdadm up r0
[root@drbd2 ~]# drbdadm up r0

3.3 状態の確認

マニュアルによると、この時点では、ディスクの状態がInconsistent/Inconsistent(★)になっているようです。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Secondary/Secondary ds:★Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10485404

4 デバイスの初期同期

4.1 同期元の選択

今回は、drbd1を同期元に選択します。
つまり、drbd1からdrbd2にデータのレプリケーション(複製)が行われることを意味します。

4.2 初期フル同期の開始(drbd1で実施)

ここでは、同期元に選択した仮想マシンで実行します。

[root@drbd1 ~]# drbdadm primary --force r0

4.3 同期中の状態確認

/proc/drbdを参照すると、同期中の状態が確認できます。

drbd1の状態を確認する。drbd1は"SyncSource"になっていることがわかる。
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:★SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:240496 nr:0 dw:0 dr:241408 al:8 bm:0 lo:0 pe:4 ua:0 ap:0 ep:1 wo:f oos:1857436
        [=>..................] sync'ed: 11.6% (1857436/2097052)K
        finish: 0:04:38 speed: 6,660 (5,572) K/sec


drbd2の状態を確認する。drbd2は"SyncTarget"になっていることがわかる。
[root@drbd2 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:★SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:225220 dw:225220 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1871832
        [=>..................] sync'ed: 11.0% (1871832/2097052)K
        finish: 0:04:33 speed: 6,824 (5,492) want: 9,120 K/sec

4.4 同期完了後の状態確認

[root@drbd1 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2097052 nr:0 dw:0 dr:2097964 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@drbd2 ~]# cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:2097052 dw:2097052 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

5 drbdサービスの起動(drbd1,drbd2で実施)

[root@drbd1 ~]# systemctl start drbd.service
[root@drbd2 ~]# systemctl start drbd.service

6 リソースのアタッチ(drbd1,drbd2で実施)

[root@drbd1 ~]# drbdadm attach r0
[root@drbd2 ~]# drbdadm attach r0

7 ファイルシステムの作成(drbd1で実施)

[root@drbd1 ~]# mkfs.ext4 /dev/drbd0

8 動作確認

8.1 drbd1(primary)でテスト用ファイルの作成

drbd0デバイスをマウントする。
[root@drbd1 ~]# mount /dev/drbd0 /mnt/

マウントしたデバイスに作成したファイルにデータを書き込む。
[root@drbd1 ~]# echo 12345 > /mnt/test.txt
[root@drbd1 ~]# cat /mnt/test.txt
12345

8.2 primaryをdrbd2に変更

drbd1のデバイスをアンマウントする。
[root@drbd1 ~]# umount /mnt/

drbd1をsecondaryに変更
[root@drbd1 ~]# drbdadm secondary r0


drbd2をprimaryに変更
[root@drbd2 ~]# drbdadm primary r0
[root@drbd2 ~]# mount /dev/drbd0 /mnt/

drbd1で書き込んだデータを確認する。正しく読めたことがわかる。
[root@drbd2 ~]# cat /mnt/test.txt
12345

[root@drbd2 ~]# echo 67890 > /mnt/test.txt
[root@drbd2 ~]# cat /mnt/test.txt
67890

8.3 primaryをdrbd1に変更(元に戻す)

[root@drbd2 ~]# umount /mnt/
[root@drbd2 ~]# drbdadm secondary r0

[root@drbd1 ~]# drbdadm primary r0
[root@drbd1 ~]# mount /dev/drbd0 /mnt/

drbd2で書き込んだデータを確認する。正しく読めたことがわかる。
[root@drbd1 ~]# cat /mnt/test.txt
67890

X 参考情報

DRBD:公式サイト
DRBD:wikipedia
DRBD設定ファイル
DRBDの日本語解説
DRBD構築支援サービスとは
DRBD導入検証
DRBDで行こう!

DRBDとPacemakerによるLinux-HA環境
第8章 DRBDとPacemakerクラスタ
★障害時にサブサーバへ自動で切り替える「高可用性WordPressシステム」の作り方 後編 (1/3)