CentOS7.4でDRBD8.4を構築したときのメモです。
構成
項目 | VM1 | VM2 |
---|---|---|
OS | CentOS7.4 | CentOS7.4 |
ソフトウェア | DRBD8.4 | DRBD8.4 |
IPアドレス | 192.168.33.10 | 192.168.33.20 |
同期するディスク | /dev/sdb (5GB) | /dev/sdb (5GB) |
事前作業
以下、手順を実施して、2台構成の準備と同期用のディスクを準備しています。
firewallは本手順実施時は止めています。もしfirewalldが動作している場合はTCPポート7788を許容するように設定する。
手順
/etc/hostsファイルの設定(VM1,VM2で実施)
[root@VM1 ~]# echo "192.168.33.10 VM1" >> /etc/hosts
[root@VM1 ~]# echo "192.168.33.20 VM2" >> /etc/hosts
ELRepoのrepoファイルのインストール(VM1,VM2で実施)
drbdパッケージはELRepoにあるので、ELRepoのrepoファイルを事前にインストールします。
[root@VM1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@VM1 ~]# 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%]
パッケージのインストール(VM1,VM2で実施)
パッケージ(drbd84-utils,kmod-drbd84)をインストールする。
[root@VM1 ~]# yum install -y drbd84-utils
~省略~
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ drbd84-utils.x86_64 0:9.6.0-1.el7.elrepo を インストール
--> 依存性解決を終了しました。
依存性を解決しました
==============================================
Package
アーキテクチャー
バージョン リポジトリー
容量
==============================================
インストール中:
drbd84-utils
x86_64 9.6.0-1.el7.elrepo elrepo 591 k
トランザクションの要約
==============================================
インストール 1 パッケージ
総ダウンロード容量: 591 k
インストール容量: 1.4 M
Downloading packages:
drbd84-utils-9.6.0-1.el7 | 591 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
インストール中 : drbd84-util 1/1
検証中 : drbd84-util 1/1
インストール:
drbd84-utils.x86_64 0:9.6.0-1.el7.elrepo
完了しました!
[root@VM1 ~]# yum install -y kmod-drbd84
~省略~
インストール:
kernel.x86_64 0:3.10.0-957.1.3.el7
kmod-drbd84.x86_64 0:8.4.11-1.1.el7_6.elrepo
更新:
selinux-policy-targeted.noarch 0:3.13.1-229.el7_6.6
依存性を更新しました:
libselinux.x86_64 0:2.5-14.1.el7
libselinux-python.x86_64 0:2.5-14.1.el7
libselinux-utils.x86_64 0:2.5-14.1.el7
libsemanage.x86_64 0:2.5-14.el7
libsemanage-python.x86_64 0:2.5-14.el7
libsepol.x86_64 0:2.5-10.el7
linux-firmware.noarch 0:20180911-69.git85c5d90.el7
policycoreutils.x86_64 0:2.5-29.el7
policycoreutils-python.x86_64 0:2.5-29.el7
selinux-policy.noarch 0:3.13.1-229.el7_6.6
setools-libs.x86_64 0:3.3.8-4.el7
完了しました!
リソースの作成(VM1,VM2で実施)
リソースの設定ファイルを新規に作成します(*.resファイル)。r1はリソース名(任意の名前)を表します。
[root@VM1 ~]# vi /etc/drbd.d/drbd1.res
[root@VM1 ~]# cat /etc/drbd.d/drbd1.res
resource r1 {
device /dev/drbd1;
disk /dev/sdb;
meta-disk internal;
on VM1 {
address 192.168.33.10:7788;
}
on VM2 {
address 192.168.33.20:7788;
}
}
リソースの有効化
####メタデータの作成(VM1,VM2で実施)
この手順は初めてDRBDを起動するときにだけ必要な操作です。
[root@VM1 ~]# drbdadm create-md r1
modinfo: ERROR: Module drbd not found.
modinfo: ERROR: Module drbd not found.
initializing activity log
initializing bitmap (160 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
ERROR: Module drbd not found.
が表示されるが、kernelのupdateの反映がされていないため上記エラーが発生している(と想定された)。一旦、rebootを実施すれば問題なし。
####リソースの有効化(VM1,VM2で実施)
[root@VM1 ~]# drbdadm up r1
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 8699th user to install this version
以上で、drbdのインストールまで完了。次で状態確認してみる。
####状態の確認(VM1 or VM2で実施(どちらでやっても内容変わらず))
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
1: 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:5242684
表示内容の補足
項目 | 表示上の値 | 説明 |
---|---|---|
cs | Connected | 接続状態(両系接続とれている状態になっている。) |
ro | Secondary/Secondary | ノードのロール(左が自ホストで、右が相手ホストの状態を表す。起動した時点では両方Secondary) |
ds | Inconsistent/Inconsistent | ディスク状態( Inconsistentはデータが一致しない状態。新規リソースを作成した直後に(初期フル同期の前に)両方のノードがこの状態になる。) |
データ同期
VM1を同期元、VM2を同期先としてデータレプリケーションします。
が、何もないデータ同期しても意味ないのでスキップします。
*もし、時間がかかってもいいのであればVM1でdrbdadm primary --force r1
を実施すればOK。
初期同期をスキップ(VM1で実施)
[root@VM1 ~]# drbdadm new-current-uuid --clear-bitmap r1/0
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate 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:0
dsがUpToDate/UpToDate
になっているので同期完了。
VM1のPrimary昇格(VM1で実施)
[root@VM1 ~]# drbdadm primary r1
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:0 nr:0 dw:0 dr:2096 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
ro:Secondary/Secondary
からro:Primary/Secondary
に変わる。なお、Secondary側でcat /proc/drbd
実行するとro:Secondary/Primary
となります。
また、この段階でPrimaryになったサーバは/dev/drbd1
が作成される。/dev/drbd1
はブロックストレージのように使用できるのでフォーマットを実施して使えるようにする。
ファイルシステム作成(VM1で実施)
[root@VM1 ~]# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1 isize=512 agcount=4, agsize=327668 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310671, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
動作確認してみる!
VM1(primary)でテスト用ファイルの作成
drbd1デバイスをマウント
[root@VM1 ~]# mount /dev/drbd1 /mnt/
マウントしたデバイスに作成したファイルにデータを書き込む。
[root@VM1 ~]# echo 12345 > /mnt/test.txt
[root@VM1 ~]# cat /mnt/test.txt
12345
primaryをVM2に変更
drbd1デバイスをアンマウント
[root@VM1 ~]# umount /mnt/
VM1をsecondaryに変更
[root@VM1 ~]# drbdadm secondary r1
[root@VM1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55
1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:12692 nr:0 dw:12692 dr:5283 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
VM2をprimaryに変更
[root@VM2 ~]# drbdadm primary r1
drbd1デバイスをマウント
[root@VM2 ~]# mount /dev/drbd1 /mnt/
VM1で書き込んだデータがVM2でも読み込めることを確認する。
[root@VM2 ~]# cat /mnt/test.txt
12345