DRBD 8からDRBD 9への移行手順

DRBDの最新バージョンは9です。(ちなみにベータ版で10の開発も進んでいます。)

2020年時点でHAクラスタに使われているのは主にDRBD 8.4で、DRBD 9も開発がすすみ安定して使えるようになっています。

DRBD 9の大きな特徴は 多ノード対応、SDS対応ですが、DRBD 8との互換性もあり、DRBD 8で構築した環境をそのままDRBD 9にバージョンアップすることもできます。

本ブログでは、node1、node2の2台構成のMariaDBのHAクラスターのDRBDのバージョンを8.4から9.0にバージョンアップの方法を説明します。

1.node2のDRBDをバージョンアップ

 まず、node2をOfflineにします。これはDRBDのバージョンアップ中にPacemakerがDRBDの異常を検知しないようにするためです。

[root@node2 lib]# crm_mon -1D

Online: [ node1.example.com node2.example.com ]

Active resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node1.example.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node1.example.com
     res_mysql	(ocf::heartbeat:mysql):	Started node1.example.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node1.example.com ]
     Slaves: [ node2.example.com ]

 crm node standbyコマンドでnode2をOffline(スタンバイ)状態にします。

[root@node2 lib]# crm node standby node2.example.com
[root@node2 lib]# crm_mon -1D

Node node2.example.com: standby
Online: [ node1.example.com ]

Active resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node1.example.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node1.example.com
     res_mysql	(ocf::heartbeat:mysql):	Started node1.example.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node1.example.com ]

node2がOffline(スタンバイ)状態になったのが確認できました。

2.DRBDの削除

node2がOffline状態になったら、DRBD 8.4を削除します。

[root@node2 lib]# rpm -qa | grep drbd
drbd-udev-9.13.1-1.el7.x86_64
kmod-drbd-8.4.11_3.10.0_1127-1.el7.x86_64
drbd-utils-9.13.1-1.el7.x86_64
drbd-bash-completion-9.13.1-1.el7.x86_64
drbd-pacemaker-9.13.1-1.el7.x86_64
drbd-9.13.1-1.el7.x86_64
drbd-xen-9.13.1-1.el7.x86_64

drbd-utilsなどは最新のDRBD 8.4ではバージョン 9.13になっていて、DRBD 9と共通で使えるパッケージになっています。古い8.4バージョンである場合は、まずdrbd-utilsなどのバージョンアップを行ってください。

この例ではkmod-drbd-8.4を削除します。


[root@node2 ~]# rmmod drbd
[root@node2 ~]# yum remove kmod-drbd
読み込んだプラグイン:fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kmod-drbd.x86_64 0:8.4.11_3.10.0_1127-1.el7 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================================
 Package            アーキテクチャー
                                    バージョン                         リポジトリー        容量
================================================================================================
削除中:
 kmod-drbd          x86_64          8.4.11_3.10.0_1127-1.el7           @drbd-8.4          9.8 M

トランザクションの要約
================================================================================================

削除  1 パッケージ

インストール容量: 9.8 M
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : kmod-drbd-8.4.11_3.10.0_1127-1.el7.x86_64                       1/1 
  検証中                  : kmod-drbd-8.4.11_3.10.0_1127-1.el7.x86_64                       1/1 

削除しました:
  kmod-drbd.x86_64 0:8.4.11_3.10.0_1127-1.el7       

完了しました!

3.DRBDのリポジトリファイルの修正

次にDRBDのリポジトリファイルを修正します。

8.4をインストールした時に/etc/yum.repo.dの中に例えばlinbit.repoというファイルがあり、その中にリポジトリの設定が書かれています。

[drbd-8.4]
name=LINBIT Packages for drbd-8.4 - $basearch
baseurl=http://packages.linbit.com/<<ハッシュ番号>>/yum/rhel7/drbd-8.4/$basearch
enabled=1
gpgkey=https://packages.linbit.com/package-signing-pubkey.asc
gpgcheck=1

9.0用の設定に書き換えます。

※<<ハッシュ番号は>> LINBIT HAクラスタスタックサポートを契約された時に発行される文字列です。


[drbd-9.0]
name=LINBIT Packages for drbd-9.0 - $basearch
baseurl=http://packages.linbit.com/<<ハッシュ番号>>/yum/rhel7/drbd-9.0/$basearch
enabled=1
gpgkey=https://packages.linbit.com/package-signing-pubkey.asc
gpgcheck=1

4.DRBD 9のインストール

リポジトリの設定後、DRBD 9をインストールします。

[root@node2 ~]# yum install kmod-drbd
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
base                                                                     | 3.6 kB  00:00:00     
drbd-9.0                                                                 | 2.9 kB  00:00:00     
extras                                                                   | 2.9 kB  00:00:00     
pacemaker-1.1.20                                                         | 2.9 kB  00:00:00     
updates                                                                  | 2.9 kB  00:00:00     
(1/2): updates/7/x86_64/primary_db                                       | 2.1 MB  00:00:00     
(2/2): drbd-9.0/x86_64/primary_db                                        | 850 kB  00:00:04     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kmod-drbd.x86_64 0:9.0.23_3.10.0_1127-1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================================
 Package             アーキテクチャー バージョン                       リポジトリー        容量
