名前

drbd.conf — DRBDデバイスの設定ファイル

はじめに

/etc/drbd.confdrbdadmが読み込む設定ファイルである。

本ファイルの形式は、クラスタを構成する2つのノード間で機械的にコピーしても問題が生じないようにデザインされている。実際に、設定を管理できるためには、一方のノードで作成したファイルを他ノードにコピーすることを強く推奨する。/etc/drbd.confは、クラスタを構成する2つのノードで同じ内容でなければならない。本ファイルに施した変更は、ただちに反映されるものではない。

例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

このセクション内のテキストは、複数行にわたってすべてコメントと見なされる。このセクション内のテキストは、複数行にわたってすべてコメントと見なされる。このセクションは、定義済みの他のセクション全体を無効にするときに便利である。たとえば'resource [name] {...}'というセクション全体をskipセクションで囲むことができる。

global セクション

いくつかの全般的なパラメータを記述する。現在minor-countdialog-refreshdisable-ip-verification、およびusage-countパラメータが許されている。globalセクションは1回だけ記述でき、設定ファイルの先頭に書くのが望ましい。

common

commonセクションに記述したパラメータはすべてのリソースに継承される。このセクションには、startupsyncerhandlersnetおよびdiskセクションを書くことができる。

resource name

DRBDリソースを定義するセクションである。各リソースセクションは、2つ(またはそれ以上)のon hostセクションを持つ必要があり、必要に応じてstartupsyncerhandlersnetおよびdiskセクションを書くことができる。このセクションに指定しなければならない必須パラメータはprotocolである。

on host-name

このセクションを取り囲むresourceセクションの中のDRBDデバイスの設定を指定する。host-nameは必須で、各ノードのLinuxホスト名(uname -n)でなければならない。DRBDの通信に使うIPアドレスが複数ホスト間で移動するとき(HAクラスタの仮想IPアドレスのような場合)には、onに複数のホスト名を指定できる。または1つの resource セクションの中に複数の on セクションを記述する。

	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セクションキーワードも参照すること。このセクションには、devicediskaddressmeta-diskおよびflexible-meta-diskパラメータが必須である。

stacked-on-top-of リソース

3または4ノード構成のときのスタックしたDRBDリソース(上位リソース)を指定するときに、onの代わりにstacked-on-top-ofを指定する。このセクションにはdeviceおよびaddressが必須である。

floating AF addr:port

このセクションを取り囲むresourceセクションの中のDRBDデバイスの設定を指定する。このセクションは、onセクションと非常に類似性がある。onとの違いは、ホスト名ではなくIPアドレスでホスト名を照合することである。このセクションには、devicediskmeta-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, disk-timeout.

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, on-congestion, congestion-fill, congestion-extents

startup

このセクションは、ネットワークに対するDRBDの取り扱いをチューニングするパラメータで構成される。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: wfc-timeoutdegr-wfc-timeoutoutdated-wfc-timeoutwait-after-sbstacked-timeoutsbecome-primary-on

syncer

このセクションは同期デーモンの振る舞いをチューニングするパラメータを含む。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: rateafteral-extentsuse-rlecpu-maskverify-algcsums-algc-plan-aheadc-fill-targetc-delay-targetc-max-ratec-min-rateon-no-data-accessible.

ハンドラ

このセクションは、DRBDが特定のイベントに応じて実行するハンドラ(実行可能プログラム)を登録する。指定できるパラメータは次のとおり: pri-on-incon-degrpri-lost-after-sbpri-lostfence-peer (formerly oudate-peer)、local-io-errorinitial-split-brainsplit-brainbefore-resync-targetafter-resync-target

DRBDがハンドラを起動するときには、次の環境変数が設定される。:

DRBD_RESOURCE

はリソースの名前である。

DRBD_MINOR

はDRBDデバイスのマイナー番号である。10進数で指定する

DRBD_CONF

は設定ファイルのパス。設定を複数のファイルに分割した場合( /etc/drbd.conf.d/など)、この設定は役に立たない。

DRBD_PEER_AF, DRBD_PEER_ADDRESS, DRBD_PEERS

DRBD_PEER_AFはアドレスファミリ(ipv6など)、 DRBD_PEER_ADDRESS は対向ホストのアドレス、DRBD_PEERSは対向ホストのホスト名となる。

