DRBD(Distributed Replicated Block Device)
本家様 https://www.linbit.com/drbd/
複数のサーバ間でブロックデバイスの同期がとれる. 片方のデバイスに変更が加えられたら、その変更を他のサーバにも波及させ同期させる.
バックアップではない. サーバ間でデバイスがミラーされている感じかな. ファイルシステムベースの rsync や lsyncd な代物.
DRBDをグーグル先生に画像検索掛けると容易にわかるかと思いうが、こんな感じで
プライマリーとなっている計算機のストレージの変更が、即座にセカンダリーにも波及する. 波及先は1台でも2台でも構わない.(31台までみたい)
ここでは基本的な組み合わせで試してみた.
2台構成でsystem部分となる8GB(/dev/sda)以外にDRBDの対象として16GB(/dev/sdb)を用意した(vmware esxiで)
OSはCentOS7です
マシン名 | OS | system領域 | ipアドレス | 対象領域 |
drbd1 | CentOS7.7 | 8GB(/dev/sda) | 192.168.0.98 | /dev/sdb, 16GB |
drbd2 | 8GB(/dev/sda) | 192.168.0.99 | /dev/sdb, 16GB |
pkgs.orgに伺うとepelにパッケージがあるのですが、古い...なので ELRepo リポジトリで作ってみる
[root@drbd1 ~]# yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
[root@drbd1 ~]# yum search drbd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* elrepo: ftp.ne.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
============================================= N/S matched: drbd ==============================================
drbd84-utils.x86_64 : Management utilities for DRBD
drbd84-utils-sysvinit.x86_64 : The SysV initscript to manage the DRBD.
drbd90-utils.x86_64 : Management utilities for DRBD
drbd90-utils-sysvinit.x86_64 : The SysV initscript to manage the DRBD.
kmod-drbd84.x86_64 : drbd84 kernel module(s)
kmod-drbd90.x86_64 : drbd90 kernel module(s)
Name and summary matches only, use "search all" for everything.
[root@drbd1 ~]#
ここでは DRBDのversion9系を使いたいので「drbd90-utils」をインストールします
[root@drbd1 ~]# yum info drbd90-utils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* elrepo: ftp.ne.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
Available Packages
Name : drbd90-utils
Arch : x86_64
Version : 9.12.2
Release : 1.el7.elrepo
Size : 720 k
Repo : elrepo
Summary : Management utilities for DRBD
URL : http://www.drbd.org/
License : GPLv2+
Description : DRBD mirrors a block device over the network to another machine.
: Think of it as networked raid 1. It is a building block for
: setting up high availability (HA) clusters.
:
: This packages includes the DRBD administration tools and integration
: scripts for heartbeat, pacemaker, rgmanager and xen.
[root@drbd1 ~]#
[root@drbd1 ~]# yum install drbd90-utils kmod-drbd90
インストール直後はdrbdのデーモンは動いてなく、またboot時起動にもなってない. またカーネルモジュールも読み込まれていない.
[root@drbd1 ~]# systemctl list-unit-files | grep drbd
drbd.service disabled
[root@drbd1 ~]# lsmod |grep drbd | wc -l
0
[root@drbd1 ~]#
現状のストレージ構成は下記のような感じ
[root@drbd1 ~]# cat /proc/partitions
major minor #blocks name
2 0 4 fd0
8 0 8388608 sda
8 1 524288 sda1
8 2 1048576 sda2
8 3 6814720 sda3
8 16 16777216 sdb
11 0 1048575 sr0
[root@drbd1 ~]#
https://www.linbit.com/drbd-user-guide/drbd-guide-9_0-ja/を拝読して、「/etc/drbd.d/r0.res」を下記のように作成します
https://blog.drbd.jp/drbd-users-guide-9.0/drbd-users-guide.htmlの方が分かりやすいかな
resource r0 {
device /dev/drbd1;
disk /dev/sdb;
meta-disk internal;
on drbd1 {
address 192.168.0.98:7789;
}
on drbd2 {
address 192.168.0.99:7789;
}
net {
protocol C;
}
}
その後、メタデータを作る. これは各ノードで1回だけでいい.
「/etc/drbd.d/r0.res」にて「meta-disk internal;」としたので「/dev/sdb」に書かれる.
[root@drbd1 ~]# drbdadm create-md r0
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v09 flexible-size internal meta data block
already in place on /dev/sdb at byte offset 17179865088
Do you really want to overwrite the existing meta-data?
[need to type 'yes' to confirm] yes
md_offset 17179865088
al_offset 17179832320
bm_offset 17179308032
Found xfs filesystem
16776668 kB data area apparently used
16776668 kB left usable by current configuration
Even though it looks like this would place the new meta data into
unused space, you still need to confirm, as this is only a guess.
Do you want to proceed?
[need to type 'yes' to confirm] yes
initializing activity log
initializing bitmap (512 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
[root@drbd1 ~]#
この時にDRBDのカーネルモジュールが同時にロードされるみたい. drbdデーモンはまだ動いていない.
[root@drbd1 ~]# lsmod |grep drbd
drbd 573100 0
libcrc32c 12644 4 xfs,drbd,nf_nat,nf_conntrack
[root@drbd1 ~]# ps -ef |grep drbd | grep -v grep
root 8747 2 0 21:01 ? 00:00:00 [drbd-reissue]
[root@drbd1 ~]# systemctl status drbd
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@drbd1 ~]#
次に、このリソースをupする
[root@drbd1 ~]# drbdadm up r0
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 4836th user to install this version
[root@drbd1 ~]# ps -ef |grep drbd | grep -v grep
root 8747 2 0 21:01 ? 00:00:00 [drbd-reissue]
root 8769 2 0 21:04 ? 00:00:00 [drbd_w_r0]
root 8771 2 0 21:04 ? 00:00:00 [drbd1_submit]
root 8777 2 0 21:04 ? 00:00:00 [drbd_s_r0]
root 8784 2 0 21:04 ? 00:00:00 [drbd_r_r0]
[root@drbd1 ~]# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
drbd2 connection:Connecting
[root@drbd1 ~]#
片方の設定が終わったらもう片方(rdbd2)も同じように「/etc/drbd.d/r0.res」を作って下記を実行する.
[root@drbd2 ~]# drbdadm create-md r0
[root@drbd2 ~]# drbdadm up r0
だが両サイト共に
[root@drbd1 ~]# drbdadm status r0 [root@drbd2 ~]# drbdadm status r0
r0 role:Secondary r0 role:Secondary
disk:Inconsistent disk:Inconsistent
drbd2 connection:Connecting drbd1 connection:Connecting
[root@drbd1 ~]# [root@drbd2 ~]#
と「Secondary」状態だが「connection:Connecting」で互いが見えていない.
原因はfirewall.
っで修正を加えます. *単にfirewallを止めてしまえばいいのかもしれないけど...
[root@drbd1 ~]# firewall-cmd --get-active-zones
public
interfaces: ens32 <-- publicゾーンのみで、インターフェースは ens32
(詳細確認)
[root@drbd1 ~]# firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client ssh <--- dhcpのv6とsshのみ許されている
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
(/etc/drbd.d/r0.resのport番号 7789 を許可させる)
[root@drbd1 ~]# firewall-cmd --add-port=7789/tcp --zone=public --permanent
success
[root@drbd1 ~]# firewall-cmd --reload
もう片方も同じように 7789/tcp を有効にします
そうすると
[root@drbd1 ~]# drbdadm status r0 [root@drbd2 ~]# drbdadm status r0
r0 role:Secondary r0 role:Secondary
disk:Inconsistent disk:Inconsistent
drbd2 role:Secondary drbd1 role:Secondary
peer-disk:Inconsistent peer-disk:Inconsistent
[root@drbd1 ~]# [root@drbd2 ~]#
となる. ならない場合は、片方で「drbdadm up r0」を再実行する
現状まだ同期は取られていない.
次に片方を「Primary」にするのだが、同期元で下記を実行すれば、そこからSecondaryにデータが流れる.
今回は初回、そして初めて作った領域なので転送もないのだろうが
[root@drbd1 ~]# drbdadm primary --force r0
[root@drbd1 ~]# drbdadm status r0
r0 role:Primary
disk:UpToDate
drbd2 role:Secondary
replication:SyncSource peer-disk:Inconsistent done:7.65
[root@drbd1 ~]#
「replication:SyncSource」とdrbd1側が「source」となってる。
他方のdrbd2側は
[root@drbd2 ~]# drbdadm status r0
r0 role:Secondary
disk:Inconsistent
drbd1 role:Primary
replication:SyncTarget peer-disk:UpToDate done:35.22
[root@drbd2 ~]#
と「replication:SyncTarget」と「Target」となっている.
暫くすると同期が完了して
[root@drbd1 ~]# drbdadm status r0 [root@drbd2 ~]# drbdadm status r0
r0 role:Primary r0 role:Secondary
disk:UpToDate disk:UpToDate
drbd2 role:Secondary drbd1 role:Primary
peer-disk:UpToDate peer-disk:UpToDate
[root@drbd1 ~]# [root@drbd2 ~]#
となる.
ここで対象デバイスをフォーマットするのだが、対象は/dev/sdbではなく、/dev/drbd1である。
この/dev/drbd1をフォーマットしてmountする.
[root@drbd1 ~]# mkfs.xfs -f /dev/drbd1
[root@drbd1 ~]# mount /dev/drbd1 /opt
[root@drbd1 ~]# df -lTh
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 909M 0 909M 0% /dev
tmpfs tmpfs 920M 0 920M 0% /dev/shm
tmpfs tmpfs 920M 8.8M 911M 1% /run
tmpfs tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda3 xfs 6.5G 1.3G 5.3G 20% /
/dev/sda1 xfs 509M 173M 336M 34% /boot
tmpfs tmpfs 184M 0 184M 0% /run/user/0
/dev/drbd1 xfs 16G 33M 16G 1% /opt
[root@drbd1 ~]#
とうまく行ったみたい.
っでファイルを作ってみる
[root@drbd1 ~]# cd /
[root@drbd1 /]# tar cf /opt/etc.tar ./etc/
[root@drbd1 /]# ls -l /opt/
total 28612
-rw-r--r--. 1 root root 29296640 May 26 12:41 etc.tar
[root@drbd1 /]# stat /opt/etc.tar
File: ‘/opt/etc.tar’
Size: 29296640 Blocks: 57224 IO Block: 4096 regular file
Device: 9301h/37633d Inode: 67 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2020-05-26 12:41:32.176544862 +0900
Modify: 2020-05-26 12:41:34.849593767 +0900
Change: 2020-05-26 12:41:34.849593767 +0900
Birth: -
[root@drbd1 /]#
次に drbd1 をsecondaryに、drbd2を primary にしてみる
[root@drbd1 ~]# umount /opt
[root@drbd1 ~]# drbdadm secondary r0
[root@drbd1 ~]# drbdadm status r0
r0 role:Secondary
disk:UpToDate
drbd2 role:Secondary
peer-disk:UpToDate
[root@drbd1 ~]#
[root@drbd2 ~]# drbdadm primary r0
[root@drbd2 ~]# mount /dev/drbd1 /opt/
[root@drbd2 ~]# stat /opt/etc.tar
File: ‘/opt/etc.tar’
Size: 29296640 Blocks: 57224 IO Block: 4096 regular file
Device: 9301h/37633d Inode: 67 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2020-05-26 12:41:32.176544862 +0900
Modify: 2020-05-26 12:41:34.849593767 +0900
Change: 2020-05-26 12:41:34.849593767 +0900
Birth: -
[root@drbd2 ~]#
statコマンドで同じと確認された.
drbdのサービスを読むと
[root@drbd1 ~]# systemctl status drbd.service
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@drbd1 ~]#
とある。クラスターマネージャは使ってないので、「enable」にして再起動します
systemctl enable drbd.service ; reboot
再起動後、「drbdadm status r0」で状態を調べると
[root@drbd1 ~]# drbdadm status r0 [root@drbd2 ~]# drbdadm status r0
r0 role:Secondary r0 role:Secondary
disk:Diskless disk:Diskless
[root@drbd1 ~]# [root@drbd2 ~]#
どちらも「Secondary」
っでDisklessなので「drbdadm attach r0」つなげてみる
[root@drbd1 ~]# drbdadm attach r0 [root@drbd2 ~]# drbdadm attach r0
[root@drbd1 ~]# drbdadm status r0 [root@drbd2 ~]# drbdadm status r0
r0 role:Secondary r0 role:Secondary
disk:UpToDate disk:UpToDate
[root@drbd1 ~]# [root@drbd2 ~]#
そして、どちらかをprimaryにする
[root@drbd1 ~]# drbdadm primary r0
[root@drbd1 ~]# drbdadm status r0
r0 role:Primary
disk:UpToDate
[root@drbd1 ~]# mount /dev/drbd1 /opt/
[root@drbd1 ~]# ls -l /opt/
total 28612
-rw-r--r--. 1 root root 29296640 May 26 12:41 etc.tar
[root@drbd1 ~]# stat /opt/etc.tar
File: ‘/opt/etc.tar’
Size: 29296640 Blocks: 57224 IO Block: 4096 regular file
Device: 9301h/37633d Inode: 67 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2020-05-26 12:41:32.176544862 +0900
Modify: 2020-05-26 12:41:34.849593767 +0900
Change: 2020-05-26 12:41:34.849593767 +0900
Birth: -
[root@drbd1 ~]#
再起動するとSecondaryのままで、手動で接続、Primaryにして、mount
こうしないとダメなのかは不明.
っが一応これで行けるみたい