名前

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

はじめに

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

本ファイルの形式は、 クラスタを構成する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-countdialog-refreshdisable-ip-verification、およびusage-countパラメータが許されている。globalセクションは1回だけ記述でき、設定ファイルの先頭に書くのが望ましい。

common

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

resource name

DRBDリソースを定義するセクションである。各リソースセクションは、2つ(またはそれ以上)のon hostセクションを持つ必要があり、必要に応じてstartupsyncerhandlersnetおよび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セクションキーワードも参照すること。このセクションには、devicediskaddressmeta-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アドレスでホスト名を照合することであう。このセクションには、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-errorsizefencinguse-bmbvno-disk-barrierno-disk-flushesno-disk-drainno-md-flushesmax-bio-bvecs

net

このセクションは、ネットワークに対するDRBDの取り扱いをチューニングするパラメータで構成される。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: sndbuf-sizercvbuf-sizetimeoutconnect-intping-intping-timeoutmax-buffersmax-epoch-sizeko-countallow-two-primariescram-hmac-algshared-secretafter-sb-0priafter-sb-1priafter-sb-2pridata-integrity-algno-tcp-cork

startup

このセクションはDRBDの振る舞いをチューニングするパラメータを含む。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: wfc-timeoutdegr-wfc-timeoutoutdated-wfc-timeoutwait-after-sbstacked-timeoutsbecome-primary-on

syncer

このセクションは同期デーモンの振る舞いをチューニングするパラメータを含む。各パラメータの詳細はdrbdsetup(8)を参照。指定できるパラメータは次のとおり: rateafteral-extentsuse-rlecpu-maskverify-algcsums-alg

handlers

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

パラメータ

minor-count count

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

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

dialog-refresh time

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

ダイアログを再描画する時間間隔をtime秒に設定する。ゼロを指定すると再描画は行われない。デフォルト値は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アドレス)を指定する必要がある。このアドレスは対向ノードからの接続を受け付けるために使われる。AFipv4ipv6またはssocksのどれかを指定する(互換性の観点からscissocksの代わりに指定できる)。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-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

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

handlerに指定できる値は、 pass_oncall-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という文字で表示される。

barrier

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

flush

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

drain

最初の書き込みは次の書き込みリクエストを処理する前に完了しなければならない。 このオプションは8.0.9までの唯一の処理方法であった。 no-disk-drainを指定することによって、このオプションを無効にできる。

none

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ビットチェックサムで保証される。

オプション値には、 カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。 一般的なカーネルの場合、少なくとも md5sha1または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はビット単位の比較ではなく、ブロックごとのハッシュ値を計算し、 対向ノードのハッシュ値と比較する。 照合に利用するハッシュアルゴリズムは、このパラメータで指定する。 オプション値には、 カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。 一般的なカーネルの場合、少なくとも md5sha1または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

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

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の上位プログラムがディスクに書き込みを行った場合、 不整合ではないのに不整合と判断されることがある。 現在のところ、スワップとReiserFSがそのようなプログラムだと判明している。 どちらの場合も、これは問題にはならない。 データ転送が起きたとき、そのデータブロックがディスク上のデータ構造と同じではないことを、その転送を起こしたプログラムはすでに知っているためである。

2007年に起きた系統的なデータ損傷のケースの場合、原因はあるギガビットNICのTCP/IPオフロードエンジンとドライバが原因であった。メインメモリからNICへのDMAデータ転送時にデータ破壊が起きていた。TCPチェックサムはNIC側で計算されるため、この種のデータエラーはオンライン照合またはdata-integrity-algを使わない限り検出できない。

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

バージョン

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

著者

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ユーザーズガイド, DRBDホームページ(英語) DRBDホームページ(日本語)