/etc/drbd.confはdrbdadmが読み込む設定ファイルである。
本ファイルの形式は、
クラスタを構成する2つのノード間で機械的にコピーしても問題が生じないようにデザイ
ンされている。
実際に、設定を管理できるためには、
一方のノードで作成したファイルを他ノードにコピーすることを強く推奨する。
/etc/drbd.confは、
クラスタを構成する2つのノードで同じ内容でなければならない。
本ファイルに施した変更は、ただちに反映されるものではない。
例A.1 簡単なdrbd.confの例
global { usage-count yes; }
common { syncer { rate 10M; } }
resource r0 {
protocol C;
net {
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
}
on alice {
device minor 1;
disk /dev/sda7;
address 10.1.1.31:7789;
meta-disk internal;
}
on bob {
device minor 1;
disk /dev/sda7;
address 10.1.1.32:7789;
meta-disk internal;
}
}
上の例はr0という名前の1つのDRBDリソースを設定している。
ノード間の通信プロトコルはCである。
ホストaliceでは、
アプリケーションに対して/dev/drbd1というデバイス名を提供する。
このデバイスに対する低レベルのデバイスは/dev/sda7になる。
IPアドレスには2ノード間の通信に使うネットワークインタフェースのIPアドレスを指定している。
DRBDの再同期には10メガバイト/秒の帯域を使うことができる。
1つのdrbd.confに複数のリソースセクションを書くことができる。 より詳しくは、 DRBDユーザーズガイドを参照すること。
本ファイルはセクションとパラメータで構成される。セクションは、キーワード、任意指定のパラメータ、開き中括弧(「{」)で始まる。閉じ中括弧でセクションが終わる。中括弧はパラメータを囲むのにも使われる。
section [name] { parameter value; [...] }
パラメータ名と値の間にホワイトスペースが必要である。パラメータ名の後ろの文字列はパラメータに対する値と見なされる。ブールパラメータは特別なパラメータで、パラメータ名だけで構成される。パラメータの最後にセミコロン(「;」)が必要である。
いくつかのパラメータ値はデフォルトの単位を持つが、K、M、またはGを明示的に指定することによって単位を変えられる。これらの単位はコンピュータでおなじみの方法で定義される(K = 2^10 = 1024、M = 1024 K、G = 1024 M)。
設定ファイルにコメントを記述できる。コメント行はハッシュ記号(「#」)で始まらなければならない。この文字以降行末までの文字がコメントと見なされる。
skip
このセクション内のテキストは、複数行にわたってすべてコメントと見なされる。キーワードskipと開き中括弧(「{」)の間の文字も無視される。このセクションは、定義済みの他のセクション全体を無効にするときに便利である。たとえば'resource [name] {...}'というセクション全体をskipセクションで囲むことができる。
global
いくつかの全般的なパラメータを記述する。現在minor-count、dialog-refresh、disable-ip-verification、およびusage-countパラメータが許されている。globalセクションは1回だけ記述でき、設定ファイルの先頭に書くのが望ましい。
common
commonセクションに記述したパラメータはすべてのリソースに継承される。このセクションには、startup、syncer、handlers、netおよびdiskセクションを書くことができる。
resource name
DRBDリソースを定義するセクションである。各リソースセクションは、2つ(またはそれ以上)のon セクションを持つ必要があり、必要に応じてhoststartup、syncer、handlers、netおよびdiskセクションを書くことができる。このセクションに指定しなければならない必須パラメータはprotocolである。
on host-name
リソースを構成する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セクションキーワードも参照すること。このセクションには、device、disk、address、meta-diskおよびflexible-meta-diskパラメータが必須である。
stacked-on-top-of resource
3または4ノード構成のときのスタックしたDRBDリソース(上位リソース)を指定するときに、
onの代わりにstacked-on-top-ofを指定する。この
セクションにはdeviceおよびaddressが必須である。
floating AF addr:port
このセクションを取り囲むresourceセクションの中のDRBDデバイスの設定を指定する。onとの違いは、ホスト名ではなくIPアドレスでホスト名を照合することであう。このセクションには、device、disk、meta-diskおよびflexible-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、use-bmbv、no-disk-barrier、no-disk-flushes、no-disk-drain、no-md-flushes、max-bio-bvecs。
net
このセクションは、ネットワークに対するDRBDの取り扱いをチューニングするパラメータで構成される。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: 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。
startup
このセクションはDRBDの振る舞いをチューニングするパラメータを含む。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: wfc-timeout、degr-wfc-timeout、outdated-wfc-timeout、wait-after-sb、stacked-timeouts、become-primary-on。
syncer
このセクションは同期デーモンの振る舞いをチューニングするパラメータを含む。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: rate、after、al-extents、use-rle、cpu-mask、verify-alg、csums-alg。
handlers
このセクションは、DRBDが特定のイベントに応じて実行するハンドラ(実行可能プログラム)を登録する。指定できるパラメータは次のとおり。pri-on-incon-degr、pri-lost-after-sb、pri-lost、fence-peer (以前のパラメータ名はoudate-peer)、local-io-error、split-brain、before-resync-target、after-resync-target。
minor-count count
DRBDカーネルモジュールをロードしなおすことなく多数のリソースを定義したい場合、minor-countを指定する。デフォルトでは、現在定義されているリソースの数に加えてさらに11個のリソースを定義できる。ただし最低でも32個は定義できる。
dialog-refresh time
ダイアログを再描画する時間間隔をtime秒に設定する。ゼロを指定すると再描画は行われない。デフォルト値は1である。
disable-ip-verification
何らかの理由でdrbdadmがipまたはifconfigコマンドを使ってIPアドレスの正常さを検証できない場合、disable-ip-verificationを指定する。このオプションを指定することによって、IPアドレスを検証しないようにできる。
usage-count val
DRBDの利用者統計DRBD's online usage counterに参加するには、このオプションにyesを指定する。指定できる値は、yes、no、またはaskである。
protocol prot-id
TCP/IPの通信の際に使われるDRBDのプロトコルを指定する。prot-idにはA、BまたはCを指定する。
プロトコルA: ローカルディスクとローカルTCP送信バッファにデータを書き込んだら ディスクへの書き込みが完了したと判断する。
プロトコルB: ローカルディスクとリモートバッファキャッシュにデータを書き込んだらディスクへの書き込みが完了したと判断する。
プロトコルC: ローカルディスクとリモートディスクの両方にデータを書き込んだらディスクへの書き込みが完了したと判断する。
device name minor nr
定義しているDRBDリソースに対応するブロックデバイス名を指定する。アプリケーション(通常はファイルシステム)では、ここで指定する名前をデバイス名として指定する。逆に、diskに指定したデバイス名を決して指定してはならない。
nameまたはminorとnr (マイナー番号)を省略することができる。nameを省略すると、デフォルトの/dev/drbdminorが使われる。
udevは自動的に/dev/drbd/by-resと/dev/drbd/by-diskの中のシンボリックリンクを作成する。
disk name
ブロックデバイス名を指定する。DRBDはこのデバイスを対象にデータを読み書きする。DRBD動作中は、このデバイスを絶対に別の方法でアクセスしてはならない。この禁止事項には、dumpe2fs(8)やその他の類似コマンドも含まれる。
address AF addr:port
すべてのリソースのすべてのデバイスには、それぞれに対応したaddr (IPアドレス)を指定する必要がある。このアドレスは対向ノードからの接続を受け付けるために使われる。AFはipv4、ipv6またはssocksのどれかを指定する(互換性の観点からsciをssocksの代わりに指定できる)。IPv4の場合AFは省略できる。IPv6アドレスを指定する場合は、ipv6に続けて角括弧で囲んだアドレスを指定する(例:ipv6 [fd01:2345:6789:abcd::1]:7800)。
さらに各TCPポート番号も指定する必要がある。複数のDRBDリソースで同一のIP:portを共用することはできない。
meta-disk internal
,
flexible-meta-disk internal
,
meta-disk device [index]
,
flexible-meta-disk device
内部(internal)を指定すると、下位デバイスの最後の部分にメタデータが作られる。内部メタデータの場合、[index]は指定できない。meta-disk、flexible-meta-diskのどちらを指定した場合も、デバイスの残りの部分に見合った必要なサイズの内部メタデータ領域が確保される。
deviceを指定すると、
そのデバイスにDRBDデバイスに対応したメタデータがそのデバイスに書き込まれる。
たとえば、2つのリソースに対して、それぞれmeta-disk /dev/hde6[0];、および
meta-disk /dev/hde6[1];を指定できる。この例の場合、少なくとも256MB以上の
メタディスク領域が必要である。
flexible-meta-diskキーワードに
ブロックデバイス名を指定できる。
このキーワードは通常LVMと組み合わせて
多数の異なったサイズのブロックデバイスを扱うときに指定する。
メタディスクに必要なサイズは、36kB + Backing-Storage-size / 32kとなり、
実際のサイズはこの値を4キロバイト単位で切り上げたものになる。
おおまかな目安を得るには、
ストレージサイズ1ギガバイトごとにに対して32キロバイト、
これをメガバイト単位で切り上げる。
on-io-error handler
下位デバイスが入出力エラーを返したときに実行するハンドラを指定する。
handlerに指定できる値は、
pass_on、call-local-io-error、
またはdetachのどれかである。
pass_on: 入出力エラーを上位レイヤに報告する。
プライマリ側ではファイルシステムにエラーを伝える。
セカンダリ側では何も報告しない。
call-local-io-error: ハンドラスクリプトlocal-io-errorを
呼び出して実行する。
detach: 低レベルデバイスを切り離して、
ディスクレスモードで処理を続行する。
fencing fencing_policy
フェンシングは、2つのノードがともにプライマリになること(スプリットブレイン)を防止し、 どちらかを切り離す防御手段のことである。
次のフェンシングポリシーを指定できる。
dont-care
デフォルトの設定値で、フェンシングのためのアクションを実行しない。
resource-only
ノードが切り離されたプライマリ状態になると、 DRBDは、DRBDはfence-peerハンドラを実行して 他ノードを期限切れ状態に変えようとする。 このハンドラには、他ノード上に代替ネットワーク経路で接続し、 'drbdadm outdate res'を実行することが期待される。
resource-and-stonith
ノードが切り離されたプライマリ状態になると、DRBDはすべてのディスクI/Oを停止して
fence-peerハンドラを呼び出す。
このハンドラには、他ノード上に代替ネットワーク経路で接続し、
'drbdadm outdate res'を実行することが期待される。
ハンドラが他ノードに到達できない場合、
DRBDはSTONITH機能を使って他ノードを強制排除する。
これらが完了したら、ディスクI/Oを再開する。
ハンドラの実行が失敗した場合、
drbdsetupのresume-ioコマンドを使って
ディスクI/Oを復旧させることができる。
use-bmbv
下位ストレージのドライバがmerge_bvec_fn()関数を備えている場合、 DRBDは4キロバイトを越えない単位でのディスクI/Oリクエストだけを処理する。 本マニュアル執筆時点では、この機能を備えているドライバは、 md (ソフトウエアRAID)、dm (デバイスマッパ - LVM)、およびDRBD自身だけである。
ソフトウェアRAIDやその他のmerge_bvec_fn()関数を持つドライバの上位で DRBDを使う場合であって、 全部のクラスタ構成ノードで同関数が同様に振る舞うことがわかっている場合 (すなわちソフトウェアRAIDなどを構成する物理的なディスクが同タイプである場合)、 最高のパフォーマンスを得るにはこのパラメータを設定すべきである。 このオプションは、何をしているのかを理解した上でのみ使うように。
no-disk-barrier
,
no-disk-flushes
,
no-disk-drain
DRBDは下位デバイスに対する複数のディスク書き込みの間の依存関係を指定するための 4種類のオプションを用意している。 そのうちで、下位デバイスがサポートしていてユーザが無効に設定していない 最初のオプションが使用される。
手法を選択するにあたっては、 測定可能なパフォーマンスデータのみに頼るべきではない。 下位デバイスが揮発性の書き込みキャッシュしか持たない場合 (通常のハードディスクや通常のハードディスクだけで構成されるRAIDなど)、 以下の最初の2つのオプションを指定すべきである。 下位デバイスにバッテリバックアップ機能付きの書き込みキャッシュがある場合には、 3および4番目のオプションが利用できる。 このような場合、4番目のオプションがもっとも高いパフォーマンスを発揮する。
残念なことに、デバイスマッパ(LVM)はバリアをサポートしていない。
/proc/drbd出力の"wo:"の後ろに下位デバイスに対する現在の設定がb、f、d、nという文字で表示される。
下位デバイスがバリア
(SCSIでは"tagged command queuing"、SATAでは"native command queuing"と呼ばれる)を
サポートしている場合、このオプションを選択できる。
このオプションを無効にするにはno-disk-barrierを
明示的に指定する。
下位デバイスがディスクフラッシュ
(ベンダーは"force unit access"と呼んでいる)をサポートしている場合、
このオプションを選択できる。
このオプションを無効にするにはno-disk-flushesを
明示的に指定する。
最初の書き込みは次の書き込みリクエストを処理する前に完了しなければならない。
このオプションは8.0.9までの唯一の処理方法であった。
no-disk-drainを指定することによって、このオプションを無効にできる。
4番目のオプションは、下位デバイスへの書き込みと書き込みの間に 明示的な依存関係を定義しない。
no-md-flushes
メタデータデバイスへのアクセスにあたって
バリアやフラッシュを使用しない。
no-disk-flushesについての説明を参照のこと。
max-bio-bvecs
In some special circumstances the device mapper stack manages to pass BIOs to DRBD that violate the constraints that are set forth by DRBD's merge_bvec() function and which have more than one bvec. A known example is: phys-disk -> DRBD -> LVM -> Xen -> missaligned partition (63) -> DomU FS. Then you might see "bio would need to, but cannot, be split:" in the Dom0's kernel log.
The best workaround is to proper align the partition within the VM (E.g. start it at sector 1024). Costs 480 KiByte of storage. Unfortunately the default of most Linux partitioning tools is to start the first partition at an odd number (63). Therefore most distribution's install helpers for virtual linux machines will end up with missaligned partitions. The second best workaround is to limit DRBD's max bvecs per BIO (= max-bio-bvecs) to 1. Might cost performance.
The default value of max-bio-bvecs is 0, which means that
there is no user imposed limitation.
sndbuf-size size
TCPソケットの送信バッファサイズをsizeに指定する。
デフォルト値は128Kである。
これより小さい値も大きい値も指定できる。
遅延が大きいネットワークに対してプロトコルAを指定する場合に大きな値を指定すると、
書き込みスループットを向上できる。
しかし極端に大きな値、たとえば1Mなどを指定すると、問題が生じる可能性がある。
また、32Kより小さい値は現実的ではない。
rcvbuf-size size
TCPソケットの受信バッファサイズをsizeに指定する。
デフォルト値は128Kである。
これより小さい値も大きい値も指定できる。
通常は、このオプションはデフォルト値のまま運用する。
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
2つのDRBDドライバ間の接続が確立していて、
time秒の間に何も通信が行われなかった場合、
DRBDは対向ノードが生きているか確認するためのパケットを送出する。
デフォルト値は10で、このパラメータの単位は秒である。
ping-timeout time
ping-intパケットに対して 対向ノードはこのパラメータに指定した時間以内に応答しなければならない。 応答パケットが返ってこない場合、その対向ノードは死んだと判断される。 デフォルト値は500msで、100ms単位で指定する。
max-buffers number
DRBDに割り当てるバッファの最大数を指定する。 単位はPAGE_SIZEで、ほとんどのシステムで4kBである。 最小値は32 (=128 KB)にハードコードされている。 良好な環境の場合、このパラメータを大きく設定することによって 良好な結果が期待できる。 このバッファは、ディスクに書き込み中のデータブロックを保持するのに使われる。
ko-count number
セカンダリノードが書き込みリクエストをcount回以上
失敗した場合、そのセカンダリノードはクラスタから排除され、
プライマリノードはStandAloneモードに遷移する。
デフォルト値は0で、これは本機能が無効になることを意味する。
max-epoch-size number
書き込みバリア間に処理するデータブロックの最大数を指定する。 10未満の値を指定するとパフォーマンスが低下することがある。
allow-two-primaries
このオプションを指定すると、両ノードがともにプライマリになれる。 このオプションは、 DRBDの上位に分散ファイルシステムを使っている場合のみ指定すべきである。 本マニュアル執筆時点でサポートされるファイルシステムはOCFS2とGFSのみである。 他のファイルシステム利用時にこのオプションを指定すると、ノードとデータを破壊する。
unplug-watermark number
セカンダリノード上に書き込まれていない書き込みリクエスト数がこの値を上回ると、 下位デバイスに対して書き込みリクエストを送る。 ストレージによっては小さい値でも良好な結果が得られるが、 多くのデバイスではmax-buffersと同じ値を指定するときに最良の結果が得られる。 デフォルト値は128で、指定できる最小値は16、最大値は131072である。
cram-hmac-alg
対向ノードの認証を行いたい場合、HMACアルゴリズムを指定する。 対向ノードの認証は行うべきである。 チャレンジ-レスポンス方式で対向ノードを認証するのに、HMACアルゴリズムが使われる。 /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オプションを指定した上で
OCFS2および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オプションを指定した上で
OCFS2およびGFS以外の通常のファイルシステムを利用した場合、
さらにこのポリシーを指定していることを明確に意識している場合のみ有用である。
このポリシーは危険である。
プライマリノード側でファイルシステムをマウントしている場合、
マシンがクラッシュする可能性がある。
call-pri-lost-after-sb
どちらか一方のマシンでpri-lost-after-sbハンドラを呼び出す。 このプログラムには、 マシンをリブートし、そのマシンをセカンダリにするような機能が要求される。
always-asbp
3番目のノードが存在しないことが現在のUUID値から明らかな場合、 通常のスプリットブレイン発生後の修復ポリシーたけが適用される。
このオプションを指定すると、 両ノードのデータに関連性があると認められる場合のみ 通常のスプリットブレイン発生後のポリシーが適用される。 UUIDの分析により3番目のノードの存在が疑われる場合や、 なんらかの別の原因によって間違ったUUIDセットで判断してしまった場合には、 フル同期が行われるかもしれない。
rr-conflict
policy
再同期に関する判断と現在のクラスタ状態における役割が食い違った場合の ポリシーを指定する。
disconnect
自動再同期を行わず接続を切断する。
violently
どちらか一方のノードのデータは安定であるという前提を無視して、 プライマリノードへの同期を許可する。 このオプションは危険で、使ってはいけない。
call-pri-lost
pri-lostハンドラを呼び出す。 このプログラムには、 マシンをリブートしてそのマシンをセカンダリにするような機能が要求される。
data-integrity-alg
alg
ネットワーク経由で受け渡されるデータの整合性を担保するために、 DRBDはハッシュ値を比較する機能を備えている。 通常は、TCP/IPパケット自体のヘッダに含まれる16ビットチェックサムで保証される。
オプション値には、
カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。
一般的なカーネルの場合、少なくとも
md5、sha1またはcrc32cの
どれかが利用できる。
デフォルトでは、この機能は無効である。
データ整合性に関する説明を参照のこと。
no-tcp-cork
DRBDは、TCPソケットのTCP_CORKオプションを使って、 いつ追加データを受け取るか、あるいは送信キューのデータをいつフラッシュするかの ヒントを得ている。 一方、この方法が悪影響を及ぼすネットワークスタックが少なくとも存在することが 判明している。 このオプションを指定すると、TCP_CORKソケットオプションのセットやリセットが 無効になる。
wfc-timeout time
接続確立までの待機時間にタイムアウト値を設定する。 drbd(8) は、DRBDリソースの接続が確立するまで待ち続ける。 後に起動されるクラスタマネージャは、 通常はリソース内のスプリットブレイン状態まではチェックしない。 待ち時間を制限したい場合には、このパラメータ値を設定する。 デフォルト値は0で、タイムアウトせずに待ち続ける。 単位は秒である。
degr-wfc-timeout time
縮退運転中のクラスタにおける接続タイムアウトを指定する。 縮退とは、片方のノードしか動作していない状態を表す。 このようなクラスタをリブートした場合には、 対向ノードが一定時間内に起動する可能性が低いため、 wfc-timeoutではなくこのパラメータ値が使われる。 デフォルト値は60秒で、秒単位で指定する。 0を指定すると、タイムアウトしなくなる。
outdated-wfc-timeout time
Wait for connection timeout, if the peer was outdated. In case a degraded cluster (= cluster with only one node left) with an outdated peer disk is rebooted, this timeout value is used instead of wfc-timeout, because the peer is not allowed to become primary in the meantime. Value 0 means unlimited.
wait-after-sb
このパラメータを指定すると、 スプリットブレイン状態にあって接続自体が拒否されるような状態でも、 起動スクリプトは接続まで待ち続けるようになる。
become-primary-on node-name
起動時にプライマリになるべきノードの名前を指定する。
node-nameにはホスト名または
キーワードbothを指定する。
このパラメータが指定されていない場合は、両ノードともセカンダリ状態で起動する。
通常は、役割の決定をクラスタマネージャ(heartbeatなど)に委ねることが多い。
stacked-timeouts
スタックした上位デバイスについて、
通常はwfc-timeoutおよびdegr-wfc-timeoutは無視される。
コネクションタイムアウト値には、代わりにconnect-intの2倍の時間が使われる。
stacked-timeoutsを指定すると、DRBDは
wfc-timeoutおよびdegr-wfc-timeoutにもとづいて
動作するようになる。
スタックデバイスの対向ノードが多くの場合に利用できないケースや
対向ノードがプライマリにならない場合に限って、
このオプションを指定すべきである。
誤用すれば、予期しないスプリットブレインが起きるリスクが生じる。
rate rate
DRBDの上位で動作するアプリケーションの円滑な実行のために、 バックグラウンドの同期作業が利用するバンド幅を制限できる。 デフォルト値は250KB/秒。 デフォルトの単位はKB/秒だが、K、M、Gの接尾語を補って単位を変更できる。
after res-name
デフォルトでは、DRBDは複数リソースの再同期を並行して実行する。
このパラメータを指定すると、
res-nameが接続完了してから、
すなわち再同期が実行された場合にはそれが終了してから、
他のリソースの再同期を実行する。
al-extents extents
DRBDはホットエリア(アクティブセット)を自動的に検出できる。
このパラメータを指定すると、ホットエリアの大きさを制御できる。
各エクステントは、下位デバイスの4メガバイトの領域になる。
予定外の事情によってプライマリノードがクラスタから切り離されると、
そのときのホットエリアのデータは、次回接続したときの再同期の対象になる。
このデータ構造は、メタデータ領域に書き込まれる。
したがって、アクティブセットの状態更新は、
メタデータデバイスへの書き込みを引き起こす。
エクステント値を大きくすると、再同期所要時間が長くなるが、
メタデータの更新頻度を減らすことができる。
extentsのデフォルト値は127で、指定できる最小値は7、
最大値は3843である。
verify-alg hash-alg
verifyサブコマンドでディスク内容をオンライン照合する際、
DRBDはビット単位の比較ではなく、ブロックごとのハッシュ値を計算し、
対向ノードのハッシュ値と比較する。
照合に利用するハッシュアルゴリズムは、このパラメータで指定する。
オプション値には、
カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。
一般的なカーネルの場合、少なくとも
md5、sha1またはcrc32cの
どれかが利用できる。
デフォルトでは、この機能は無効である。
オンライン照合を有効にするには、このパラメータを明示的に設定する必要がある。
データ整合性に関する説明を参照のこと。
csums-alg hash-alg
csums-algが指定されていない場合、
再同期プロセスはすべてのマークされたデータブロックを
コピー元からコピー先に転送する。
このオプションを指定すると、マークされたデータブロックのハッシュ値を最初に送り、
ハッシュ値が一致しないブロックについてのみデータを転送する。
バンド幅が小さい回線を使うとき、このオプションは有用である。
クラッシュしたプライマリノードが復帰したとき、
アクティビティログに記録されたすべてのブロックが
再同期の対象となる。
しかし大部分のブロックは同期が取れている。
このため、csums-algを指定することによって、
CPUの使用量と引き換えに必要な転送量を減らせる。
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
split-brain cmd
このパラメータに指定したハンドラは、 スプリットブレイン状態が検出されたときに実行される。 修復のための手作業が必要なので、 このハンドラは、誰かにこのことを通知するのが望ましい。
before-resync-target cmd
同期先のノードで再同期を開始する直前にこのハンドラが呼び出される。 下位ブロックデバイスのスナップショットを取得する、などの用途が考えられる。
after-resync-target cmd
同期先のノードで、同期中に不整合があって同期によって整合状態になったときに、
再同期終了直後にこのハンドラが呼び出される。
before-resync-targetハンドラで取得したスナップショットを
解放する、などの用途が考えられる。
DRBDがミラーしたデータの整合性を保証する方法は2つあり、これらは互いに別々のものである。
オンライン照合とnetworkセクションのdata-integrity-algである。
どちらのメカニズムの場合でも、 データの転送中にDRBDの上位プログラムがディスクに書き込みを行った場合、 不整合ではないのに不整合と判断されることがある。 現在のところ、スワップとReiserFSがそのようなプログラムだと判明している。 どちらの場合も、これは問題にはならない。 データ転送が起きたとき、そのデータブロックがディスク上のデータ構造と同じではないことを、その転送を起こしたプログラムはすでに知っているためである。
2007年に起きた系統的なデータ損傷のケースの場合、原因はあるギガビットNICのTCP/IPオフロードエンジンとドライバが原因であった。メインメモリからNICへのDMAデータ転送時にデータ破壊が起きていた。TCPチェックサムはNIC側で計算されるため、この種のデータエラーはオンライン照合またはdata-integrity-algを使わない限り検出できない。
data-integrity-algはCPUの負担が大きいため、テスト期間中のみ使うことを推奨する。
その後は、たとえば月に1回程度、負荷が低い時間帯にオンライン照合を実施するのが望ましい。