UnuntuでZFSを使ってみよう第6回「DRBDでZFS ボリュームを同期する」
前回では、ZFSのファイルシステムやボリュームを作成する方法を説明しました。今回は、Ubuntuという部分を全面に出して、DRBDで2つのサーバ間のZFSボリュームを動悸する方法を紹介したいと思います。
DRBDとは
DRBD(Distributed Replicated Block Device)は、TCP/IPネットワークを通じて複数のサーバ間のHDD(パーティション)をミラーリング(複製)するソフトウェアで、HAクラスタでのディスク同期によく使用されます。DRBDは主なLinuxディストリビューションのみをサポートし、SolarisやBSD系のOSをサポートしません。
DRBDのインストール
今回Ubuntu18.04へインストールする際に、LinbitのDRBD9 stackを使用します。2台のUbuntu18.04+ZFSを用意し、以下の手順でPPAの追加、およびDRBDとlinstorというストレージの構成管理システムをインストールします。
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt update
sudo apt install -y drbd-utils python-drbdmanage drbd-dkms
sudo apt install -y linstor-client linstor-controller linstor-satellite
今回は、以下の構成としています。
ホスト名 | IPアドレス |
---|---|
ubuntu-zfs01 | 192.168.33.12 |
ubuntu-zfs02 | 192.168.33.13 |
また、以下の設定を上記2台のホストに実施します。
- rootユーザでの相互sshログオン可能な状態にする
- zfsとしてrpool/vol01 というZFSファイルシステムを作成する
DRBDの設定
ubuntu-zfs01で以下の動作を行い、ノードの設定を行います。初期状態ではノードが登録されていないので、用意した2台を追加します。SATELLITEが、ディスクを提供するノードになります。
vagrant@ubuntu-zfs01:~$ sudo systemctl enable linstor-controller linstor-satellite
vagrant@ubuntu-zfs01:~$ sudo systemctl start linstor-controller linstor-satellite
vagrant@ubuntu-zfs01:~$ sudo linstor node list
╭─────────────────────────────────────╮
┊ Node ┊ NodeType ┊ Addresses ┊ State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
╰─────────────────────────────────────╯
vagrant@ubuntu-zfs01:~$ sudo linstor node create ubuntu-zfs01 192.168.33.12
SUCCESS:
Description:
New node 'ubuntu-zfs01' registered.
Details:
Node 'ubuntu-zfs01' UUID is: c15cd3b8-e08f-41e4-a5a0-1c1df97a185b
vagrant@ubuntu-zfs01:~$ sudo linstor node list
╭────────────────────────────────────────────────────────────────╮
┊ Node ┊ NodeType ┊ Addresses ┊ State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ ubuntu-zfs01 ┊ SATELLITE ┊ 192.168.33.12:3366 (PLAIN) ┊ Online ┊
╰────────────────────────────────────────────────────────────────╯
vagrant@ubuntu-zfs01:~$ sudo linstor node create ubuntu-zfs02 192.168.33.13
SUCCESS:
Description:
New node 'ubuntu-zfs02' registered.
Details:
Node 'ubuntu-zfs02' UUID is: ed14435e-66ca-4eb3-b268-1ca4180c7499
vagrant@ubuntu-zfs01:~$ sudo linstor node list
╭────────────────────────────────────────────────────────────────╮
┊ Node ┊ NodeType ┊ Addresses ┊ State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ ubuntu-zfs01 ┊ SATELLITE ┊ 192.168.33.12:3366 (PLAIN) ┊ Online ┊
┊ ubuntu-zfs02 ┊ SATELLITE ┊ 192.168.33.13:3366 (PLAIN) ┊ Online ┊
╰────────────────────────────────────────────────────────────────╯
次に、ストレージプールpool1とボリュームvol1を追加します。
vagrant@ubuntu-zfs01:~$ sudo linstor storage-pool create zfs ubuntu-zfs01 pool1 rpool/vol01
SUCCESS:
Description:
New storage pool 'pool1' on node 'ubuntu-zfs01' registered.
Details:
Storage pool 'pool1' on node 'ubuntu-zfs01' UUID is: 29d195a9-edbb-42ab-b7c8-b9b3f109fd39
SUCCESS:
(ubuntu-zfs01) Changes applied to storage pool 'pool1'
vagrant@ubuntu-zfs01:~$ sudo linstor storage-pool create zfs ubuntu-zfs02 pool1 rpool/vol01
SUCCESS:
Description:
New storage pool 'pool1' on node 'ubuntu-zfs02' registered.
Details:
Storage pool 'pool1' on node 'ubuntu-zfs02' UUID is: efdf13da-defc-4487-bffe-853135f767cb
SUCCESS:
(ubuntu-zfs02) Changes applied to storage pool 'pool1'
vagrant@ubuntu-zfs01:~$ sudo linstor storage-pool list
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool ┊ Node ┊ Driver ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ SupportsSnapshots ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ pool1 ┊ ubuntu-zfs01 ┊ ZfsDriver ┊ rpool/vol01 ┊ 8.35 GiB ┊ 9.94 GiB ┊ true ┊
┊ pool1 ┊ ubuntu-zfs02 ┊ ZfsDriver ┊ rpool/vol01 ┊ 8.40 GiB ┊ 9.94 GiB ┊ true ┊
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
vagrant@ubuntu-zfs01:~$ sudo linstor volume-definition create vol1 1g
SUCCESS:
New volume definition with number '0' of resource definition 'vol1' created.
vagrant@ubuntu-zfs01:~$ sudo linstor resource create vol1 --auto-place 2
SUCCESS:
Description:
Resource 'vol1' successfully autoplaced on 2 nodes
Details:
Used storage pool: 'pool1'
Used nodes: 'ubuntu-zfs02', 'ubuntu-zfs01'
SUCCESS:
Created resource 'vol1' on 'ubuntu-zfs02'
SUCCESS:
Created resource 'vol1' on 'ubuntu-zfs01'
SUCCESS:
Description:
Resource 'vol1' on 'ubuntu-zfs02' ready
Details:
Auto-placing resource: vol1
SUCCESS:
Description:
Resource 'vol1' on 'ubuntu-zfs01' ready
Details:
Auto-placing resource: vol1
vagrant@ubuntu-zfs01:~$ sudo linstor resource list
╭────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node ┊ Port ┊ Usage ┊ State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ vol1 ┊ ubuntu-zfs01 ┊ 7000 ┊ Unused ┊ UpToDate ┊
┊ vol1 ┊ ubuntu-zfs02 ┊ 7000 ┊ Unused ┊ UpToDate ┊
╰────────────────────────────────────────────────────────╯
po1GBのvol1というリソースを作成したため、/dev/drbd1000 というデバイスが作成されました。
Primaryがubuntu-zfs01なので、/dev/drbd1000 はubuntu-zfs01から操作可能です。ubuntu-zfs02からはデバイスとして認識されません。
vagrant@ubuntu-zfs01:~$ drbdadm status
vol1 role:Primary
disk:UpToDate
ubuntu-zfs02 role:Secondary
peer-disk:UpToDate
vagrant@ubuntu-zfs01:~$ ls -l /dev/drbd1000
brw-rw---- 1 root disk 147, 1000 Mar 10 04:10 /dev/drbd1000
vagrant@ubuntu-zfs01:~$ sudo fdisk -l /dev/drbd1000
Disk /dev/drbd1000: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 8192 bytes
I/O size (minimum/optimal): 8192 bytes / 8192 bytes
vagrant@ubuntu-zfs02:~$ sudo fdisk -l /dev/drbd1000
fdisk: cannot open /dev/drbd1000: Wrong medium type
ファイルシステムの作成と同期の確認
作成したデバイスをxfsでmkfsしてマウントし、ファイルが書き込めることが確認できました。
vagrant@ubuntu-zfs01:~$ sudo mkfs.xfs /dev/drbd1000
specified blocksize 4096 is less than device physical sector size 8192
switching to logical sector size 512
meta-data=/dev/drbd1000 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=0, rmapbt=0, reflink=0
data = bsize=4096 blocks=262144, 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
vagrant@ubuntu-zfs01:~$ sudo mkdir /mnt/drbd
vagrant@ubuntu-zfs01:~$ sudo mount /dev/drbd1000 /mnt/drbd/
vagrant@ubuntu-zfs01:~$ df -h /mnt/drbd/
Filesystem Size Used Avail Use% Mounted on
/dev/drbd1000 1014M 34M 981M 4% /mnt/drbd
vagrant@ubuntu-zfs01:~$ sudo touch /mnt/drbd/a
vagrant@ubuntu-zfs01:~$ ls -l /mnt/drbd/a
ls -l /mnt/drbd/a
-rw-r--r-- 1 root root 0 Mar 10 04:31 /mnt/drbd/a
それでは、ubuntu-zfs02へ切り替えてみます。手動でumountし、drbdadmでsecondary/primaryを切り替えます。
vagrant@ubuntu-zfs01:~$ sudo umount /mnt/drbd
vagrant@ubuntu-zfs01:~$ sudo drbdadm secondary vol1
vagrant@ubuntu-zfs02:~$ sudo drbdadm primary vol1
vagrant@ubuntu-zfs02:~$ sudo mount /dev/drbd1000 /mnt/drbd/
vagrant@ubuntu-zfs02:~$ sudo ls -l /mnt/drbd
total 0
-rw-r--r-- 1 root root 0 Mar 10 04:31 a
vagrant@ubuntu-zfs02:~$ sudo ls -l /mnt/drbd
total 0
-rw-r--r-- 1 root root 0 Mar 10 04:31 a
-rw-r--r-- 1 root root 0 Mar 10 04:32 b
これで、ubuntu-zfs02でもvol1をマウントし、書き込めることが確認できました。ubuntu-zfs01へvol1を戻すときは、逆の手順を行うだけです。
vagrant@ubuntu-zfs02:~$ sudo umount /mnt/drbd
vagrant@ubuntu-zfs02:~$ sudo drbdadm secondary vol1
vagrant@ubuntu-zfs01:~$ sudo drbdadm primary vol1
vagrant@ubuntu-zfs01:~$ sudo mount /dev/drbd1000 /mnt/drbd/
vagrant@ubuntu-zfs01:~$ sudo ls -l /mnt/drbd/
total 0
-rw-r--r-- 1 root root 0 Mar 10 04:31 a
-rw-r--r-- 1 root root 0 Mar 10 04:32 b
DRBDとZFS
既にDRBDでは、ZFSをサポートしていることがわかったと思います。今回はDRBDの切替動作を手動で行いましたが、通常DRBDの切替動作はHeartbeatなどのHAクラスタソフトにより実施されます。DRBDには他にも様々な動作を行うことができますので、その詳細についてはLINBITのユーザガイドを参照ください。
次回からは、またZFSの機能について説明したいと思いますのでお楽しみに。
さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス
https://kusanagi.dht-jpn.co.jp/solutions/dht-oss-consulting/