DRBD_PEER (単数形に注意) は廃止されており、代わりに、DRBD_PEERSが使われる。

これらの設定がすべてのハンドラに設定されるわけではない。いくつかの値は動的な設定では無効になる。

パラメータ

minor-count count

countには1から255の値を指定できる。

DRBDカーネルモジュールをロードしなおすことなく多数のリソースを定義したい場合、minor-countを指定する。デフォルトでは、現在定義されているリソースの数に加えてさらに11個のリソースを定義できる。ただし最低でも32個は定義できる。

dialog-refresh time

timeには0または正の整数を指定する。

ダイアログを再描画する時間間隔をtime秒に設定する。ゼロを指定すると再描画は行われない。他ノードのDRBDが停止中にDRBDを起動すると、約10秒後にユーザの介入を促すメッセージがコンソールに表示される。これをダイアログと呼ぶ。デフォルト値は1である。

disable-ip-verification

何らかの理由でdrbdadmがipまたはifconfigコマンドを使ってIPアドレスの正常さを検証できない場合、disable-ip-verificationを指定する。このオプションを指定することによって、IPアドレスを検証しないようにできる。

usage-count val

DRBDの利用者統計 DRBD's online usage counterに参加するには、このオプションにyesを指定する。指定できる値は、yesno、またはaskである。

protocol prot-id

TCP/IPの通信の際に使われるDRBDのプロトコルを指定する。prot-idにはA、BまたはCを指定する。

プロトコルA: ローカルディスクとローカルTCP送信バッファにデータを書き込んだらディスクへの書き込みが完了したと判断する。

プロトコルB: ローカルディスクとリモートバッファキャッシュにデータを書き込んだらディスクへの書き込みが完了したと判断する。

プロトコルC: ローカルディスクとリモートディスクの両方にデータを書き込んだらディスクへの書き込みが完了したと判断する。

device name minor nr

定義しているDRBDリソースに対応するブロックデバイス名を指定する。アプリケーション(通常はファイルシステム)では、ここで指定する名前をデバイス名として指定する。逆に、diskに指定したデバイス名を決して指定してはならない。

nameまたはminornr (マイナー番号)を省略することができる。nameを省略すると、デフォルトの/dev/drbdminorが使われる。

udevは自動的に/dev/drbd/by-resと/dev/drbd/by-diskの中のシンボリックリンクを作成する。

disk name

ブロックデバイス名を指定する。DRBDはこのデバイスを対象にデータを読み書きする。DRBD動作中は、このデバイスを絶対に別の方法でアクセスしてはならない。この禁止事項には、dumpe2fs(8)やその他の類似コマンドも含まれる。

address AF addr:port

すべてのリソースのすべてのデバイスには、それぞれに対応したaddr (IPアドレス)を指定する必要がある。このアドレスは対向ノードからの接続を受け付けるために使われる。AFipv4ipv6ssocksまたはsdpのどれかを指定する(互換性の観点からscissocksの代わりに指定できる)。IPv4 の場合、これを省略できる。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-diskflexible-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

下位デバイスがI/Oエラーを返したときに実行するハンドラを指定する。

handlerに指定できる値は、pass_oncall-local-io-error、またはdetachのどれかである。

pass_on: ノードはディスクのステータスをinconsistentにし、I/Oエラーを起こしたブロックに対応するビットマップにマークをつける。そして、リモートのノード上で入出力を再度行う。

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番目のオプション("none"の設定で、すべての制御を使わない)は、ほとんどのIOスタック上で危険で、ディスクへの書き込み順序が入れ替わってしまう可能性がある。もしそうなれば、理論的にはデータ破損の原因、またはDRBDプロトコルを乱し、再接続と切断を繰り返すような状態に陥る可能性がある。no-disk-drainを使ってはならない。

残念なことに、デバイスマッパ(LVM)はバリアをサポートしていない。

/proc/drbd出力の"wo:"の後ろに下位デバイスに対する現在の設定がbfdnという文字で表示される。オプションは次のとおり。

barrier

下位デバイスがバリア (SCSIでは"tagged command queuing"、SATAでは"native command queuing"と呼ばれる)をサポートしている場合、このオプションを選択できる。このオプションを無効にするにはno-disk-barrierを明示的に指定する。

