Volumeとそのメリット

DRBDの概念にリソースとボリュームがあります。
判りにくいという指摘をよく頂くので、本ブログでは具体的な設定方法と、リソース内に複数のボリュームを定義するメリットを説明します。
DRBDでは複数のデバイスをレプリケーションできます。
明確にデータのパーティションを管理したい場合、例えば/dev/drbd0と/dev/drbd1の2つを使って、データベースとWebコンテンツを別けることが可能です。

古いDRBDではリソースの中には1つのデバイスしか設定が出来なかったのですが、DRBD 8.4からボリュームの機能が追加され、1つのリソースの中に複数のボリュームを定義することもできるようになりました。その設定の一例を記します。
これはリソースr0の中にボリューム volume 0とvolume 1の2つがある例で、volume 0は/dev/drbd0、volume 1は/dev/drbd1としてアクセスが出来ます。
resource r0 {
volume 0 {
device /dev/drbd0;
disk /dev/sda7;
meta-disk internal;
}
volume 1 {
device /dev/drbd1;
disk /dev/sda8;
meta-disk internal;
}
on node1 {
address 10.1.1.31:7789;
}
on node2 {
address 10.1.1.32:7789;
}
}ボリュームは 0 から番号付けされ、1つのリソースの中で、最大で65,535ボリュームまで設定が可能です。ボリュームにはレプリケートされたデータセットを含み、DRBD内部で使用するメタデータのセットも含みます。
drbdadm コマンドでは、リソース内のボリュームを、リソース名とボリューム名を <resource>/<volume> のように記述して指定します。

昔からあるDRBDの設定方法として、リソースをボリュームごとに定義する方法も紹介します。
次のその例でリソースr0の中にvolume 0、デバイスとして/dev/drbd0、リソースr1の中にvolume 0、デバイスとしては/dev/drbd1が定義されます。
resource r0 {
volume 0 {
device /dev/drbd0;
disk /dev/sda7;
meta-disk internal;
}
on node1 {
address 10.1.1.31:7789;
}
on node2 {
address 10.1.1.32:7789;
}
}
resource r1 {
volume 0 {
device /dev/drbd1;
disk /dev/sda8;
meta-disk internal;
}
on node1 {
address 10.1.1.31:7790;
}
on node2 {
address 10.1.1.32:7790;
}
}
※「on ノード名 { } ブロック」中のaddressはDRBDの通信の使われるIPアドレスと通信に使うポート番号です。
リソース毎に変える必要があり、リソースr0は7789、r1は7790に設定しています。

DRBDでボリュームをまとめて定義すると、デバイス毎の書き込みのタイミングを正しく制御することが出来ますが、リソース毎にボリュームを定義するとそれぞれのボリュームへの書き込みの順番は保証されません。例えば上の例で、r0リソースの/dev/drbd0のデータベースのデータ部分、r1リソースの/dev/drbd1にデータベースのログデータを割り当てた場合に、データとログは同時に書き込まなければならないのですが、DRBDではそのタイミングを制御できず、アクティブ側のサーバが停止した時に、スタンバイ側に記録されるデータとログを使ってデータベースを復元することが出来なくなる可能性があります。
データに依存関係がある場合、リソース内にボリュームをまとめて定義することを薦めます。
データの依存関係が無い場合は、リソース毎にボリュームを定義しても問題ありません。この場合は/dev/drbd0をnode1にマウントし、/dev/drbd1をnode2にマウントして、両ノードをアクティブして運用できるメリットがあります。