================================================================================================
インストール中:
 kmod-drbd           x86_64           9.0.23_3.10.0_1127-1             drbd-9.0           2.4 M

トランザクションの要約
================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 2.4 M
インストール容量: 2.4 M
Is this ok [y/d/N]: y
Downloading packages:
kmod-drbd-9.0.23_3.10.0_1127-1.x86_64.rpm                                | 2.4 MB  00:00:04     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : kmod-drbd-9.0.23_3.10.0_1127-1.x86_64                           1/1 
  検証中                  : kmod-drbd-9.0.23_3.10.0_1127-1.x86_64                           1/1 

インストール:
  kmod-drbd.x86_64 0:9.0.23_3.10.0_1127-1                                                       

完了しました!

インストール後にDRBDのバージョンを確認します。/proc/drbdファイルでバージョン確認ができます。

[root@node2 ~]# modprobe drbd
[root@node2 ~]# cat /proc/drbd
version: 9.0.23-1 (api:2/proto:86-116)
GIT-hash: d16bfab7a4033024fed2d99d3b179aa6bb6eb300 build by @buildsystem, 2020-06-08 14:43:16
Transports (api:16):
[root@node2 ~]# 

ここで/proc/drbdのversion:が9.0.2xになっていない場合、node2は再起動してください。DRBDはカーネルモジュールなので、再起動しないと古いDRBDのプログラムが動くことがあります。

5.メタデータの変換

DRBDのメタデータをver 8.4からver 9.0へ変換します。メタデータとはDRBDの管理情報がは記録されているディスクの一部の領域です。DRBD 8とDRBD 9では内部の形式が異なるため、drbdadm create-mdコマンドを実行して、メタデータを変換します。

[root@node2 ~]# drbdadm create-md r0
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/loop0 at byte offset 2147479552

Valid v08 meta-data found, convert to v09?
[need to type 'yes' to confirm] yes

md_offset 2147479552
al_offset 2147446784
bm_offset 2147381248

Found xfs filesystem
     2097052 kB data area apparently used
     2097052 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

Writing meta data...
New drbd meta data block successfully created.
success

6.クラスタシステムの復旧

DRBDを起動してnode1と同期を再開します。

[root@node2 ~]# drbdadm up r0
[root@node2 ~]# drbdadm status
r0 role:Secondary
  disk:UpToDate
  node1.example.com role:Primary
    peer-disk:UpToDate

node1のDRBD 8.4とUpToDateとなっているので、正常に同期していることがわかります。

最後に、node2のPacemakerをOnlineに戻します。

[root@node2 ~]# crm node online node1.example.com 
[root@node2 ~]# crm_mon -1D

Online: [ node1.example.com node2.example.com ]

Active resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node1.example.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node1.example.com
     res_mysql	(ocf::heartbeat:mysql):	Started node1.example.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node1.example.com ]
     Slaves: [ node2.example.com ]

node1とnode2のPacemakerの連携が再開しました。

7.node1のDRBDをバージョンアップ

続いてnode1のDBRDをバージョンアップします。node1のPacemakerをOffline (スタンバイ)にすれば、node2にサービスが切り替わります。

[root@node1 ~]# crm node standby node1.example.com

サービスがnode2にフェールオーバしたら、node2で行ったDRBDのバージョンアップ作業をnode1でも同様に行います。

8.DRBD 9に変更した時に注意すること。

DRBD 9では/proc/drbdファイルを使ったDRBDの動作チェックができません。

以下はDRBD8.4での表示例です。

[root@node2 lib]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by @buildsystem, 2020-04-02 08:12:50
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:10579 nr:42837 dw:53416 dr:55259 al:3 bm:0 lo:0 pe:0 ua:0 ap:0
    ep:1 wo:f oos:0

監視ソフトなどで、DRBDの状態を確認している場合、drbdadm statusコマンドを使って動作チェックするか、/sys/のproc_drbdファイルで同様の確認ができます。

[root@node1 ~]# cat /sys/kernel/debug/drbd/resources/*/connections/*/0/proc_drbd
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:484516 dw:484516 dr:2120 al:0 bm:0 lo:1 pe:[0;17] ua:0 ap:[0;0] ep:1 wo:2 oos:1614620
	[===>................] sync'ed: 23.1% (1614620/2097052)K
	finish: 0:00:13 speed: 120,608 (120,608 -- 120,608) want: 26,760 K/sec
	 23% sector pos: 966952/4194104
	resync: used:1/61 hits:15733 misses:8 starving:0 locked:0 changed:4
	act_log: used:0/1237 hits:0 misses:0 starving:0 locked:0 changed:0
	blocked on activity log: 0/0/0