カーネル2.6.36以降及びRHEL6の2.6.32では、このオプションを使ってはならない。すなわちno-disk-barrierをつねに指定する必要がある。また、DRBD8.3.14以降ではbarrierは無効化される。

flush

下位デバイスがディスクフラッシュ (ベンダーは"force unit access"と呼んでいる)をサポートしている場合、このオプションを選択できる。このオプションを無効にするにはno-disk-flushesを明示的に指定する。

drain

最初の書き込みは次の書き込みリクエストを処理する前に完了しなければならない。 このオプションは8.0.9までの唯一の処理方法であった。

none

no-disk-barrierとno-disk-flushesに加えてno-disk-drainを指定すると、下位デバイスに対して書き込みと書き込みの間の順序に関する依存関係を一切指示しなくなる。このオプションはほとんどのI/Oスタックにおいて危険である。もしそうなれば、理論的にはデータ破損の原因、またはDRBDプロトコルを乱し、再接続と切断を繰り替えすような状態に陥る可能性がある。no-disk-drainを使ってはならない。

no-md-flushes

メタデータデバイスへのアクセスにあたってバリアやフラッシュを使用しない。no-disk-flushesについての説明を参照のこと。

max-bio-bvecs

ある特別な環境において、デバイスマッパースタックは、DRBDにBIOsを渡す。例えば、物理ディスク → DRBD → LVM → Xen → アライメントが正しくないパーティション(63) → DomU FS の場合、カーネルログには、 "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

下位デバイスのドライバがdisk_timeoutの時間内にI/Oリクエストを終えない場合、DRBDはディスクが故障したとみなす。DRBDがリモートホストに接続しているなら書き込めなかったIOリクエストをリモートホストに再送する。そして新しいI/Oリクエストをそのノードにだけ送り出す。ブロックデバイスが全I/Oリクエストを完了するとただちに、ディスクの状態はディスクレスになる。

デフォルト値は 0 で、これはタイムアウトにならないことを意味する。デフォルトの単位は100msである。このオプションは、DRBD 8.3.12 から有効である。

sndbuf-size size

TCPソケットの送信バッファサイズをsizeに指定する。デフォルト値は0で自動調整される。 遅延が大きいネットワークに対してプロトコルAを指定する場合に大きな値を指定すると、書き込みスループットを向上できる。32Kより小さい値は現実的ではない。8.0.13以降のバージョンでは、sizeに0を指定すると、カーネルの自動調整に任せることになる。

rcvbuf-size size

TCPソケットの受信バッファサイズをsizeに指定する。デフォルト値は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

2つのDRBDドライバ間の接続が確立していて、time秒の間に何も通信が行われなかった場合、DRBDは対向ノードが生きているか確認するためのパケットを送出する。デフォルト値は10で、このパラメータの単位は秒である。

ping-timeout time

ping-intパケットに対して対向ノードはこのパラメータに指定した時間以内に応答しなければならない。応答パケットが返ってこない場合、その対向ノードは死んだと判断される。デフォルト値は500msで、100ms単位で指定する。

max-buffers number

DRBDに割り当てるバッファの最大数を指定する。単位はPAGE_SIZEで、ほとんどのシステムで4KiBである。最小値は32 (=128 KiB)にハードコードされている。良好な環境の場合、このパラメータを大きく設定することによって良好な結果が期待できる。このバッファは、ディスクに書き込み中のデータブロックを保持するのに使われる。

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セットで判断してしまった場合には、フル同期が行われるかもしれない。(または、両ノードの失敗がUUIDの設定をおかしくさせるかもしれない)

rr-conflict policy

再同期に関する判断と現在のクラスタ状態における役割が食い違った場合のポリシーを指定する。

disconnect

自動再同期を行わず接続を切断する。

violently

どちらか一方のノードのデータは安定であるという前提を無視して、プライマリノードへの同期を許可する。このオプションは危険で、使ってはいけない。

call-pri-lost

pri-lostハンドラを呼び出す。このプログラムには、マシンをリブートしてそのマシンをセカンダリにするような機能が要求される。

data-integrity-alg alg

ネットワーク経由で受け渡されるデータの整合性を担保するために、DRBDはハッシュ値を比較する機能を備えている。通常は、TCP/IPパケット自体のヘッダに含まれる16ビットチェックサムで保証される。

