DRBD9クラスタを組もうとしたらハマってしまったメモ。
はじめに:ざっくりDRBDとは
複数のサーバ間でブロックデバイスをミラーリングする分散ストレージシステム。
コア機能はカーネルモジュールとして実装されている。
単体ではあまり使われず、Pacemaker等のクラスタ管理ソフトウェアと組み合わせて使うのが一般的。
DRBD 8.4 → 9.0 で大幅な機能追加が行われた。
何が起きたか
公式ドキュメントに従ってDRBD9のパッケージを入れたのにDRBD9の機能が使えない。
環境:
Ubuntu 20.04 on Vagrant (Box: bento/ubuntu-20.04 (virtualbox, 202107.28.0))
やったこと:
# DRBD9インストール
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt update
sudo apt install drbd-utils drbd-dkms
# resource作成
cat << EOS | tee /etc/drbd.d/r01.res
resource r01 {
protocol C;
meta-disk internal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on node1 {
disk /dev/vg01/lvdrbd;
address 192.168.222.91:7789;
}
on node2 {
disk /dev/vg01/lvdrbd;
address 192.168.222.92:7789;
}
on node3 {
disk /dev/vg01/lvdrbd;
address 192.168.222.93:7789;
}
}
EOS
# カーネルモジュールをロード
sudo modprobe drbd
# resourceのメタデータを作成
sudo drbdadm create-md r01
#> initializing activity log
#> initializing bitmap (32 KB) to all zero
#> Writing meta data...
#> New drbd meta data block successfully created.
#> success
# resource up
sudo drbdadm up r01
#> /etc/drbd.d/r01.res:1: in resource r01:
#> There are multiple host sections for the peer node.
リソース起動時に設定ファイルがおかしいと怒られた。
解決に至るまで
3ノード以上での構成はDRBD9からサポートされた機能で、DRBD8.4以前では2ノードまでの構成でしかリソースを作成できない。
また、試しに2ノード構成の設定に書き換えてみるとエラーは発生しなかった。つまり何らかの理由で8.4系のDRBDが内部で動いていることになる。
ということでバージョンを確認してみる。
drbdadm --version
#> DRBDADM_BUILDTAG=GIT-hash:\ 856c13e97e974f8e0dec77dd3738372d4c234d2e\ build\ by\ buildd@lgw01-amd64-029\,\ 2021-11-19\ 09:10:27
#> DRBDADM_API_VERSION=1
#> DRBD_KERNEL_VERSION_CODE=0x08040b
#> DRBDADM_VERSION_CODE=0x091301
#> DRBDADM_VERSION=9.19.1
drbdadmはok
cat /proc/drbd
#> version: 8.4.11 (api:1/proto:86-101)
#> srcversion: FC3433D849E3B88C1E7B55C
#>
#> 1: cs:StandAlone ro:Secondary/Unknown ds:Inconsistent/DUnknown r----s
#> 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:1044412
動作中のDRBDカーネルモジュールがどういうわけか8.4になっている。
ので、今度はカーネルモジュールの依存関係やら提供元パッケージを調べてみる。
modprobe -D drbd
#> builtin crc32c_intel
#> builtin crc32c_generic
#> insmod /lib/modules/5.4.0-80-generic/kernel/lib/libcrc32c.ko
#> insmod /lib/modules/5.4.0-80-generic/kernel/lib/lru_cache.ko
#> insmod /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko
dpkg -S /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko
#> linux-modules-extra-5.4.0-80-generic: /lib/modules/5.4.0-80-generic/kernel/drivers/block/drbd/drbd.ko
パッと見た感じlinux-modules-extra-*
に付いているDRBDモジュール(恐らくOS標準付属の)が呼ばれているようである。
カーネルモジュールはdrbd-dkms
パッケージに含まれるはずなので何かおかしい。
試しにdrbd-dkms
パッケージを再インストールしてみると...
sudo apt install --reinstall drbd-dkms
#> ~出力略~
#> Unpacking drbd-dkms (9.1.5-1ppa1~focal1) over (9.1.5-1ppa1~focal1) ...
#> Setting up drbd-dkms (9.1.5-1ppa1~focal1) ...
#> Loading new drbd-9.1.5-1ppa1~focal1 DKMS files...
#> Building for 5.4.0-80-generic
#> Module build for kernel 5.4.0-80-generic was skipped since the
#> kernel headers for this kernel does not seem to be installed.
Module build for kernel 5.4.0-80-generic was skipped since the
kernel headers for this kernel does not seem to be installed.
「カーネルヘッダ入ってないからモジュールのビルドはスキップしたで✋」ということらしい。
言われたとおりカーネルヘッダのパッケージをインストールしてみる。
sudo apt install linux-headers-$(uname -r)
インストール中のログ↓を見る限りdrbdのモジュールのビルドも走っている様子
~
Building module:
cleaning build area...
make -j4 KERNELRELEASE=5.4.0-80-generic -C src/drbd KDIR=/lib/modules/5.4.0-80-generic/build........
cleaning build area...
DKMS: build completed.
drbd.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.4.0-80-generic/updates/dkms/
~
ビルドはできたようだが、この時点ではまだ8.4のモジュールが動いたままなので一旦取り外す。
sudo drbdadm down r01
sudo modprobe -r drbd
モジュールを再読み込み。
sudo modprobe drbd
cat /proc/drbd
#> version: 9.1.5 (api:2/proto:110-121)
#> GIT-hash: f41bc23cec1e919932ce35947f1b4e67d9e6db74 build by root@node1, 2022-01-05 15:56:18
#> Transports (api:17):
これで、無事DRBD9のカーネルモジュールで動くようになった
感想
カーネルモジュール周りのいい勉強になりました。
ログはちゃんと見よう。