Provided by: drbd-utils_9.11.0-1build1_amd64
NAME
drbd.conf - DRBD デバイスの設定ファイル
INTRODUCTION
/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] を参照
FILE FORMAT
本ファイルはセクションとパラメータで構成される。各セクションはキーワードで始まり、任意指定 のパラメータ、開き中括弧 (“{”) で始まる。閉じ中括弧 (“}”) でセクションが終わる。中括弧はパ ラメータを囲むのにも使われる。 section [name] { parameter value; [...] } パラメータ名と値の間にホワイトスペースが必要である。パラメータ名の後ろの文字列はパラメータ に対する値と見なされる。ブールパラメータは特別なパラメータで、パラメータ名だけで構成され る。パラメータの最後にセミコロン (“;”) が必要である。 いくつかのパラメータ値はデフォルトの単位を持つが、 K 、 M 、または G を明示的に指定するこ とによって単位を変えられる。これらの単位はコンピュータでおなじみの方法で定義される (K=2^10=1024, M=1024K, G=1024M)。 設定ファイルにコメントを記述できる。コメント行はハッシュ記号 (“#”) で始まらなければならな い。この文字以降行末までの文字がコメントと見なされる。 セクション skip このセクション内のテキストは、複数行にわたってすべてコメントと見なされる。キーワードの skip と開き中括弧 (“{”) の間にある文字は無視される。中括弧で囲まれたすべてが無視され る。何か 'resource [name] {...}' セクションをコメントアウトしたいとき、 'skip' を前に 置けばよいので便利である。 global いくつかの全般的なパラメータを記述する。現在 minor-count, dialog-refresh, disable-ip-verification, usage-count が許可されている。global セクションは 1 回だけ記 述でき、設定ファイルの先頭に書くのが望ましい。 common common セクションに記述したパラメータはすべてのリソースに継承される。このセクションに は、 startup, options, handlers, net, disk セクションがある。 resource name DRBD リソースを定義するセクションである。各リソースセクションは、 2 つ (またはそれ以 上) の on host セクションを持つ必要があり、必要に応じて startup, options, handlers, net, disk セクションを書くことができる。volume セクションを含ませることもできる。 on host-name このセクションを取り囲む resource セクションの中の DRBD デバイスの設定を指定す る。host-name は必須で、各ノードの Linux ホスト名 (uname -n) でなければならない。複数 のホスト名を指定しても構わないが、この場合、それぞれのホストは同じ設定でなければならな い。ただし、 IP アドレスに関しては、複数のホストの間で変更する必要がある。もしくは、こ のセクションを複数指定できる。 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 コネクションの範囲でボリュームを定義する。別のホストでは、レプリケートされたボリューム のマイナー番号が異なっている事があるため、ボリューム番号 (vnr) はこれらを結びつけ る。このセクションで必要なパラメータは device, disk, meta-disk である。 stacked-on-top-of resource 3 または 4 ノード構成のときのスタックした DRBD リソース(上位リソース)を指定するとき に、on セクションの代わりに stacked-on-top-of を指定する。このセクションには device, address が必須である。 floating AF addr:port このセクションを取り囲む resource セクションの中の DRBD デバイスの設定を指定する。この セクションは、on セクションと非常に類似性がある。on セクションとの違いは、ホスト名では なく IP アドレスでホスト名を照合することである。このセクションには、 device, disk, meta-disk が必要である。これらのパラメータを resource セクションに記述すると、このセク ションはこれらの値を継承できる。すべてを継承する場合、 IP アドレスを指定するだけでよ い。 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 このセクションは、下位ストレージに対する DRBD の取り扱いをチューニングするパラメータで 構成される。詳細は次のドキュメントを参照: drbdsetup(8) 。指定できるパラメータは次のと おり: on-io-error, size, fencing, disk-barrier, disk-flushes, disk-drain, md-flushes, max-bio-bvecs, resync-rate, resync-after, al-extents, al-updates, c-plan-ahead, c-fill-target, c-delay-target, c-max-rate, c-min-rate, disk-timeout, discard-zeroes-if-aligned, rs-discard-granularity, read-balancing. net このセクションは、DRBD のプロパティの取り扱いをチューニングするパラメータで構成され る。詳細は次のドキュメントを参照: drbdsetup(8) 。指定できるパラメータは次のとおり: protocol, sndbuf-size, rcvbuf-size, timeout, connect-int, ping-int, ping-timeout, max-buffers, max-epoch-size, ko-count, allow-two-primaries, cram-hmac-alg, shared-secret, after-sb-0pri, after-sb-1pri, after-sb-2pri, data-integrity-alg, no-tcp-cork, on-congestion, congestion-fill, congestion-extents, verify-alg, use-rle, csums-alg, socket-check-timeout. startup このセクションは、DRBD のプロパティの取り扱いをチューニングするパラメータで構成され る。詳細は次のドキュメントを参照: drbdsetup(8) 。指定できるパラメータは次のとおり: wfc-timeout, degr-wfc-timeout, outdated-wfc-timeout, wait-after-sb, stacked-timeouts and become-primary-on. options このセクションはリソースオブジェクトの取り扱いをチューニングするパラメータで構成され る。詳細は次のドキュメントを参照: drbdsetup(8) 。指定できるパラメータは次のとおり: cpu-mask, and on-no-data-accessible. handlers このセクションでは、特定のイベントへに応答して DRBD によって起動される(実行可能な)ハ ンドラを指定できる。指定できるパラメータは次のとおり: pri-on-incon-degr, pri-lost-after-sb, pri-lost, fence-peer (formerly oudate-peer), local-io-error, initial-split-brain, split-brain, before-resync-target, after-resync-target. 環境変数がインタフェースとなる: • DRBD_RESOURCE はリソース名である。 • DRBD_MINOR は DRBD デバイスの 10 進法のマイナー番号である。 • DRBD_CONF はプライマリ設定ファイルへの入り口である。設定を複数ファイルに分割した場 合 (例えば /etc/drbd.conf.d/ など) には、あまり役にたたない。 • DRBD_PEER_AF , DRBD_PEER_ADDRESS , DRBD_PEERS はそれぞれ、アドレスファミリ (ipv6 など)、対向ホストのアドレス、対向ホストのホスト名となる。 DRBD_PEER は推奨しない。 これらの設定がすべてのハンドラに設定されるわけではない。いくつかの値は floating 設定で は無効になる。 パラメータ minor-count count count には 1 から 1048575 の値を指定できる。 Minor-count は DRBD のサイジングための手がかりである。これは様々なメモリプールを適正サ イズにするのに役立つ。実際に使っているマイナー番号よりも大きな数を順に指定しなければい けない。デフォルトでは、現在定義されているリソースの数に加えてさらに 11 個のリソースを 定義できる。ただし最低でも 32 個は定義できる。 dialog-refresh time time は 0 または正の数を指定する。 ユーザダイアログは time 秒ごとに秒を作画する (time が 0 だと再作画しない)。デフォルト 値は 1 である。 disable-ip-verification 何らかの理由で drbdadm が ip または ifconfig コマンドで正常さを確認できない場合 disable-ip-verification を指定する。このオプションを指定することによって、 IP アドレス を検証しないようにできる。 udev-always-use-vnr udev が drbdadm にデバイス関連のシンボリックリンクのリストを要求すると、drbdadm は、リ ソースに明示的な volume VNR { } 定義があるか、暗黙的なボリューム番号 0 を持つ単一のボ リュームしかないかによって、異なる命名規則でシンボリックリンクを提示する: # 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 DRBD の利用者統計[2] に参加する。最も簡単な方法は、このオプションを yes に指定する。指 定できる値は yes, no, ask である。 protocol prot-id DRBD の TCP/IP の通信の際に使われる プロトコル を指定する。指定できるプロトコルは A, B, C である。 プロトコル A: ローカルディスクとローカル TCP 送信バッファにデータを書き込んだらディス クへの書き込みが完了したと判断する。 プロトコル B: ローカルディスクとリモートバッファキャッシュにデータを書き込んだらディス クへの書き込みが完了したと判断する。 プロトコル C: ローカルディスクとリモートディスクの両方にデータを書き込んだらディスクへ の書き込みが完了したと判断する。 device name minor nr 定義している DRBD リソースに対応するブロックデバイス名を指定する。アプリケーションで は、ここで指定する名前をデバイス名として指定する(ファイルシステムとして)。逆に、disk に指定したデバイス名を決して指定してはならない。 name, minor, minor number は省略する事ができる。name を省略すると、デフォルトの /dev/drbdminor が使われる。 udev は自動的に /dev/drbd/by-res と /dev/drbd/by-disk の中のシンボリックリンクを作成す る。 disk name DRBD はこのブロックデバイスに実際にデータの読み書きを行う。DRBD 動作中は、このデバイス に絶対に別の方法でアクセスしてはならない。この禁止事項には、次のコマンドやその他の類似 コマンドも含まれる: dumpe2fs(8)。 address AF addr:port それぞれが各対向デバイスからの接続を待ち受けるために、 デバイスごとに全てのリソースに IP アドレス が必要である。AF は ipv4, ipv6, ssocks or sdp (互換性のため sci はssocks へのエイリアスになっている) のなかから選択される。IPv4 の場合、これを省略できる。IPv6 を使う場合は、 ipv6 のキーワードに続けて角括弧の中に記載する。例: ipv6 [fd01:2345:6789:abcd::1]:7800。 各 DRBD リソースは、ノードのパートナーデバイスと接続するために TCP port が必要であ る。2 つの別の DRBD リソースが同じ addr:port の組み合わせを同一ノードで使用することは できない meta-disk internal, meta-disk device, meta-disk device [index] 内部 (internal) を指定すると、下位デバイスの最後の部分にメタデータが作られる。メタデー タのサイズはデバイスのサイズから計算される。 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 下位デバイスが I/O エラーを上位に伝えたときに実行する 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 fencing は、2 つのノードがともにプライマリで切り離された状態 (スプリットブレイン) にな る事を防ぐ手段である。 次のフェンシングポリシーを指定できる: dont-care デフォルトの設定値で、フェンシングのためのアクションを実行しない。 resource-only ノードが切り離されたプライマリ状態になると、他ノードを無効状態に変えようとする。こ の動作は fence-peer ハンドラによって行われる。このハンドラは他ノードにレプリケー ション用とは別のネットワーク経由でアクセスし、'drbdadm outdate res' を実行すること を想定している。 resource-and-stonith ノードが切り離されたプライマリ状態になると、 DRBD はすべてのディスク I/O を停止し て fence-peer ハンドラを呼び出す。このハンドラには、レプリケーション用とは別のネッ トワーク経由で他ノードにアクセスし、 'drbdadm outdate res' を実行するという機能を 想定している。ハンドラが他ノードに到達できない場合、 DRBD は STONITH 機能を使って 他ノードを強制排除する。これらが完了したら、ディスク I/O を再開する。ハンドラが失 敗した場合には、 resume-io コマンドでディスク I/O を再開できる。 disk-barrier, disk-flushes, disk-drain DRBD は下位デバイスに対する複数のディスク書き込みの間の依存関係を指定するための 4 種類 のオプションを用意している。そのうち、下位デバイスがサポートしていてユーザが無効に設定 していない最初のオプションが使用される。デフォルトでは flush メソッドが使われる。 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 下位デバイスがバリア (SCSI では "tagged command queuing"、SATA では "native com-mand queuing" と呼ばれる) をサポートしている場合、このオプションを選択でき る。このオプションを有効にするには disk-barrier オプションを yes にする。 flush 下位デバイスがディスクフラッシュ (ベンダーは "force unit access" と呼んでいる) を サポートしている場合、このオプションを選択できる。このオプションを無効にするには disk-flushes を no に設定する。 drain 3番目の方法は、単純に、最初の書き込みは次の書き込みリクエストを処理する前に吐き出 す、方法である。8.0.9 まではこれが唯一のオプションであった。 none 4番目の方法は、no-disk-drain を指定し、下位デバイスへの書き込みの依存関係を一切指 示しない方法である。これはほとんどの I/O スタックにおいて 危険 であり、ディスクへ の書き込み順序が入れ替わってしまう可能性がある。そうなると、理論的にはデータ破損の 原因、または DRBD プロトコルを乱し、再接続と切断を繰り返すような状態に陥る可能性が ある。no-disk-drain を 使ってはならない。 md-flushes メタデータデバイスへのアクセスにあたってバリアやフラッシュを使用しない。 disk-flushes についての説明を参照のこと。 max-bio-bvecs ある特別な環境において、デバイスマッパースタックは、複数の bvec を持つ制約に違反する BIO を merge_bvec() 関数の4番目の引数に設定し DRBD に渡す。 例えば、物理ディスク → DRBD → LVM → Xen → 誤ったパーティション(63) → DomU FS の場合である。Dom0 のカーネルロ グには、 "bio would need to, but cannot, be split:" と記録される。 最も良い回避方法は、VM の内部にパーティションを適切に配置する (例えば、セクタ 1024 か ら開始する) ことである。これは、ストレージ領域を 480 KiB を消費する。残念ながら、ほと んどの Linux パーティションツールは、奇数 (63) でパーティションを開始する。そのた め、ほとんどのディストリビューションは、仮想 Linux マシンにインストールを行うと、誤っ たパーティションで終了してしまう。第 2 の回避方法は、 BIO あたりの最大 DRBD bvecs (= max-bio-bvecs) を 1 にすることである。しかし、パフォーマンスは低下する。 max-bio-bvecs のデフォルト値は 0 で、これはユーザに制限が無いことを意味する。 disk-timeout DRBD デバイスがデータを格納する下位レベルデバイスが、指定した disk-timeout 以内で I/O リクエストを完了しない場合、DRBD はこれを障害とみなす。下位デバイスは切り離され、デバ イスのディスク状態はディスクレス状態になる。DRBD が 1 台以上の対向ノードに接続したと き、失敗したリクエストはそのうち 1 台に伝えられる。 このオプションは カーネルパニックを引き起こす可能性があり、注意が必要である。 リクエストの「中断」あるいはディスクの強制切り離しは、完全に下位デバイスをブロックまた はハンギングして、リクエストをまったく処理せずエラーも処理しなくなる。この状況ではハー ドリセットとフェイルオーバ以外になす術がない。 「中断」すると、基本的にローカルエラーの完了を装い、すみやかにサービスの移行を行うこと で安全な切り替えを行う。それでもなお、影響を受けるノードは "すぐ" に再起動される必要は ある。 リクエストを完了することで、上位レイヤーに関連するデータページを再利用させることができ る。 後にローカルの下位デバイスが「復帰」すると、ディスクから元のリクエストページへの DMA のデータは、うまくいくと未使用のページへランダムなデータを送るが、多くの場合その間に関 係のないデータに変形してしまい、様々なダメージの原因になる。 つまり遅延した正常な完了は、特に読み込みリクエストの場合 panic() の原因になる。遅延し た「エラー」完了は、その都度に通知は行うが、問題ないと考えてよい。 disk-timeout のデフォルト値は 0 であり、無限のタイムアウトを意味する。タイムアウトは 0.1 秒単位で指定する。このオプションは DRBD 8.3.12. から利用できる。 discard-zeroes-if-aligned {yes | no} Linux のブロックデバイスで discard/trim/unmap のサポートにはいくつかの側面があ る。discard が一般的にサポートされていても、暗黙に失敗したり、discard 要求を部分的に無 視したりすることがある。デバイスは、また、マップされていないブロックからの読み込み が、定義済みのデータ(通常はゼロ)、未定義のデータ(おそらく古いデータか、ゴミ)のどち らを返すか通知する。 異なるノードで 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 読み込みリクエストの負荷分散で使用できる methods は prefer-local, prefer-remote, round-robin, least-pending, when-congested-remote, 32K-striping, 64K-striping, 128K-striping, 256K-striping, 512K-striping, 1M-striping である。 デフォルトは prefer-local である。このオプションは 8.4.1 から有効である。 rs-discard-granularity byte rs-discard-granularity がゼロ以外の正の値に設定されている場合、DRBD はこのサイズで再 同期操作を要求する。そのようなブロックが同期ソースノード上にゼロバイトしか含まない場 合、同期ターゲットノードは、その領域に対して discard/trim/unmap コマンドを発行する。 この値は、下位ブロックデバイスの discard 粒度によって制約される。 rs-discard-granularity が下位ブロックデバイスの discard 粒度の乗数でない場合、DRBD は それを切り上げる。この機能は、下位ブロックデバイスが discard コマンドの後に、ゼロを読 み戻す場合にのみアクティブになる。 デフォルト値は 0 である。このオプションは 8.4.7 から有効である。 sndbuf-size size size は TCP ソケットのセンドバッファである。デフォルト値は 0 で自動調整される。これよ り小さい値も大きい値も指定できる。遅延が大きいネットワークに対してプロトコル A を指定 する場合に大きな値を指定すると、書き込みスループットを向上できる。32K より小さい値は現 実的ではない。8.0.13 から 8.2.7 までは、手動で 0 を設定しないと自動調整にならない。 rcvbuf-size size size は TCP ソケットの受信バッファサイズである。デフォルト値は 0 で自動調整される。こ れより小さい値も大きい値も指定できる。通常は、このオプションはデフォルト値のまま運用す る。size に 0 指定すると、カーネルが自動的に設定したバッファを使う。 timeout time 対向ノードからの応答パケットが 1/10 の time 倍の時間以内に返ってこない場合、対向ノード が死んだと判断して TCP/IP コネクションを切断する。この値は connect-int および ping-int よりも小さくなければならない。デフォルト値は 60 で、これは 6 秒に相当する。すなわちこ のパラメータの単位は 0.1 秒である。 connect-int time 対向ノードにただちに接続できない場合、DRBD は接続を繰り返し試行する。このパラメータは 試行間隔を指定する。デフォルト値は 10 で、このパラメータの単位は秒である。 ping-int time DRBD デバイス間の TCP/IP 接続があり、対向ノードから time 秒の間に何も通信が行われな かった場合、 DRBD は死活確認のためキープアライブパケットを生成する。デフォルト値は 10 で、このパラメータの単位は秒である。 ping-timeout time このパラメータで指定した時間内にキープアライブパケットに応答しなければならない。応答パ ケットが返ってこない場合、その対向ノードは死んだと判断される。デフォルト値は 500ms で、100ms 単位で指定する。 max-buffers number 再同期、オンライン照合を行う際に、受信側で DRBD マイナーデバイスあたりに使用するメモリ を制限する。単位は PAGE_SIZE で、ほとんどのシステムで 4KiB である。設定できる最小値は 32 (=128 KiB) でハードコードされている。これらバッファはディスクからの読み書きの際に データブロックを保持するために使用される。輻輳時のデッドロックを回避するために、この設 定はハード制限というよりは閾値として使用される。最大バッファページが使用されると、プー ルからのそれ以上の割り当てが制限される。受信側の I/O バックエンドに余裕がない場合に は、 max-buffers を増やすとよい。 ko-count number セカンダリノードが 1 回の書き込みリクエストに count 回以上失敗した場合、そのセカンダリ ノードはクラスタから排除される。(つまり、プライマリノードが接続をいったん終了し、再接 続する)。この機能を無効にするには、明示的に 0 に設定する必要がある。デフォルトはバー ジョン間で変更されている。 8.4 は 7 がデフォルト値である。 max-epoch-size number 書き込みバリア間に処理するデータブロックの最大数を指定する。10 未満の値を指定するとパ フォーマンスが低下することがある。 allow-two-primaries このオプションを指定すると、両ノードにプライマリを割り当てられる。このオプションは分散 共有ファイルシステムを使うときのみ指定する。現在 DRBD がサポートするファイルシステムは OCFS2 と GFS である。これら以外のファイルシステムを使うときにこのオプションを指定する と、データの破損とノードのダウンを引き起こす。 unplug-watermark number この設定は、最近の明示的にスタックプラギングを使用するカーネルには効果がない (Linux kernel 2.6.39 には移植されている)。 スタンバイ(セカンダリ) ノードで書き込まれていない書き込みリクエスト数が unplug-watermark を上回ると、下位デバイスに対して書き込みリクエストを送る。ストレージ によっては小さい値でも良好な結果が得られるが、多くのデバイスでは max-buffers と同じ値 を指定するときに最良の結果が得られる。デフォルト値は 128 で、指定できる最小値は 16、最 大値は 131072 である。 cram-hmac-alg 対向ノードの認証を行いたい場合、 +HMAC アルゴリズムを指定する。対向ノードの認証は行う べきである。チャレンジ-レスポンス方式で対向ノードを認証するのに、 HMA CFC アルゴリズム が使われる。/proc/crypto に記録されている任意のダイジェストアルゴリズムを指定できる。 shared-secret 対向ノードの認証には共有秘密鍵が使用され、64文字までで指定する。cram-hmac-alg を指定し ないと対向ノードの認証は行われない。 after-sb-0pri policy 指定できるポリシーは以下の通り: disconnect 自動再同期を行わず接続を切断する。 discard-younger-primary スプリットブレイン発生前にプライマリであったノードからの再同期を自動的に実行する。 discard-older-primary スプリットブレイン発生時にプライマリになったノードからの再同期を自動的に実行する。 discard-zero-changes プリットブレイン発生後どちらか一方のノードに書き込みがまったく行われなかったことが 明白な場合、書き込みが行われたノードから行われなかったノードに対する再同期が実行さ れる。どちらも書き込まれなかった場合は、 DRBD はランダムな判断によって 0 ブロック の再同期を実行する。両ノードに書き込みが行われた場合、このポリシーはノードの接続を 切断する。 discard-least-changes スプリットブレイン発生後、より多くのブロックを書き込んだノードから他方に対する再同 期を実行する。 discard-node-NODENAME 指定した名前のノードに対する再同期を実行する。 after-sb-1pri policy 指定できるポリシーは以下の通り: disconnect 自動再同期を行わず接続を切断する。 consensus after-sb-0pri アルゴリズムの結果が現在のセカンダリノードのデータを壊すことになる場 合、セカンダリノードのデータを捨てる。そうではない場合は接続を切断する。そうではな い場合は接続を切断する。 violently-as0p プライマリのデータに大きな変更がある場合でも、常に after-sb-0pri アルゴリズムの判 断を採用する。このポリシーは allow-two-primaries オプションを指定したうえで 1 ノー ドファイルシステム (OCF2 や GFS ではない) を使用し、かつ十分に理解している場合のみ 有用である。プライマリノードでファイルシステムをマウントしている場合、このポリシー は危険であり、マシンを破壊する可能性がある。 discard-secondary セカンダリ側のデータを捨てる。 call-pri-lost-after-sb after-sb-0pri アルゴリズムの判断を常に採用する。セカンダリ側のデータが正しいと判断 された場合には、現在のプライマリ側で "pri-lost-after-sb" ハンドラが呼び出される。 after-sb-2pri policy 指定できるポリシーは以下の通り: disconnect 自動再同期を行わず接続を切断する。 violently-as0p プライマリのデータに大きな変更がある場合でも、常に after-sb-0pri アルゴリズムの判 断を採用する。このポリシーは allow-two-primaries オプションを指定したうえで 1 ノー ドファイルシステム (OCF2 や GFS ではない) を使用し、かつ十分に理解している場合のみ 有用である。プライマリノードでファイルシステムをマウントしている場合、このポリシー は危険であり、マシンを破壊する可能性がある。 call-pri-lost-after-sb どちらか一方のマシンで "pri-lost-after-sb" ハンドラを呼び出す。このプログラムに は、マシンをリブートしてそのマシンをセカンダリにするような機能が要求される。 always-asbp 通常、3 番目のノードが存在しないことが現在の UUID 値から明らかな場合のみ、スプリットブ レイン発生後の修復ポリシーだけが適用される。 このオプションを指定すると、両ノードのデータに関連性があるとして、スプリットブレイン発 生後のポリシーが適用される。UUID の分析により 3 番目のノードの存在が疑われる場合に は、フル同期が行われることがある。(または、なんらかの別の原因によって間違った UUID セットで判断してしまった場合) rr-conflict policy このオプションは、再同期決定の結果がクラスタ内の現在のロール割り当てと互換性がない場合 を解決するのに役立つ。 disconnect 自動再同期を行わず接続を切断する。 violently プライマリノードへの同期が許可され、ブロックデバイス上のデータがノードの 1 つに対 して安定しているという前提に反す。危険なので使ってはならない。 call-pri-lost そのマシンがセカンダリに降格できる場合を除いて、いずれかのマシンの pri-lost-after-sb ヘルパープログラムを呼び出す。ヘルパープログラムはマシンを再起動 することが期待され、ノードをセカンダリにする。どのマシンがヘルパープログラムを実行 するかは、 after-sb-0pri ポリシーによって決定される。 data-integrity-alg alg ネットワーク経由で受け渡されるデータの整合性を担保するために、DRBD はハッシュ値を比較 する機能を備えている。通常は、TCP/IP パケット自体のヘッダに含まれる 16 ビットチェック サムで保証される。 このオプション値には、カーネルがサポートする任意のダイジェストアルゴリズムを指定でき る。一般的なカーネルの場合、少なくとも md5, sha1, crc32c のどれかが利用できる。デフォ ルトでは、この機能は無効である。 データ整合性に関する説明も参照のこと。 tcp-cork DRBD は、 TCP ソケットの TCP_CORK オプションを使って、いつ追加データを受け取るか、ある いは送信キューのデータをいつフラッシュするかのヒントを得ている。この方法が悪影響を及ぼ すネットワークスタックが少なくとも存在する。したがって、このオプションを導入された。 tcp-cork を no にセットすると、DRBD による TCP_CORK ソケットオプションの設定を無効にす る。 on-congestion congestion_policy, congestion-fill fill_threshold, congestion-extents active_extents_threshold デフォルトでは、 TCP 送信キューが一杯になると、 DRBD は書き込みをブロックする。このこ とは DRBD が TCP で送信できるデータ量を越えてディスクに書きこもうとするアプリケーショ ンの処理速度が低下することを意味する。 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 接続確立までの待機時間にタイムアウト値を設定する。 init スクリプト drbd(8) は、 DRBD リソースの接続が確立するまで待ち続ける。後に起動されるクラスタ管理システムは、通常はリ ソース内のスプリットブレイン状態まではチェックしない。待ち時間を制限したい場合には、こ のパラメータ値を設定する。デフォルト値は 0 で、タイムアウトせずに待ち続ける。単位は秒 である。 degr-wfc-timeout time クラスタが縮退した場合には、コネクションタイムアウトを待つ。縮退とは、片方のノードしか 動作していない状態を表す。このようなクラスタをリブートした場合には、対向ノードが一定時 間内に起動する可能性が低いため、wfc-timeout ではなく degr-wfc-timeout が使われる。0 を 指定すると、タイムアウトしなくなる。 outdated-wfc-timeout time 相手ノードが無効になってから、接続確立までの待機時間にタイムアウト値を設定する。無効に なった相手ノードが再起動されているデグレードクラスタ (1 つのノードしか残っていないクラ スタ) では、このタイムアウト値は wfc-timeout の代わりに使用される。なぜなら、相手ノー ドはその間プライマリになることを許可されていないためである。0 を指定すると、タイムアウ トしなくなる。 wait-after-sb このパラメータを指定すると、スプリットブレイン状態にあって接続自体が拒否されるような状 態でも、起動スクリプトは接続まで待ち続けるようになる。 become-primary-on node-name 起動時にプライマリになるべきノードの名前を指定する。node-name はホスト名またはキーワー ドの 両方 かもしれない。このパラメータが指定されていない場合は、両ノードともセカンダリ 状態で起動する。通常は、役割の決定をクラスタ管理システム (heartbeat など) に委ねること が多い。 stacked-timeouts スタックした上位デバイスについて、通常は wfc-timeout および degr-wfc-timeout は無視さ れる。コネクションタイムアウト値には、代わりに connect-int の 2 倍の時間が使われ る。stacked-timeouts を指定すると、DRBD は wfc-timeout および degr-wfc-timeout にもと づいて動作するようになる。スタックデバイスの対向ノードが多くの場合に利用できないケース や対向ノードがプライマリにならない場合に限って、このオプションを指定すべきである。誤用 すれば、予期しないスプリットブレインが起きるリスクが生じる。 resync-rate rate DRBD の上位で動作するアプリケーションの円滑な実行のために、バックグラウンドの同期作業 が利用する帯域幅を制限できる。デフォルト値は 250KB/秒、デフォルト単位は KB/秒であ る。K、 M、 G の接尾語を補って単位を変更できる。 use-rle 再同期開始時のハンドシェークの過程で各ノードのビットマップが交換され、ビット単位の OR 計算が行われる。これによって、どのブロックがダーティ (不一致) であるかについて、それぞ れのノードは共通の認識を持つ。大容量デバイスではビットマップも大きくなり、帯域幅が小さ いネットワークではその交換に時間を要する。 典型的なビットマップは、すべてがセットされていない (クリーン) あるいはセットされている (ダーティ) いくつかのエリアに分かれている。このため、単純ではあるがランレングス符号化 を採用することにより、ビットマップ交換のためのネットワークトラフィックを顕著に減らすこ とができる。 過去のバージョンとの互換性のため、また高速ネットワークでは転送時間改善効果が少なく CPU 使用量が増えるため、デフォルトではこの機能は無効である。 socket-check-timeout value DRBD-Proxy を使っていて大量のバッファを確保する必要がある環境では ping-timeout に非現 実的な大きな値を指定しなければならないことがある。TCP コネクションが開始したときの安定 するのを待つ局面でも、 DRBD はデフォルトで ping-timeout を使ってしまう。DRBD-Proxy は 通常、同じデータセンターに配置されているため、長い待機時間は DRBD の接続プロセスを妨げ る可能性がある。 このような場合、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 デフォルトでは全てのデバイスの再同期処理が並行して行われる。resync-after で依存性を定 義すると、リソース res-name が connected 状態 (つまり再同期の完了後) になってからリ ソースの再同期を開始する。 al-extents extents DRBD はホットエリアを自動的に検出する。このパラメータを指定すると、ホットエリアの大き さを制御できる。各エクステントは、下位デバイスの 4MB の領域になる。予定外の事情によっ てプライマリノードがクラスタから切り離されると、そのときのホットエリアのデータは、次回 接続したときの再同期の対象になる。このデータ構造は、メタデータ領域に書き込まれる。した がって、ホットエリアの状態更新は、メタデータデ バイスへの書き込みを引き起こす。エクス テント値を大きくすると、再同期所要時間が長くなるが、メタデータの更新頻度を減らすことが できる。 extents のデフォルト値は 1237 である。(最小値:7、最大値:65534) 有効な最大値はもっと小さくなる点に注意が必要であり、メタデータのデバイスの作成方法に よっても異なる。次のマニュアルページを参照、drbdmeta(8) を参照。有効な最大値は 919 * (使用できる オンディスクのアクティビティログのリングバッファ領域 /4KB -1) である。リン グバッファはデフォルトで 32KB で、有効な最大値は 6433 である (データは 25GiB 以上カ バーしている)。下位デバイスの量とレプリケーションリンク全体が 5 分以内で再同期できるよ うにすることを推奨する。 al-updates {yes | no} DRBD のアクティビティログ処理の書き込みによって、プライマリノードのクラッシュ後の部分 的な (ビットマップに基づく) 再同期でノードを up-to-date に復帰させる事ができるようにな る。al-updates を no に設定すると通常の運用パフォーマンスが向上するかもしれないが、ク ラッシュ時にプライマリが再接続した際にはフル同期となる。デフォルト値は yes である。 verify-alg hash-alg verify サブコマンドでディスク内容をオンライン照合する際、 DRBD はビット単位の比較では なく、ブロックごとのハッシュ値を計算し、対向ノードのハッシュ値と比較する。照合に利用す るハッシュアルゴリズムは、このパラメータで指定する。オプション値には、カーネルがサポー トする任意のダイジェストアルゴリズムを指定できる。一般的なカーネルの場合、少なくとも md5, sha1, crc32c のどれかが利用できる。デフォルトでは、この機能は無効である。オンライ ン照合を有効にするには、このパラメータを明示的に設定する必要がある。 データ整合性に関する説明も参照のこと。 csums-alg hash-alg csums-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 に正の値を指定すると、再同期速度を動的に調整できるようになる。これは、 fill_target に指定した一定速度で、あるいは delay_target に指定した一定の遅延でデータを 送信バッファに送り込むことによって実現される。調整における最大値は 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 同期元のプライマリノードは、アプリケーションの書き込みと再同期の書き込みの配分を管理す る必要がある。min_rate を指定すると、再同期のための帯域幅の最大値が min_rate にな り、利用可能な帯域幅の残りの部分をアプリケーション I/O のために確保する。 0 という値には特別な意味がある事に注意が必要である。0 は再同期速度の制限を完全になくす ため、アプリケーションの速度を劇的に低下させる可能性がある。アプリケーションの速度低下 を避けたい場合には、この値に 1 を指定する。 注意:このパラメータ名は動的な調整速度の下限値のように見えるが、実際は異な る。DRBD-Proxy のバッファが満杯のとき、動的調整機能は c-min-rate の設定から独立し て、再同期速度を 0 まで下げることができる。 Min_rate のデフォルト値は 4096(4MiB/s) であり、 KiB/s 単位で指定する。 on-no-data-accessible ond-policy この設定は、ディスクレスモードが発生した際の操作を指定する。設定できるポリシーは io-error と suspend-io である。 ond-policy に suspend-io を設定すると、最後に接続していたデータストレージから、もしく は、 drbdadm resume-io res コマンドにより、 I/O を再開することができる。後者はもちろん I/O エラーを発生させる。 デフォルトは io-error である。この設定は、 DRBD 8.3.9 から有効である。 cpu-mask cpu-mask DRBD のカーネルスレッドに CPU アフィニティマスクを設定する。cpu-mask のデフォルト値は 0 で、 DRBD のカーネルスレッドがマシン全体の CPU にまたがって動作することを意味してい る。この値は 16 進表現で指定する必要がある。値が大きすぎると切り捨てられる。 pri-on-incon-degr cmd このパラメータで指定するハンドラは、ノードがプライマリで、縮退 (片方のノードしか動作し ていない状態) し、ローカルのコピーデータに不整合がある場合に呼び出される。 pri-lost-after-sb cmd このパラメータで指定するハンドラはノードが現在プライマリで、スプリットブレイン後の自動 回復プロセスが失敗したときに呼び出される。その結果、このノードのデータが放棄されるよう にする。 pri-lost cmd このパラメータに指定したハンドラは、ノードが現在プライマリであるにもかかわらず、 DRBD のアルゴリズムが同期先だと判断した場合に実行される。このような状態になった場合、この ノードはプライマリであることをやめるべきである。 fence-peer cmd このパラメータはフェンシングメカニズムの一部を構成する。このパラメータに指定したハンド ラは、対向ノードを無効状態にする必要が生じたときに実行される。呼び出されたコマンドは、 DRBD が使っている通信経路とは別の経路を使うべきである。 local-io-error cmd このパラメータに指定したハンドラは DRBD がローカルの I/O サブシステムから I/O エラーを 受けた時に実行される。 initial-split-brain cmd DRBD がスプリットブレインを検出した場合に使用される。このハンドラはスプリットブレイン が発生した場合に警告を通知する。問題が解決した場合でも通知する。 split-brain cmd このパラメータに指定したハンドラは、スプリットブレイン状態が検出され、回復できない場合 に呼び出される。修復のための手作業が必要なので、このハンドラは、誰かにこのことを通知す るのが望ましい。 before-resync-target cmd このパラメータで指定したハンドラは、同期先で再同期が開始される直前に呼び出される。下位 ブロックデバイスのスナップショットを取得する、などの用途が考えられる。 after-resync-target cmd このパラメータで指定したハンドラは、不整合状態だったノードで、ディスクの再同期が完了し た直後に呼び出される。before-resync-target ハンドラで作成したスナップショットを削除す る、などの用途が考えられる。 Other Keywords include file-pattern file-pattern に指定したワイルドカード形式に合致する全てのファイルを組み込む。include ステートメントはトップレベルでのみ使用でき、セクション内では使用できない。
NOTES ON DATA INTEGRITY
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 回程度、負荷が低い時間帯にオンライン照合を実施するのが望ましい。
VERSION
このドキュメントは DRBD バージョン 8.4.0 向けに改訂されている。
AUTHOR
Written by Philipp Reisner <philipp.reisner@linbit.com> and Lars Ellenberg <lars.ellenberg@linbit.com>.
REPORTING BUGS
Report bugs to <drbd-user@lists.linbit.com>.
COPYRIGHT
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.
SEE ALSO
drbd(8), drbddisk(8), drbdsetup(8), drbdmeta(8), drbdadm(8), DRBD User's Guide[1], DRBD web site[3]
NOTES
1. DRBD User's Guide http://www.drbd.org/users-guide/ 2. DRBD の利用者統計 http://usage.drbd.org 3. DRBD web site http://www.drbd.org/