酒井優太

2017.12.26

DRBD9を崩したり再構築してみよう

AWS EFSがTokyoリージョンに来てくれていたら、この検証はもしかして、、と思わなくもないエンジニア酒井です。

これから記載する内容は drbdmanage list で出力されるコマンド一覧を調べていけばだいたい分かるものになります。

 

DRBD9で良くも悪くも肝になる部分が、drbdmanageかと思います。個々のdrbdコマンドをかなり裏でまとめてくれているので楽になっている部分があるものの、逆に裏で走っている一連処理の一部がエラーとなった時にどうなったかが分かりづらくなっていたりします。

あと、それに対処するためのdrbdmanageコマンドがドキュメントからはあまり良くわからないので躓きがちなのかなと。(DRBD8系で使っていた個々のコマンドでの操作方法はドキュメントに結構書いてある)

「Docs LINBIT User’s Guide 9.0.x」( http://docs.linbit.com/docs/users-guide-9.0/ )

 

それらを踏まえDRBD9で躓いた部分と、壊して再構築する検証をメモとして書きたいと思います。

  1. drbdのサービス起動をどうしておくか
  2. drbdmanageコマンドで取得できるリソース情報と実際の利用サイズが不一致になってしまった
  3. 2台構成だと.drbdctrl領域のPrimary権限を自動昇格してくれない
  4. 既存リソースにストレージを追加拡張するのはどうすればいいか
  5. サーバを差し替えて、復帰させるにはどうすればいいか
  6. バックアップのAMIから複製して、サービスを再開するにはどうすればいいか

1. drbdmanagedとdrbdのサービス起動をどうしておくか

DRBD9の導入説明を読んでもあまり、そもそもdrbdサービスをどのように起動させているかに触れているものがなかったので、どうしててかなと思ってました。結論としては、drbdmanageコマンドを実行するとdrbdmanaged及びdrbdサービスが連鎖的に起動してくるからでした。

drbdmanagedを通して、.drbdctrlの管理リソース情報からストレージリソース設定を取得するので、設定情報の不整合を避けるためにもdrbdの起動もdrbdmanagedに任せてしまった方が良さそうです。(drbdmanageでの管理でまとめるなら)

ちなみに、systemctl start drbd.serviceなどと個別に起動すると、syslogに以下のようなメッセージで注意を促してくれていました。

systemd: Started DRBD — please disable. Unless you are NOT using a cluster manager..

今回の検証では、systemdでdrbdmanagedの自動起動は行わず、drbdmanage pingやstartupコマンドを別途実行して起動させるようにしていました。

*drbdmanage shutdown -rなどでdrbdmanagedとdrbdを停止させた時と、systemctl stop drbdmanagedした時の挙動の統一感がなかったので。

ここは利用ケースによって色々ありそうですね。

2. drbdmanageコマンドで取得できるリソース情報と実際の利用サイズが不一致になってしまった

DRBDではもちろんストレージリソースの拡張が可能で、前回検証環境での 1000M割り当てたリソースr0を拡張する例であれば

とすると、ストレージリソースを拡張することが出来ます。

上記コマンドを実行するとノードに対して同期が走ります。(以下、replication:SyncTarget peer-disk:UpToDate done:71.98 の部分が進捗度)

ここで、うっかり操作で躓いたのですが、この同期がかかっている途中にサイズ指定を間違ったと思い拡張サイズを指定し直した所、drbdのPool Freeサイズからの払い出された残りサイズと、r0に指定したストレージサイズの不一致が発生してしまいました。

*上記同期が走っている途中に、以下の新しいサイズを指定してしまった

fdisl -lなどで確認しても分かるのですが、lvmの/dev/mapper/drbdpool-r0_00は増加しているものの、ストレージの/dev/drbd100を拡張する所でエラーとなって追随していない状態です。

これに対処するためには、drbdmanage resume-all コマンドで途中で滞ってしまった処理を促すとリサイズが再実行されます。

他の操作でも共通で何かしらの理由で処理が滞ってしまった場合に、drbdmanage resume-all で再処理が流れてくれたりします。

3. 2台構成だと.drbdctrl領域のPrimary権限が自動昇格してくれない

これは仕様でした。

.drbdctrl領域のPrimaryをどのノードが受け持つかはノード間の優先投票で決定されるのですが2台構成で1台欠けた状態だと、投票システムが機能せずに切替が行われないようです。DRBD9の検証サイトなどを参考にすると、3ノードで構成していたりするのでそのままの構成で検証していると見落としてしまったかも。(3ノードだと残りのサーバ間で自動昇格してくれます)

2台構成でも切り替えられないわけではなくて、Primaryにする側のノードで drbdmanage reelect --force-win を実行すると昇格してくれます。

4. 既存リソースにストレージを追加拡張するのはどうすればいいか

よくありそうなオペレーションとして容量が足りなくなったので、EBS追加して容量を拡張する時の手順。

drbdmanageコマンドだけでは完結しないので、LVMコマンドとそれぞれ実行することになります。

・ストレージ追加 各ストレージサーバ

・拡張確認 test-storage01

LVMで拡張するだけだと、drbdのコントール領域に情報が更新されないので、drbdmanage update-pool を実行して情報を更新しておかないとlist-nodesで拡張された情報が出てこないです。

ちなみに、追加したストレージを解除する場合も以下のような感じです。

5. サーバを差し替えて、復帰させるにはどうすればいいか

EC2が何かしらの原因で起動できなくなったケース、AZ移動しなくちゃいけないとかのオペレーションとして。

以下まとめると長いけど、初期構築にdrbdmanage delete-node、drbdmanage assign-resourceを差し込むだけといえばそれまでです。

・既存test-storage02を消して再構築するケース想定 test-storage01

・新test-storage02

・リソースに再登録 test-storage01

6. バックアップのAMIから複製して、サービスを再開するにはどうすればいいか

AMIから確認環境や複製環境を作りたい時に、.drbdctrl領域に入っている情報の不一致をどうやって更新してやればいいのかという手順です。
この内容については検証の試行錯誤で確立した手順なので無理矢理感強いです。もしドキュメントで正規手順や簡単な方法を見つけたらそちらをお勧めします。
・管理情報エクスポート test-storage01
AMIの環境と、現在動いているサーバで設定を変えていないのであれば、稼働サーバ側で

として、管理情報をエクスポートして参照する。
・AMI(test-storage01のスナップショット)からtest-storage03 / 172.16.0.103 を起動したケース想定

exp.jsonを元にして、インポート用の(imp.json)を作成して管理情報を戻します。
imp.jsonの内容的には、exp.jsonのtest-storage02部分を削除し、test-storage01の名前とIPをtest-storage03のものに置換して整えたものになります。

 AMIと稼働環境が大きく違っていて、drbdmanage export-ctrlvol での内容と乖離していそうならば、AMIで起動したサーバで初期化を走らせる前に.drbdctrlのダンプを取って、無理やり中身を覗いて設定ファイルを作成する方法も可能なのではないかなと。

 以上、コマンドの貼付け多くて長くなってしまいましたが、DRBD9の検証メモでした。
マネージドサービスの利用が多くなってきている昨今ですが、独自にストレージサーバを構築するなどでDRBD9を検証しようという皆さんの参考の一部になればと思います。
そして、試行錯誤して検証したものなのでこの記事には間違いが多く含まれていていたり、既に新機能がリリースされている可能性があります、信用せずに是非動かして実際の動きを見てみて下さい。