オプション値には、カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。一般的なカーネルの場合、少なくとも md5sha1またはcrc32cのどれかが利用できる。デフォルトでは、この機能は無効である。

データ整合性に関する説明を参照のこと。

no-tcp-cork

DRBDは、TCPソケットのTCP_CORKオプションを使って、いつ追加データを受け取るか、あるいは送信キューのデータをいつフラッシュするかのヒントを得ている。一方、この方法が悪影響を及ぼすネットワークスタックが少なくとも存在することが判明している。このオプションを指定すると、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_policycongestion_policyに指定できる値は、block または pull-aheadである。デフォルト値はblockである。Fill_threshold 0から10GiBまでの値を指定できる。デフォルト値は0で、これはチェックが無効になることを意味する。Active_extents_threshold は、al-extents と同じ制限がある。

AHEAD/BEHIND モードは、8.3.10以降で利用できる。

wfc-timeout time

接続確立までの待機時間にタイムアウト値を設定する。drbd(8) は、DRBDリソースの接続が確立するまで待ち続ける。後に起動されるクラスタ管理システムは、通常はリソース内のスプリットブレイン状態まではチェックしない。待ち時間を制限したい場合には、このパラメータ値を設定する。デフォルト値は0で、タイムアウトせずに待ち続ける。単位は秒である。

degr-wfc-timeout time

縮退運転中のクラスタにおける接続タイムアウトを指定する。縮退とは、片方のノードしか動作していない状態を表す。このようなクラスタをリブートした場合には、対向ノードが一定時間内に起動する可能性が低いため、wfc-timeoutではなくこのパラメータ値が使われる。デフォルト値は60秒で、秒単位で指定する。0を指定すると、タイムアウトしなくなる。

outdated-wfc-timeout time

相手ノードが無効になってから、接続確立までの待機時間にタイムアウト値を設定する。無効になった相手ノードが再起動されているデグレードクラスタ(1つのノードしか残っていないクラスタ)では、このタイムアウト値は wfc-timeout の代わりに使用される。なぜなら、相手ノードはその間 Primary になることを許可されていないためである。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にもとづいて動作するようになる。スタックデバイスの対向ノードが多くの場合に利用できないケースや対向ノードがプライマリにならない場合に限って、このオプションを指定すべきである。誤用すれば、予期しないスプリットブレインが起きるリスクが生じる。

rate rate

DRBDの上位で動作するアプリケーションの円滑な実行のために、バックグラウンドの同期作業が利用するバンド幅を制限できる。デフォルト値は250KB/秒。デフォルトの単位はKB/秒だが、K、M、Gの接尾語を補って単位を変更できる。

use-rle

再同期開始時のハンドシェークの過程で各ノードのビットマップが交換され、ビット単位のOR計算が行われる。これによって、どのブロックがダーティ(不一致)であるかについて、それぞれのノードは共通の認識を持つ。大容量デバイスではビットマップも大きくなり、バンド幅が小さいネットワークではその交換に時間を要する。典型的なビットマップは、すべてがセットされていない(クリーン)あるいはセットされている(ダーティ) いくつかのエリアに分かれている。

このため、単純ではあるがランレングスエンコーディングを採用することにより、ビットマップ交換のためのネットワークトラフィックを顕著に減らすことができる。

過去のバージョンとの互換性のため、また高速ネットワークでは転送時間改善効果が少なくCPU使用量が増えるため、デフォルトではこの機能は無効である。

after res-name

デフォルトでは、DRBDは複数リソースの再同期を並行して実行する。このパラメータを指定すると、res-nameが接続完了してから、すなわち再同期が実行された場合にはそれが終了してから、他のリソースの再同期を実行する。

al-extents extents

DRBDはホットエリア(アクティブセット)を自動的に検出できる。このパラメータを指定すると、ホットエリアの大きさを制御できる。各エクステントは、下位デバイスの4メガバイトの領域になる。予定外の事情によってプライマリノードがクラスタから切り離されると、そのときのホットエリアのデータは、次回接続したときの再同期の対象になる。このデータ構造は、メタデータ領域に書き込まれる。したがって、アクティブセットの状態更新は、メタデータデバイスへの書き込みを引き起こす。エクステント値を大きくすると、再同期所要時間が長くなるが、メタデータの更新頻度を減らすことができる。extentsのデフォルト値は127で、指定できる最小値は7、最大値は3843である。

