Web更新

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-zfs01192.168.33.12
ubuntu-zfs02192.168.33.13

また、以下の設定を上記2台のホストに実施します。

  1. rootユーザでの相互sshログオン可能な状態にする
  2. 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/

関連記事一覧