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で躓いた部分と、壊して再構築する検証をメモとして書きたいと思います。
- drbdのサービス起動をどうしておくか
- drbdmanageコマンドで取得できるリソース情報と実際の利用サイズが不一致になってしまった
- 2台構成だと.drbdctrl領域のPrimary権限を自動昇格してくれない
- 既存リソースにストレージを追加拡張するのはどうすればいいか
- サーバを差し替えて、復帰させるにはどうすればいいか
- バックアップの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を拡張する例であれば
1 |
$ sudo drbdmanage resize-volume r0 0 2000M |
とすると、ストレージリソースを拡張することが出来ます。
上記コマンドを実行するとノードに対して同期が走ります。(以下、replication:SyncTarget peer-disk:UpToDate done:71.98 の部分が進捗度)
1 2 3 4 5 6 7 8 9 10 11 12 |
$ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate test-storage02 role:Secondary volume:0 peer-disk:UpToDate volume:1 peer-disk:UpToDate r0 role:Secondary disk:Inconsistent test-storage02 role:Secondary replication:SyncTarget peer-disk:UpToDate done:71.98 |
ここで、うっかり操作で躓いたのですが、この同期がかかっている途中にサイズ指定を間違ったと思い拡張サイズを指定し直した所、drbdのPool Freeサイズからの払い出された残りサイズと、r0に指定したストレージサイズの不一致が発生してしまいました。
*上記同期が走っている途中に、以下の新しいサイズを指定してしまった
1 |
$ sudo drbdmanage resize-volume r0 0 2500M |
fdisl -lなどで確認しても分かるのですが、lvmの/dev/mapper/drbdpool-r0_00は増加しているものの、ストレージの/dev/drbd100を拡張する所でエラーとなって追随していない状態です。
1 2 3 4 5 6 7 8 9 10 |
Disk /dev/mapper/drbdpool-r0_00: 2625 MB, 2625634304 bytes, 5128192 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk /dev/drbd100: 2097 MB, 2097152000 bytes, 4096000 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト |
これに対処するためには、drbdmanage resume-all コマンドで途中で滞ってしまった処理を促すとリサイズが再実行されます。
他の操作でも共通で何かしらの理由で処理が滞ってしまった場合に、drbdmanage resume-all で再処理が流れてくれたりします。
1 2 3 4 5 6 7 |
$ drbdmanage help resume-all usage: drbdmanage resume-all [-h] Resumes all failed assignments optional arguments: -h, --help show this help message and exit |
3. 2台構成だと.drbdctrl領域のPrimary権限が自動昇格してくれない
これは仕様でした。
.drbdctrl領域のPrimaryをどのノードが受け持つかはノード間の優先投票で決定されるのですが2台構成で1台欠けた状態だと、投票システムが機能せずに切替が行われないようです。DRBD9の検証サイトなどを参考にすると、3ノードで構成していたりするのでそのままの構成で検証していると見落としてしまったかも。(3ノードだと残りのサーバ間で自動昇格してくれます)
2台構成でも切り替えられないわけではなくて、Primaryにする側のノードで drbdmanage reelect --force-win を実行すると昇格してくれます。
1 2 3 4 5 6 7 8 9 10 11 |
$ drbdmanage help reelect usage: drbdmanage reelect [-h] [--force-win] Reelect leader. DO NOT USE this command if you do not understand all implications! optional arguments: -h,--help show this help message and exit --force-win This is a last resort command to bring up a single leader in order to get access to the control volume (e.g. remove node in 2 node cluster) |
4. 既存リソースにストレージを追加拡張するのはどうすればいいか
よくありそうなオペレーションとして容量が足りなくなったので、EBS追加して容量を拡張する時の手順。
drbdmanageコマンドだけでは完結しないので、LVMコマンドとそれぞれ実行することになります。
・ストレージ追加 各ストレージサーバ
1 2 3 4 5 6 7 8 9 10 |
$ sudo drbdmanage list-nodes +----------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |----------------------------------------------------------| | test-storage01 | 10236 | 7724 | | ok | | test-storage02 | 10236 | 7724 | | ok | +----------------------------------------------------------+ $ sudo pvcreate /dev/xvdbb $ sudo vgextend drbdpool /dev/xvdbb |
・拡張確認 test-storage01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo drbdmanage list-nodes +----------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |----------------------------------------------------------| | test-storage01 | 10236 | 7724 | | ok | | test-storage02 | 10236 | 7724 | | ok | +----------------------------------------------------------+ $ sudo drbdmanage update-pool $ sudo drbdmanage list-nodes +-----------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |-----------------------------------------------------------| | test-storage01 | 20472 | 17960 | | ok | | test-storage02 | 20472 | 17960 | | ok | +-----------------------------------------------------------+ |
LVMで拡張するだけだと、drbdのコントール領域に情報が更新されないので、drbdmanage update-pool を実行して情報を更新しておかないとlist-nodesで拡張された情報が出てこないです。
1 2 3 4 5 6 7 8 |
$ drbdmanage help update-pool usage: drbdmanage update-pool [-h] Checks the storage pool total size and free space on the local node and updates the associated values in the data tables on the control volume. optional arguments: -h, --help show this help message and exit |
ちなみに、追加したストレージを解除する場合も以下のような感じです。
1 2 3 4 |
$ sudo vgreduce drbdpool /dev/xvdbb *各サーバで解除しておく $ sudo drbdmanage update-pool |
5. サーバを差し替えて、復帰させるにはどうすればいいか
EC2が何かしらの原因で起動できなくなったケース、AZ移動しなくちゃいけないとかのオペレーションとして。
以下まとめると長いけど、初期構築にdrbdmanage delete-node、drbdmanage assign-resourceを差し込むだけといえばそれまでです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
usage: drbdmanage remove-node [-h] [-q] [-f] name [name ...] Removes a node from the drbdmanage cluster. All drbdmanage resources that are still deployed on the specified node are marked for undeployment, and the node entry is marked for removal from drbdmanage's data tables. The specified node is expected to undeploy all resources. As soon as all resources have been undeployed from the node, the node entry is removed from drbdmanage's data tables. positional arguments: name Name of the node to remove optional arguments: -h, --help show this help message and exit -q, --quiet Unless this option is used, drbdmanage will issue a safety question that must be answered with yes, otherwise the operation is canceled. -f, --force The node entry and all associated assignment entries are removed from drbdmanage's data tables immediately, without taking any action on the cluster node that the node entry refers to. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ drbdmanage help assign-resource usage: drbdmanage assign-resource [-h] [--client] [--overwrite] [--discard] resource node [node ...] Creates an assignment for the deployment of the specified resource on the specified node. positional arguments: resource node optional arguments: -h, --help show this help message and exit --client --overwrite If specified, drbdmanage will issue a "drbdmadm -- --force primary" after the resource has been started. --discard If specified, drbdmanage will issue a "drbdadm -- --discard-my- data" connect after the resource has been started. |
・既存test-storage02を消して再構築するケース想定 test-storage01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
$ sudo drbdmanage list-nodes +----------------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |----------------------------------------------------------------| | test-storage01 | 20472 | 17960 | | ok | | test-storage02 | 20472 | 17960 | | OFFLINE | +----------------------------------------------------------------+ $ sudo drbdmanage list-assignments +------------------------------------------------------------+ | Node | Resource | Vol ID | | State | |------------------------------------------------------------| | test-storage01 | r0 | * | | ok | | test-storage02 | r0 | * | | ok | +------------------------------------------------------------+ $ sudo drbdmanage delete-node -f test-storage02 $ sudo drbdmanage list-nodes +-----------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |-----------------------------------------------------------| | test-storage01 | 20472 | 17960 | | ok | +-----------------------------------------------------------+ $ sudo drbdmanage list-assignments +----------------------------------------------------------------------------------+ | Node | Resource | Vol ID | | State | |----------------------------------------------------------------------------------| | test-storage01 | r0 | * | | pending actions: adjust connections | +----------------------------------------------------------------------------------+ $ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate r0 role:Secondary disk:UpToDate test-storage02 connection:Connecting $ sudo drbdmanage resume-all $ sudo drbdmanage list-assignments +------------------------------------------------------------------+ | Node | Resource | Vol ID | | State | |------------------------------------------------------------------| | test-storage01 | r0 | * | | ok | +------------------------------------------------------------------+ $ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate r0 role:Secondary disk:UpToDate $ sudo drbdmanage add-node test-storage02 172.16.0.102 |
・新test-storage02
1 2 3 4 5 |
$ sudo pvcreate /dev/xvdba /dev/xvdbb $ sudo vgcreate drbdpool /dev/xvdba /dev/xvdbb $ sudo drbdmanage join -p 6999 172.16.0.102 1 test-storage01 172.16.0.101 0 F66B8N0sn+gx34+sC8PZ *みたいな感じで、test-storage01で発行されたIDで再加入。 |
・リソースに再登録 test-storage01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$ sudo drbdmanage list-nodes +-------------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |-------------------------------------------------------------| | test-storage01 | 20472 | 17960 | | ok | | test-storage02 | 20472 | 20464 | | ok | +-------------------------------------------------------------+ $ sudo drbdmanage list-assignments +------------------------------------------------------------+ | Node | Resource | Vol ID | | State | |------------------------------------------------------------| | test-storage01 | r0 | * | | ok | +------------------------------------------------------------+ $ sudo drbdmanage assign-resource r0 test-storage02 $ sudo drbdmanage list-assignments +-----------------------------------------------------------+ | Node | Resource | Vol ID | | State | |-----------------------------------------------------------| | test-storage01 | r0 | * | | ok | | test-storage02 | r0 | * | | ok | +-----------------------------------------------------------+ $ sudo drbdmanage list-nodes +-----------------------------------------------------------+ | Name | Pool Size | Pool Free | | State | |-----------------------------------------------------------| | test-storage01 | 20472 | 17960 | | ok | | test-storage02 | 20472 | 17960 | | ok | +-----------------------------------------------------------+ $ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate test-storage02 role:Secondary volume:0 peer-disk:UpToDate volume:1 peer-disk:UpToDate r0 role:Secondary disk:UpToDate test-storage02 role:Secondary replication:SyncSource peer-disk:Inconsistent done:7.61 |
6. バックアップのAMIから複製して、サービスを再開するにはどうすればいいか
1 |
$ sudo drbdmanage export-ctrlvol -f exp.json |
1 2 3 4 5 6 7 |
$ sudo drbdmanage init 172.16.0.103 *.drbdctrl領域を上書き初期化 $ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ sudo drbdmanage import-ctrlvol -f imp.json $ sudo drbdmanage shutdown -r $ drbdsetup status .drbdctrl role:Secondary volume:0 disk:UpToDate volume:1 disk:UpToDate $ sudo drbdmanage shutdown -r $ drbdsetup status # No currently configured DRBD found. $ sudo drbdmange ping $ drbdsetup status .drbdctrl role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate r0 role:Secondary disk:UpToDate |
1 2 3 4 5 |
$ sudo dd if=/dev/mapper/drbdpool-.drbdctrl_0 of=./drbdctrl_0.dump $ sudo drbdmanage init 172.16.0.103 $ sudo drbdmanage export-ctrlvol -f new.json *drbdctrl_0.dumpの内容と、new.jsonの雛形的なデータを元にインポート用のファイルを作成する |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ drbdmanage help export-ctrlvol usage: drbdmanage export-ctrlvol [-h] [--file FILE] Export drbdmanage control volume as json blob optional arguments: -h, --help show this help message and exit --file FILE, -f FILE File to save configuration json blob, if not given: stdout $ drbdmanage help import-ctrlvol usage: drbdmanage import-ctrlvol [-h] [-q] [--file FILE] Import drbdmanage control volume from json blob optional arguments: -h, --help show this help message and exit -q, --quiet Unless this option is used, drbdmanage will issue a safety question that must be answered with yes, otherwise the operation is canceled. --file FILE, -f FILE File to load configuration json blob, if not given: stdin |