DRBD.CONF(5) | 設定ファイル | DRBD.CONF(5) |
drbd.conf - DRBD デバイスの設定ファイル
/etc/drbd.conf ファイルは drbdadm コマンドから読み込まれる。
本ファイルの形式は、クラスタを構成する 2 つのノード間でそのままコピーしても問題がないようにデザインされている。設定を管理しやすくするため、設定ファイルをそのままコピーすることを強く推奨する。/etc/drbd.conf ファイルは、クラスタを構成する 2 つのノードで同じ内容でなければならない。/etc/drbd.conf への変更はただちに反映されるものではない。
通例、メイン設定ファイルは 2 つのインクルードステートメントが含まれている。1 つ目は /etc/drbd.d/global_common.conf であり、2 つ目は .res の付いたすべてのファイルのサフィックスである。
resource r0 { net { protocol C; cram-hmac-alg sha1; shared-secret "FooFunFactory"; } disk { resync-rate 10M; } on alice { volume 0 { device minor 1; disk /dev/sda7; meta-disk internal; } address 10.1.1.31:7789; } on bob { volume 0 { device minor 1; disk /dev/sda7; meta-disk internal; } address 10.1.1.32:7789; } }
上の例は r0 という名前の 1 つの DRBD リソースを設定している。ノード間の通信プロトコルは C である。ホスト alice では 1 つのボリューム含んでいて、 /dev/drbd1 をアプリケーション用のデバイスとして使用し、/dev/sda7 をデータ用の下位デバイスとしている。IP アドレスには 2 ノード間の通信に使うネットワークインタフェースの IP アドレスを指定している。DRBD の再同期には 10 メガバイト/秒の帯域幅を使うことができる。この resync-rate ステートメントはボリューム 0 に対して有効だが、追加のボリュームにも有効である。この例では各ボリュームに 10MB/秒フルで指定している。
1つの drbd.conf に複数のリソースセクションを書くこともできる。他の設定例については DRBD User's Guide[1] を参照
本ファイルはセクションとパラメータで構成される。各セクションはキーワードで始まり、任意指定のパラメータ、開き中括弧 (“{”) で始まる。閉じ中括弧 (“}”) でセクションが終わる。中括弧はパラメータを囲むのにも使われる。
section [name] { parameter value; [...] }
パラメータ名と値の間にホワイトスペースが必要である。パラメータ名の後ろの文字列はパラメータに対する値と見なされる。ブールパラメータは特別なパラメータで、パラメータ名だけで構成される。パラメータの最後にセミコロン (“;”) が必要である。
いくつかのパラメータ値はデフォルトの単位を持つが、 K 、 M 、または G を明示的に指定することによって単位を変えられる。これらの単位はコンピュータでおなじみの方法で定義される (K=2^10=1024, M=1024K, G=1024M)。
設定ファイルにコメントを記述できる。コメント行はハッシュ記号 (“#”) で始まらなければならない。この文字以降行末までの文字がコメントと見なされる。
skip
global
common
resource name
on host-name
resource r1 { protocol C; device minor 1; meta-disk internal; on alice bob { address 10.2.2.100:7801; disk /dev/mapper/some-san; } on charlie { address 10.2.2.101:7801; disk /dev/mapper/other-san; } on daisy { address 10.2.2.103:7801; disk /dev/mapper/other-san-as-seen-from-daisy; } }
floating セクションのキーワードも参照すること。このセクションでの必要なステートメントは address と volume である。上位互換性と利便性のため、直接ホストセクションに 1 つのボリュームのステートメントを埋め込むことが有効である。
volume vnr
stacked-on-top-of resource
floating AF addr:port
resource r2 { protocol C; device minor 2; disk /dev/sda7; meta-disk internal; # short form, device, disk and meta-disk inherited floating 10.1.1.31:7802; # longer form, only device inherited floating 10.1.1.32:7802 { disk /dev/sdb; meta-disk /dev/sdc8; } }
disk
net
startup
options
handlers
環境変数がインタフェースとなる:
DRBD_PEER は推奨しない。
これらの設定がすべてのハンドラに設定されるわけではない。いくつかの値は floating 設定では無効になる。
minor-count count
Minor-count は DRBD のサイジングための手がかりである。これは様々なメモリプールを適正サイズにするのに役立つ。実際に使っているマイナー番号よりも大きな数を順に指定しなければいけない。デフォルトでは、現在定義されているリソースの数に加えてさらに 11 個のリソースを定義できる。ただし最低でも 32 個は定義できる。
dialog-refresh time
ユーザダイアログは time 秒ごとに秒を作画する (time が 0 だと再作画しない)。デフォルト値は 1 である。
disable-ip-verification
udev-always-use-vnr
# implicit single volume without "volume 0 {}" block DEVICE=drbd<minor> SYMLINK_BY_RES=drbd/by-res/<resource-name> # explicit volume definition: volume VNR { } DEVICE=drbd<minor> SYMLINK_BY_RES=drbd/by-res/<resource-name>/VNR
global セクションでこのパラメータを定義すると、drbdadm は常に .../VNR の部分を追加し、ボリューム定義が暗黙的であるか明示的であるかを気にしない。
過去との互換性のために、これはデフォルトでは無効になっているが、有効にすることを推奨する。
usage-count val
protocol prot-id
プロトコル A: ローカルディスクとローカル TCP 送信バッファにデータを書き込んだらディスクへの書き込みが完了したと判断する。
プロトコル B: ローカルディスクとリモートバッファキャッシュにデータを書き込んだらディスクへの書き込みが完了したと判断する。
プロトコル C: ローカルディスクとリモートディスクの両方にデータを書き込んだらディスクへの書き込みが完了したと判断する。
device name minor nr
name, minor, minor number は省略する事ができる。name を省略すると、デフォルトの /dev/drbdminor が使われる。
udev は自動的に /dev/drbd/by-res と /dev/drbd/by-disk の中のシンボリックリンクを作成する。
disk name
address AF addr:port
各 DRBD リソースは、ノードのパートナーデバイスと接続するために TCP port が必要である。2 つの別の DRBD リソースが同じ addr:port の組み合わせを同一ノードで使用することはできない
meta-disk internal,
meta-disk device,
meta-disk device [index]
device が指定されると、 index がある場合でもない場合でも、 DRBD はそのデバイスにメタデータを保存する。index がない場合、メタデータのサイズはデータデバイスのサイズから決定される。このキーワードは通常 LVM と組み合わせて使用され、様々なサイズのブロックデバイスを扱うときに使用する。メタデータのサイズは 36KB + 下位デバイスのサイズ / 32K であり、4KB 単位で切り上げる。(おおまかな目安として、ストレージサイズ 1GB あたり 32KB のメタデータ領域が必要で、これを MB 単位に切り上げる)。
index が指定されると、各インデックス数は 128MB のメタデータスロットを参照する。これは最大 4TiB まで指定することができる。この方法により複数の DBRD デバイスが同一のメタデータデバイスを共有できるようになる。例えば /dev/sde6[0] と /dev/sde6[1] を使用するとき、 /dev/sde6 は最低でも 256MB 以上でなければいけない。ハードサイズの制限のため、メタディスクのインデックスは推奨されない。
on-io-error handler
handler には pass_on, call-local-io-error, detach のいずれかを指定できる。
pass_on: ノードはディスクのステータスを inconsistent(不整合) にし、 I/O エラーを起こしたブロックに対応するビットマップにマークをつける。そして、リモートのノード上で入出力を再度行う。
call-local-io-error: ハンドラスクリプト local-io-error を呼び出して実行する。
detach: 低レベルデバイスを切り離して、ディスクレスモードで処理を続行する。
fencing fencing_policy
次のフェンシングポリシーを指定できる:
dont-care
resource-only
resource-and-stonith
disk-barrier,
disk-flushes,
disk-drain
drbd-8.4.2 から disk-barrier は、linux-2.6.36 (及び RHEL6 の 2.6.32) 以降での正常動作が確認できないためデフォルトで無効になった。注意: 有識者による指示のもとでのみ使用すること。
手法を選択するにあたっては、測定可能なパフォーマンスデータのみに頼るべきではない。下位デバイスが揮発性の書き込みキャッシュしか持たない場合 (通常のハードディスクや通常のハードディスクだけで構成される RAID など)、最初の 2 つのオプションのどちらかを使うべきである。下位デバイスにバッテリバックアップ機能付きの書き込みキャッシュがある場合には、3 番目のオプションが利用できる。4番目のオプション (すべてを無効にする場合は "none") は、ほとんどの I/O スタックにおいて危険で、ディスクへの書き込み順序が入れ替わってしまう可能性がある。no-disk-drain を使っては ならない 。
残念なことに、デバイスマッパ(LVM) はバリアをサポートしていない。
/proc/drbd の "wo:" の文字の後ろに、下位デバイスに対する現在の設定が b, f, d, n の文字で表示される。オプションは次のとおり:
barrier
flush
drain
none
md-flushes
max-bio-bvecs
最も良い回避方法は、VM の内部にパーティションを適切に配置する (例えば、セクタ 1024 から開始する) ことである。これは、ストレージ領域を 480 KiB を消費する。残念ながら、ほとんどの Linux パーティションツールは、奇数 (63) でパーティションを開始する。そのため、ほとんどのディストリビューションは、仮想 Linux マシンにインストールを行うと、誤ったパーティションで終了してしまう。第 2 の回避方法は、 BIO あたりの最大 DRBD bvecs (= max-bio-bvecs) を 1 にすることである。しかし、パフォーマンスは低下する。
max-bio-bvecs のデフォルト値は 0 で、これはユーザに制限が無いことを意味する。
disk-timeout
このオプションは カーネルパニックを引き起こす可能性があり、注意が必要である。
リクエストの「中断」あるいはディスクの強制切り離しは、完全に下位デバイスをブロックまたはハンギングして、リクエストをまったく処理せずエラーも処理しなくなる。この状況ではハードリセットとフェイルオーバ以外になす術がない。
「中断」すると、基本的にローカルエラーの完了を装い、すみやかにサービスの移行を行うことで安全な切り替えを行う。それでもなお、影響を受けるノードは "すぐ" に再起動される必要はある。
リクエストを完了することで、上位レイヤーに関連するデータページを再利用させることができる。
後にローカルの下位デバイスが「復帰」すると、ディスクから元のリクエストページへの DMA のデータは、うまくいくと未使用のページへランダムなデータを送るが、多くの場合その間に関係のないデータに変形してしまい、様々なダメージの原因になる。
つまり遅延した正常な完了は、特に読み込みリクエストの場合 panic() の原因になる。遅延した「エラー」完了は、その都度に通知は行うが、問題ないと考えてよい。
disk-timeout のデフォルト値は 0 であり、無限のタイムアウトを意味する。タイムアウトは 0.1 秒単位で指定する。このオプションは DRBD 8.3.12. から利用できる。
discard-zeroes-if-aligned {yes | no}
異なるノードで DRBD が discard 特性が異なるデバイスによって構成されている場合、discard はデータの不一致(古いデータまたはゴミが 1 つのバックエンドに残り、別のバックエンドではゼロが残る)の原因となる。オンライン照合は、数多くの偽の差異を報告する可能性がある。たぶんほとんどのユースケース (ファイルシステム上の fstrim) では無害であるが、DRBD はそれを持つことはできません。
安全に動作させるには、ローカルのバックエンド(プライマリ上)が "discard_zeroes_data=true" をサポートしていない場合、 discard のサポートを無効にする必要がある。受信側(セカンダリ)がマップされていなかった領域を割り当て、 "discard_zeroes_data = true" をサポートしていない場合、受信側で discard を明示的にゼロに変換する必要がある。
discard をサポートしているのに、discard_zeroes_data = false をアナウンスするデバイス(特に LVM/DM シンプロビジョニング)がある。DM-thin の場合、チャンクサイズに合わせた discard はマップされず、マッピングされていないセクタからの読み込みはゼロを返す。ただし、discard 要求のアライメントされていない部分ヘッドまたはテール領域は暗黙に無視される。
整列したフル・チャンクの discard をパスし、これらの整列していない部分領域を明示的にゼロ・アウトするヘルパーを追加すると、そのようなデバイスでは discard_zeroes_data = true を効果的に達成する。
discard-zeroes-if-aligned を yes に設定すると、 discard_zeroes_data = false を通知するバックエンドであっても DRBD は discard を使用し、 discard_zeroes_data = true を通知する。
discard-zeroes-if-aligned を no に設定すると、それぞれのバックエンドが discard_zeroes_data = false をアナウンスする場合、DRBD は常に受信側でゼロアウトにフォールバックし、プライマリ側では discard に関して通知しない。
私たちは、 discard_zeroes_data 設定を完全に無視していました。確立し、期待された動作を壊さず、シンプロビジョニング LV の fstrim がスペースを解放する代わりにスペースを使い果たさないためのデフォルト値は yes である。
このオプションは 8.4.7 から有効である。
read-balancing method
デフォルトは prefer-local である。このオプションは 8.4.1 から有効である。
rs-discard-granularity byte
この値は、下位ブロックデバイスの discard 粒度によって制約される。 rs-discard-granularity が下位ブロックデバイスの discard 粒度の乗数でない場合、DRBD はそれを切り上げる。この機能は、下位ブロックデバイスが discard コマンドの後に、ゼロを読み戻す場合にのみアクティブになる。
デフォルト値は 0 である。このオプションは 8.4.7 から有効である。
sndbuf-size size
rcvbuf-size size
timeout time
connect-int time
ping-int time
ping-timeout time
max-buffers number
ko-count number
max-epoch-size number
allow-two-primaries
unplug-watermark number
スタンバイ(セカンダリ) ノードで書き込まれていない書き込みリクエスト数が unplug-watermark を上回ると、下位デバイスに対して書き込みリクエストを送る。ストレージによっては小さい値でも良好な結果が得られるが、多くのデバイスでは max-buffers と同じ値を指定するときに最良の結果が得られる。デフォルト値は 128 で、指定できる最小値は 16、最大値は 131072 である。
cram-hmac-alg
shared-secret
after-sb-0pri policy
disconnect
discard-younger-primary
discard-older-primary
discard-zero-changes
discard-least-changes
discard-node-NODENAME
after-sb-1pri policy
disconnect
consensus
violently-as0p
discard-secondary
call-pri-lost-after-sb
after-sb-2pri policy
disconnect
violently-as0p
call-pri-lost-after-sb
always-asbp
このオプションを指定すると、両ノードのデータに関連性があるとして、スプリットブレイン発生後のポリシーが適用される。UUID の分析により 3 番目のノードの存在が疑われる場合には、フル同期が行われることがある。(または、なんらかの別の原因によって間違った UUID セットで判断してしまった場合)
rr-conflict policy
disconnect
violently
call-pri-lost
data-integrity-alg alg
このオプション値には、カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。一般的なカーネルの場合、少なくとも md5, sha1, crc32c のどれかが利用できる。デフォルトでは、この機能は無効である。
データ整合性に関する説明も参照のこと。
tcp-cork
on-congestion congestion_policy,
congestion-fill fill_threshold,
congestion-extents active_extents_threshold
DRBD-Proxy を使っている場合、送信キューが満杯になる直前に AHEAD/BEAIND モードに移行するのが望ましい。AHEAD/BEHIND モードでは、DRBD 間の通信は切断しないが、データレプリケーションは行われなくなる。
AHEAD/BEHIND モードの利点は、たとえ DRBD-Proxy のバッファがすべての書き込み要求を受け入れるのに十分でなくても、アプリケーションが遅くならないことである。欠点は、対向ノードが後れをとっているため、同期状態に戻すために再同期が必要になることである。再同期中対向ノードのデータは不整合状態のままとなる。
congestion_policy では block と pull-ahead が使用できる。デフォルトは block である。Fill_threshold は 0 から 10GiB までの値を指定できる。デフォルト値は 0 で、これはチェックが無効になることを意味する。Active_extents_threshold は、 al-extents と同じ制限がある。
AHEAD/BEHIND は DRBD8.3.10 以降で利用できる。
wfc-timeout time
degr-wfc-timeout time
outdated-wfc-timeout time
wait-after-sb
become-primary-on node-name
stacked-timeouts
resync-rate rate
use-rle
典型的なビットマップは、すべてがセットされていない (クリーン) あるいはセットされている (ダーティ) いくつかのエリアに分かれている。このため、単純ではあるがランレングス符号化を採用することにより、ビットマップ交換のためのネットワークトラフィックを顕著に減らすことができる。
過去のバージョンとの互換性のため、また高速ネットワークでは転送時間改善効果が少なく CPU 使用量が増えるため、デフォルトではこの機能は無効である。
socket-check-timeout value
このような場合、socket-check-timeout に DRBD と DRBD-Proxy 間の round trip time(RTT) を設定するとよい。たいていの場合 1 である。
デフォルトの単位は 10 分の 1 秒である。デフォルト値は 0 で socket-check-timeout 値の代わりに ping-timeout 値を使用する。8.4.5 から導入された。
resync-after res-name
al-extents extents
有効な最大値はもっと小さくなる点に注意が必要であり、メタデータのデバイスの作成方法によっても異なる。次のマニュアルページを参照、drbdmeta(8) を参照。有効な最大値は 919 * (使用できる オンディスクのアクティビティログのリングバッファ領域 /4KB -1) である。リングバッファはデフォルトで 32KB で、有効な最大値は 6433 である (データは 25GiB 以上カバーしている)。下位デバイスの量とレプリケーションリンク全体が 5 分以内で再同期できるようにすることを推奨する。
al-updates {yes | no}
verify-alg hash-alg
データ整合性に関する説明も参照のこと。
csums-alg hash-alg
帯域幅が小さい回線を使うとき、このオプションは有用である。クラッシュしたプライマリノードが復帰したとき、アクティビティログに記録されたすべてのブロックが再同期の対象となる。しかし大部分のブロックは同期が取れている。このため、 csums-alg を指定することによって、 CPU の使用量と引き換えに必要な転送量を減らせる。
c-plan-ahead plan_time,
c-fill-target fill_target,
c-delay-target delay_target,
c-max-rate max_rate
plan_time パラメータで調節機能の機敏さを設定する。大きな値を設定すると、調節機能のレスポンスが低下する。この値は最低でもネットワークの RTT の 5 倍以上を指定する。通常のデータ経路では fill_target に 4k から 100k を指定するのが適切である。DRBD-Proxy を使用する場合には、代わりに delay_target を使用するのが望ましい。delay_target は fill_target が 0 の場合にのみ使用できる。初期値は RTT の 5 倍が適切である。Max_rate には DRBD 間または DRBD-Proxy 間の帯域幅あるいはディスク帯域幅を指定する。
plan_time のデフォルト値は 0 で、0.1 秒単位で指定する。Fill_target のデフォルト値は 0 でセクタ数を指定する。Delay_target のデフォルト値は 1 (100 ミリ秒) で 0.1 秒単位で指定する。Max_rate のデフォルト値は 10240 (100MiB/s) で、 KiB/s 単位で指定する。
動的な再同期速度の調整と設定は、DRBD 8.3.9 から使用できる。
c-min-rate min_rate
0 という値には特別な意味がある事に注意が必要である。0 は再同期速度の制限を完全になくすため、アプリケーションの速度を劇的に低下させる可能性がある。アプリケーションの速度低下を避けたい場合には、この値に 1 を指定する。
注意:このパラメータ名は動的な調整速度の下限値のように見えるが、実際は異なる。DRBD-Proxy のバッファが満杯のとき、動的調整機能は c-min-rate の設定から独立して、再同期速度を 0 まで下げることができる。
The default value of min_rate is 250, in units of KiB/s
on-no-data-accessible ond-policy
ond-policy に suspend-io を設定すると、最後に接続していたデータストレージから、もしくは、 drbdadm resume-io res コマンドにより、 I/O を再開することができる。後者はもちろん I/O エラーを発生させる。
デフォルトは io-error である。この設定は、 DRBD 8.3.9 から有効である。
cpu-mask cpu-mask
pri-on-incon-degr cmd
pri-lost-after-sb cmd
pri-lost cmd
fence-peer cmd
local-io-error cmd
initial-split-brain cmd
split-brain cmd
before-resync-target cmd
after-resync-target cmd
include file-pattern
DRBD がミラーしたデータの整合性を保証する方法は 2 つあり、これらはそれぞれ別々のものである。オンライン照合と network セクションの data-integrity-alg である。
どちらのメカニズムの場合でも、データの転送中に DRBD の上位プログラムがディスクに書き込みを行った場合、不整合ではないのに不整合と判断されることがある。それはスワップの発生、グローバル同期中の付加、ワークロードの打ち切りや書き換えであるかもしれず、必ずしもデータ整合性の問題をもたらさない。通常イニシエータがデータ転送を行う際には、データブロックがディスク上のデータ構造の一部でない事を認識しているか、すぐに正確なデータで再実行される。
data-integrity-alg は、"Digest integrity check FAILED: Ns |x\n" というエラーを受信側のログに書きだす。 N は相殺されたセクタのオフセットで、x はバイト単位のリクエストサイズである。それから接続を切り、再接続して、迅速に再同期をする。同時に送信側が変更を検知した場合、"Digest mismatch, buffer modified by upper layers during write: Ns +x\n" という警告がでるが、これは誤検出である。変更されていないデータが tcp バッファにコピーされると、送信側はこれらのバッファの変化をすぐに検出するかもしれない。この場合、受信側はそれに気づかない。
直近の例 (2007 年) では系統的なデータ損傷のケースがあり、ギガビット NIC の TCP/IP オフロードエンジンとドライバが原因だった。メインメモリから NIC への DMA データ転送時にデータ破壊が起きていた。TCP チェックサムは NIC 側で計算されるため、この種のデータエラーは オンライン照合 verify または data-integrity-alg を使わない限り検出できない。
data-integrity-alg は CPU 負荷が大きいため、テスト期間中のみ使うことを推奨する。その後は、たとえば月に 1 回程度、負荷が低い時間帯にオンライン照合を実施するのが望ましい。
このドキュメントは DRBD バージョン 8.4.0 向けに改訂されている。
Written by Philipp Reisner <philipp.reisner@linbit.com> and Lars Ellenberg <lars.ellenberg@linbit.com>.
Report bugs to <drbd-user@lists.linbit.com>.
Copyright 2001-2008 LINBIT Information Technologies, Philipp Reisner, Lars Ellenberg. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
drbd(8), drbddisk(8), drbdsetup(8), drbdmeta(8), drbdadm(8), DRBD User's Guide[1], DRBD web site[3]
6 May 2011 | DRBD 8.4.0 |