DRBD領域のオフライン縮小方法

DRBD領域の縮小をしたいとき…

いったん確保したDRBDレプリケーション領域を縮小するということは、想定したくないニーズだと思います。しかしやむをえず縮小せざるをえなくなった場合、以下の説明にもとづいて正しく縮小できます。

外部メタデータを使っている場合にはオンラインでDRBD領域を縮小できますが、多くのユーザは内部メタデータを使っているため、オンライン縮小は現実的ではありません。したがってオフラインでの縮小が必要になります。ただし、このオフライン縮小はメタデータの操作を含む高度な方法です。ユーザーはメタデータについて熟知している事が前提になります。ユーザーズガイド記載のオフライン縮小手順もその前提で書かれていますが、DRBD領域の中にあるファイルシステムの取り扱いは詳しくないため、十分な事前知識がないまま実行すると、最悪データを失うことになりかねません。

そこで本記事では、「DRBDについて多少知っているけれど、熟知とまではいかない」ユーザ向けに、比較的安全なオフライン縮小手順をご案内します。

想定する状況

今回、次の状況を想定して説明します。

2台のサーバHost1とHost2にそれぞれ1テラバイトの論理ボリューム/dev/vg0/lv0があり、DRBDでリアルタイム同期しています。そして論理ボリューム全体をext4ファイルシステムとして利用しています。この論理ボリュームを600ギガバイトに縮小する必要が生じたものとします。なおDRBDのメタデータはストレージ領域の末尾にあります(内部メタデータ)。

スライド1

手順におけるポイント

  • ext4ファイルシステムのサイズはresize2fsコマンドで縮小できる。
  • DRBDの下部にある論理ボリュームやパーティションも縮小できる。しかしDRBDメタデータ領域は縮小に伴って失われてしまう。メタデータを作りなおしただけではフル同期が必要になってしまう。フル同期せずに領域を縮小するために、メタデータのダンプを作りなおしたメタデータ領域に書き込むことにする。
  • ファイルシステムやメタデータのサイズを厳密にセクタ単位で計算してリサイズするのは間違いやすいので、ファイルシステムは少し小さめ(たとえば500ギガバイト)に縮小し、必要なサイズ(600ギガバイト)に縮小した論理ボリュームに合わせてDRBDのレプリケーションサイズを調整することにする。このままでは約100ギガバイトの領域が無駄になるので、最後にファイルシステムを利用可能なサイズまで拡大する。

DRBD領域のオフライン縮小手順

1.プライマリ側ノードでfsck

縮小する前にファイルシステムにエラーがないかfsckでチェックします。これを行わないと次の手順のコマンドが実行できません。 (Host1がプライマリになっていると仮定)

[Host1]# e2fsck -f /dev/drbd0

2.プライマリ側ノードでファイルシステム縮小

そのまま600MBに縮小するとメタデータ領域が確保できません。このためいったん小さめの値を指定します。当然ながらディスク使用率を考慮してサイズを決定する必要があります。ここでは500GBを使います。

[Host1]# resize2fs /dev/drbd0 500G

スライド2

3.両ノードでDRBD停止

[Host1] # drbdadm down r0
[Host2] # drbdadm down r0

※念のためDRBDを停止する前には、”cat /proc/drbd”でUpToDate/UpToDateの状態になっている事を確認しておくとよいでしょう。もし同期が未完了のまま以降の手順を進めると、リサイズ後の手順10でスプリットブレインを解消してからのフル同期をしなければならなくなります。

4.それぞれのノードでDRBDメタデータをダンプ

ダンプしたメタデータはホストごとに異なるのでコピーして流用しないでください。

[Host1] # drbdadm apply-al r0
[Host1] # drbdadm dump-md r0 > /tmp/metadata.Host1
[Host2] # drbdadm apply-al r0
[Host2] # drbdadm dump-md r0 > /tmp/metadata.Host2

※DRBD8.3系の場合は”drbadm apply-al [res]”は不要です。

スライド3

5.それぞれのノードでDRBD下位デバイスのLVを縮小

[Host1] # lvreduce -L 600G /dev/vg0/lv0
[Host2] # lvreduce -L 600G /dev/vg0/lv0

※メタデータを作成するために、サイズに余裕をもって作成してください。メタデータを作成するための領域が足りないと次の手順で失敗します。メタデータサイズの見積り方法はユーザーズガイドに載っていますが、後でちょうど良くサイジングできるのでここでは大きめにしておくと安心です。

スライド4

6.メタデータ再作成

論理ボリュームを縮小したため元のメタデータ領域は失われています。このため、新しい領域の末尾にメタデータを新規作成します。

[Host1] # drbdadm create-md r0
[Host2] # drbdadm create-md r0

スライド5

7.ダンプしたメタデータ情報の書き換え

デバイスのセクタ単位でのサイズを確認します。

[Host1] # blockdev --getsize /dev/vg0/lv0

ここで出力された値を控えておきます。ここでは1258291200という値が表示されたものとします。次に、ダンプしておいたメタデータのサイズ情報を、先ほど控えた値に書き換えます。

[Host1] # sed -i -e 's/la-size-sect.*/la-size-sect 1258291200;/g' /tmp/metadata.Host1

もう一方のホストでも同様の操作をします。

[Host2] # blockdev --getsize /dev/vg0/lv0

ここでも1258291200という値が表示されたものとします。同じくダンプしておいたメタデータのサイズ情報を書き換えます。

[Host2] # sed -i -e 's/la-size-sect.*/la-size-sect 1258291200;/g' /tmp/metadata.Host2

スライド6

8.両ノードでメタデータのインポート

[Host1] # drbdmeta_cmd=$(drbdadm -d dump-md r0)
[Host1] # ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata.Host1
[Host2] # drbdmeta_cmd=$(drbdadm -d dump-md r0)
[Host2] # ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata.Host2

上記実行例はbashの置換を使用しています。他のシェルの場合は適宜読み替えてください。

スライド7

9.両ノードでDRBD起動

[Host1] # drbdadm up r0
[Host2] # drbdadm up r0

この時はまだds:Inconsistent/Inconsistentの状態になっています

10.一方のノードから強制同期

[Host1] # drbdadm -- --overwrite-data-of-peer primary r0

※この手順ではファイルシステムのデータの整合性は完全に維持されるため、メタデータレベルの不整合情報の更新だけが行われ、実際のフル同期は行われません。

スライド8

11.任意のホストで状態確認# cat /proc/drbd

# cat /proc/drbd

UpToDate/UpToDateになっていることを確認します。

12.無駄な空き領域を有効活用するためにファイルシステムを拡張する。

Host1がプライマリの場合、Host1で実行します。

[Host1] # resize2fs /dev/drbd0

スライド9

以上で、DRBD領域の縮小が完了しました!また、ダンプした/tmp/metadata.Host1と/tmp/metadata.Host2は不要なら削除してかまいません。

※実際にオフライン縮小を行う場合には十分な考慮のうえで行ってください。
※xfsの場合はファイルシステムが縮小に対応していないので、今回紹介の手順では縮小できません。