verify-alg hash-alg

verifyサブコマンドでディスク内容をオンライン照合する際、DRBDはビット単位の比較ではなく、ブロックごとのハッシュ値を計算し、対向ノードのハッシュ値と比較する。照合に利用するハッシュアルゴリズムは、このパラメータで指定する。オプション値には、カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。一般的なカーネルの場合、少なくとも md5sha1または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 に指定した一定の遅延でデータを送信バッファに送り込むことによって実現される。

plan_time パラメータは調整機能の機敏さに影響する。大きな値を指定すれば、調整のスピードが遅くなる。この値はネットワークのRTTの少なくとも5倍以上を指定すべきである。DRBD Proxyを使わない場合、fill_targetに4kから100kの間の値を指定するのが適切である。 DRBD Proxyを使う場合には、fill_targetに0を指定して、代わりにdelay_targetを指定するのが望ましい。delay_targetも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/sec)でデフォルトの単位はKiB/secである。

再同期速度の動的調整機能はDRBD 8.3.9以降で利用できる。

c-min-rate min_rate

同期元のプライマリノードは、アプリケーションの書き込みと再同期の書き込みの配分を管理する必要がある。c-min-rate を指定すると、再同期のためのバンド幅の最大値がmin_rateになり、利用可能なバンド幅の残りの部分をアプリケーションI/Oのために確保する。

Note: 0という値は特別な意味を持つ。これは再同期速度の制限を完全に無制限にする。このためにアプリケーションのI/O速度が低下することもありえる。再同期によってアプリケーションI/O速度が低下することを防止したい場合には1を指定する。

Note: この名前は再同期速度の動的調整機能の下限値のように見えるが、そうではない。DRBD Proxyのバッファが満杯のとき、動的調整機能は c-min-rate の設定値に関係なく、再同期速度を0まで下げることができる。

min_rate のデフォルト値は4096 (4MiB/sec)でデフォルトの単位はKiB/secであ る。

on-no-data-accessible ond-policy

この設定は、ディスクレスモードが発生した際の操作を指定する。設定できるポリシーは、 io-errorsuspend-ioである。

ond-policysuspend-io を設定すると、最後に接続していたデータストレージから、もしくは、 drbdadm resume-io res コマンドにより、IO を再開することができる。io-errorはもちろん IO エラーを発生させる。

デフォルトは、 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

このパラメータに指定したハンドラは、ローカルディスクI/OサブシステムがI/Oエラーを報告したときに実行される。

initial-split-brain cmd

DRBDがスプリットブレインを検出した場合に使用される。このハンドラはスプリットブレインが発生した場合に警告を通知する。問題が解決した場合でも通知する。

split-brain cmd

このパラメータに指定したハンドラは、スプリットブレイン状態が検出され、問題が解決しなかった場合に実行される。修復のための手作業が必要なので、このハンドラは、誰かにこのことを通知するのが望ましい。

before-resync-target cmd

同期先のノードで再同期を開始する直前にこのハンドラが呼び出される。下位ブロックデバイスのスナップショットを取得する、などの用途が考えられる。

after-resync-target cmd

同期先のノードで、同期中に不整合があって同期によって整合状態になったときに、再同期終了直後にこのハンドラが呼び出される。before-resync-targetハンドラで取得したスナップショットを解放する、などの用途が考えられる。

その他のキーワード

include file-pattern

ワイルドカード展開したfile-patternのファイルをインクルードする。includeステートメントの記述はトップレベルでのみ許される。セクションの中で使うことはできない。

データ整合性

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側で計算されるため、この種のデータエラーはオンライン照合またはdata-integrity-algを使わない限り検出できない。

data-integrity-algはCPUの負担が大きいため、テスト期間中のみ使うことを推奨する。その後は、たとえば月に1回程度、負荷が低い時間帯にオンライン照合を実施するのが望ましい。

バージョン

このドキュメントはDRBDバージョン8.3.13以降向けに書かれている。

著者

Philipp Reisner、Lars Ellenberg.

バグ報告方法

バグについては、.

著作権

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), drbdadm(8), DRBD User's Guide, DRBD web site