drbd-users-guide-ja-8.4

DRBD ユーザーズガイド
バージョン 8.4 版
Brian Hellman
Florian Haas
Philipp Reisner
Lars Ellenberg
株式会社サードウェア発行
はじめにお読みください
本書は Distributed Replicated Block Device (DRBD) を利用するための完全なリファレンスガイドです。同
時にハンドブックとしても活用できるように編集してあります。
本書は DRBD プロジェクトのスポンサーである LINBIT がそのコミュニティ向けに作成しています。そして
コミュニティにとって有益であることを願って無償で公開しています。本書は DRBD のリリースに合わせて継
続的に更新しています。DRBD の新しいリリースと同時に、その新機能の説明を追加する予定です。オンライン
HTML 版は http://www.drbd.org/users-guide/ で公開しています。
このガイドは DRBD 8.4.0 以降をご使用のユーザを対象にしています。DRBD 8.4 より前のバージョンを
使用する場合は、旧版のガイド http://www.drbd.org/users-guide-8.3/ をご利用ください。
本書には Draft と記されたセクションが含まれていることがあります。これらは追加されて間もないもので、
正式なものではありません。読者からのフィードバックはいつでも歓迎します。
本書に対する改善提案や誤りの指摘は 公開メーリングリスト へお寄せください。
本書は次の構成になっています。
• DRBD の紹介 では DRBD の基本的な機能を扱います。Linux の I/O スタックにおける DRBD の位置付
け、DRBD の基本コンセプトなど、基礎となる事項を取り扱います。また、DRBD のもっとも重要な機
能について検討を加えます。
• DRBD のコンパイル、インストールおよび設定 ではソースからの DRBD のビルド方法、コンパイル済み
のパッケージからのインストール方法、またクラスタシステムでの DRBD の運用方法の概要について説
明します。
• DRBD の使い方 では DRBD の管理方法、DRBD リソースの設定や修正方法、一般的なトラブルシュー
ティングを説明します。
• DRBD とアプリケーションの組み合わせ ではストレージのレプリケーションの追加やアプリケーション
の高可用性のため DRBD を活用する方法を説明します。Pacemaker クラスタ管理システムとの組み合わ
せだけでなく、LVM との高度な組み合わせ、GFS との組み合わせ、Xen による仮想環境の可用性向上に
ついても触れます。
• DRBD パフォーマンスの最適化 では DRBD 設定によりパフォーマンスを向上させるための方法について
説明します。
• DRBD をさらに詳しく知る では DRBD の内部構造を説明します。読者に有益と思われる他の情報リソー
スについても紹介します。
• 付録 は次のものが含まれます。新しい変更点 は、DRBD 8.4 とそれ以前のバージョンとの変更点を説明し
ます。DRBD system manual pages では参照用に最新バージョンの DRBD に関するオンラインマニュ
iii
はじめにお読みください
アルページを収録しています。
DRBD トレーニングやサポートサービスにご興味のある方は sales@3ware.co.jp にお問い合せください。
iv
目 次
はじめにお読みください ...................................................................................................... iii
第 I 部 DRBD の紹介
第1章
DRBD の基礎 ....................................................................................... 3
1.1 カーネルモジュール...................................................................................................... 3
1.2 ユーザ空間の管理ツール ................................................................................................ 3
1.3 リソース.................................................................................................................... 4
1.4 リソースのロール (役割)................................................................................................ 5
第2章
DRBD の機能 ....................................................................................... 7
2.1 シングルプライマリモード ............................................................................................. 7
2.2 デュアルプライマリモード ............................................................................................. 7
2.3 レプリケーションのモード ............................................................................................. 7
2.4 複数の転送プロトコル ................................................................................................... 8
2.5 効率的なデータ同期...................................................................................................... 9
2.6 レプリケーションの中断 .............................................................................................. 10
2.7 オンライン照合 ......................................................................................................... 10
2.8 レプリケーション用トラフィックの整合性チェック ............................................................ 10
2.9 スプリットブレインの通知と自動修復 ............................................................................. 11
2.10 ディスクフラッシュのサポート .................................................................................... 12
2.11 ディスクエラー処理ストラテジー ................................................................................. 12
2.12 無効データの処理ストラテジー .................................................................................... 13
2.13 3 ノードレプリケーション .......................................................................................... 13
2.14 DRBD Proxy による遠距離レプリケーション .................................................................. 14
2.15 トラック輸送によるレプリケーション ............................................................................ 15
2.16 動的対向ノード ........................................................................................................ 15
第 II 部 DRBD のコンパイル、インストールおよび設定
v
目次
第3章
コンパイル済み DRBD バイナリパッケージのインストール ............................. 19
3.1 LINBIT 社が提供するパッケージ ................................................................................... 19
3.2 ディストリビューションベンダが提供するパッケージ .......................................................... 19
第4章
ソースからの DRBD の構築とインストール ................................................ 21
4.1 DRBD ソースのダウンロード ....................................................................................... 21
4.2 公開 DRBD ソースリポジトリからソースをチェックアウトする ............................................ 21
4.3 ソースから DRBD を構築する ...................................................................................... 22
4.4 DRBD RPM パッケージのビルド .................................................................................. 26
4.5 DRBD Debian パッケージの構築 .................................................................................. 27
第5章
DRBD の設定 ..................................................................................... 29
5.1 下位レベルストレージの準備 ........................................................................................ 29
5.2 ネットワーク構成の準備 .............................................................................................. 29
5.3 リソースの設定 ......................................................................................................... 30
5.4 リソースを初めて有効にする ........................................................................................ 33
5.5 デバイスの初期同期.................................................................................................... 33
5.6 トラックベースのレプリケーションの使用 ........................................................................ 34
第 III 部 DRBD の使い方
第6章
一般的な管理作業 .................................................................................. 39
6.1 DRBD の状態のチェック ............................................................................................. 39
6.2 リソースの有効化と無効化 ........................................................................................... 43
6.3 リソースの設定の動的な変更 ........................................................................................ 43
6.4 リソースの昇格と降格 ................................................................................................. 44
6.5 基本的な手動フェイルオーバ ........................................................................................ 44
6.6 DRBD をアップグレードする ....................................................................................... 44
6.7 DRBD 8.4 を 8.3 にダウングレードする。 ....................................................................... 47
6.8 デュアルプライマリモードを有効にする .......................................................................... 48
6.9 オンラインデバイス照合の使用 ...................................................................................... 49
6.10 同期速度の設定 ........................................................................................................ 50
6.11 チェックサムベース同期の設定 .................................................................................... 51
6.12 輻輳ポリシーと中断したレプリケーションの構成 .............................................................. 52
6.13 I/O エラー処理方針の設定 .......................................................................................... 52
6.14 レプリケーショントラフィックの整合性チェックを設定 ..................................................... 53
6.15 リソースのサイズ変更 ............................................................................................... 53
6.16 下位デバイスのフラッシュを無効にする ......................................................................... 56
6.17 スプリットブレイン時の動作の設定 .............................................................................. 57
6.18 3 ノード構成の作成 .................................................................................................. 59
6.19 DRBD Proxy ......................................................................................................... 61
vi
目次
第 7 章 トラブルシューティングとエラーからの回復 ................................................ 65
7.1 ハードドライブの障害の場合 ........................................................................................ 65
7.2 ノード障害に対処する ................................................................................................. 66
7.3 スプリットブレインからの手動回復 ................................................................................ 67
第 IV 部 DRBD とアプリケーションの組み合わせ
第8章
DRBD と Pacemaker クラスタ .............................................................. 71
8.1 Pacemaker の基礎 ..................................................................................................... 71
8.2 クラスタ構成に DRBD のサービスを追加する ................................................................... 71
8.3 Pacemaker クラスタでリソースレベルのフェンシングを使用する .......................................... 72
8.4 Pacemaker クラスタでスタック DRBD リソースを使用する ................................................. 74
8.5 2 セットの SAN ベース Pacemaker クラスタ間を DRBD でレプリケート ................................ 78
第9章
DRBD と Red Hat Cluster Suite ......................................................... 81
9.1 Red Hat Cluster の背景情報 ........................................................................................ 81
9.2 Red Hat Cluster の構成 .............................................................................................. 82
9.3 Red Hat Cluster フェイルオーバクラスタで DRBD を使用する ............................................ 82
第 10 章
DRBD と LVM の使用 ........................................................................ 85
10.1 LVM の基礎 ............................................................................................................ 85
10.2 DRBD の下位デバイスとして論理ボリュームを使用する .................................................... 86
10.3 DRBD 同期中の自動 LVM スナップショットの使用 .......................................................... 87
10.4 DRBD リソースを物理ボリュームとして構成する ............................................................ 88
10.5 新しい DRBD ボリュームを既存のボリュームグループへ追加する ........................................ 89
10.6 DRBD を使用する入れ子の LVM 構成 ........................................................................... 90
10.7 Pacemaker による高可用性 LVM ................................................................................. 92
第 11 章
DRBD と GFS の使用 ......................................................................... 93
11.1 GFS の基礎 ............................................................................................................ 93
11.2 GFS2 用の DRBD リソースの作成 ............................................................................... 94
11.3 CMAN を構成する ................................................................................................... 95
11.4 GFS ファイルシステムの作成 ...................................................................................... 95
11.5 Pacemaker での GFS2 ファイルシステムの使用 ............................................................... 96
第 12 章
DRBD と OCFS2 の使用 ..................................................................... 97
12.1 OCFS2 の基礎 ........................................................................................................ 97
12.2 OCFS2 用の DRBD リソースの作成 ............................................................................. 98
12.3 OCFS2 ファイルシステムの作成 .................................................................................. 98
12.4 Pacemaker による OCFS2 の管理 ................................................................................ 99
12.5 Pacemaker を使わない OCFS2 管理 ........................................................................... 100
vii
目次
第 13 章
DRBD と Xen の使用 ........................................................................ 103
13.1 Xen の基礎 ........................................................................................................... 103
13.2 Xen とともに使用するために DRBD モジュールパラメータを設定する ................................ 103
13.3 Xen VBD として適切な DRBD リソースを作成する ....................................................... 104
13.4 DRBD VBD の使用 ............................................................................................... 104
13.5 DRBD で保護された domU の開始、停止、移行 ............................................................ 105
13.6 DRBD と Xen 統合の内部 ........................................................................................ 105
13.7 Xen と Pacemaker の統合 ........................................................................................ 106
第 V 部 DRBD パフォーマンスの最適化
第 14 章 ブロックデバイスのパフォーマンス測定 .................................................. 109
14.1 スループットの測定 ................................................................................................ 109
14.2 待ち時間の測定 ...................................................................................................... 110
第 15 章
DRBD のスループット最適化 .............................................................. 111
15.1 ハードウェアの検討事項 .......................................................................................... 111
15.2 スループットオーバヘッドの予測 ............................................................................... 111
15.3 チューニングの推奨事項 .......................................................................................... 112
第 16 章
DRBD の待ち時間の最適化 ................................................................. 115
16.1 ハードウェアの検討事項 .......................................................................................... 115
16.2 待ち時間オーバヘッドの予測 ..................................................................................... 115
16.3 チューニングの推奨事項 .......................................................................................... 116
第 VI 部
第 17 章
DRBD をさらに詳しく知る
DRBD の内部.................................................................................. 121
17.1 DRBD メタデータ.................................................................................................. 121
17.2 世代識別子 ........................................................................................................... 123
17.3 アクティビティログ ................................................................................................ 126
17.4 クイック同期ビットマップ ........................................................................................ 128
17.5 peer fencing インタフェース .................................................................................... 128
第 18 章 詳細情報の入手 ................................................................................. 131
18.1 商用 DRBD のサポート ........................................................................................... 131
18.2 公開メーリングリスト ............................................................................................. 131
18.3 公開 IRC チャンネル ............................................................................................... 131
18.4 公開ツイッターアカウント ........................................................................................ 131
18.5 資料.................................................................................................................... 131
18.6 その他の資料 ........................................................................................................ 132
viii
目次
付録 ............................................................................................................ 133
付録 A
新しい変更点 ...................................................................................................... 133
A.1 ボリューム ............................................................................................................. 133
A.2 構成における構文の変更点 ......................................................................................... 134
A.3 ネットワーク通信のオンライン変更 .............................................................................. 136
A.4 drbdadm コマンドの変更点 ....................................................................................... 137
A.5 デフォルト値の変更点 ............................................................................................... 137
付録 B
DRBD system manual pages................................................................................ 139
B.1 DRBD.CONF ........................................................................................................ 139
B.2 DRBDADM........................................................................................................... 156
B.3 DRBDSETUP........................................................................................................ 161
B.4 DRBDMETA ......................................................................................................... 179
索引 ............................................................................................................................ 183
ix
第
I部
DRBD の紹介
第
1章
DRBD の基礎
Distributed Replicated Block Device (DRBD) は、ストレージのレプリケーション (複製) のためのソフト
ウェアで、シェアードナッシングを実現します。DRBD はサーバ間でブロックデバイス (ハードディスク、パー
ティション、論理ボリュームなど) の内容をミラーします。
DRBD によるミラーは、次の特徴を持ちます。
• リアルタイムレプリケーション 上位アプリケーションがデバイスのデータを書き換えると、そのデータを
リアルタイムでレプリケートします。
• アプリケーションから透過的 アプリケーションは、データが複数のホスト上に格納されていることを意識
する必要はありません。
• 同期 および 非同期 の両方に対応 同期的に動作している場合、すべてのホストのディスクへの書き込みが
完了した後で、アプリケーションは完了通知を受け取ります。非同期的に動作している場合は、ローカル
ディスクへの書き込みが完了したときに、アプリケーションは完了通知を受け取ります。この場合、他の
ホストへの書き込みは後で行われます。
1.1
カーネルモジュール
DRBD のコア機能は Linux のカーネルモジュールとして実装されています。OS の I/O スタックの一番底に
近い場所で DRBD は仮想的なブロックデバイスを作ります。このために、DRBD は非常に柔軟で応用範囲が広
く、さまざまなアプリケーションの可用性を高めるために利用できます。
その定義と Linux カーネルアーキテクチャとの関連にもとづき、DRBD は上位レイヤに関して一切関知しま
せん。このため、DRBD は上位レイヤに対して何らかの機能を付与できません。たとえば、DRBD はファイル
システムの故障を検出できません。また ext3 や XFS などのファイルシステムに対してアクティブ-アクティブク
ラスタ機能を追加することもできません。
1.2
ユーザ空間の管理ツール
DRBD にはカーネルモジュールと通信を行う管理ツールがいくつか用意されています。これらのツールを使っ
て、DRBD リソースを設定して管理できます。
1. drbdadm DRBD プログラム群における高レベル管理ツールです。このコマンドは、DRBD の制御に必要
なすべてのパラメータを /etc/drbd.conf から読み込み、drbdsetup および drbdmeta のフロントエン
3
第 1 章 DRBD の基礎
SERVICE
SERVICE
PAGE CACHE
PAGE CACHE
FILE SYSTEM
FILE SYSTEM
RAW DEVICE
RAW DEVICE
NETWORK STACK
NETWORK STACK
I/O SCHEDULER
I/O SCHEDULER
DISK DRIVER
NIC DRIVER
図 1.1
NIC DRIVER
DISK DRIVER
Linux の I/O スタックでの DRBD の位置
ドとして動作します。drbdadm には -d オプションで起動する dry-run モードがあり、実際にコマンド
を実行することなく、drbdsetup や drbdmeta のどちらが drbdadm を呼び出すのかを表示します。
2. drbdsetup カーネルにロードされた DRBD モジュールを設定します。drbdsetup ではすべてのパラメー
タをコマンドラインで指定する必要があります。drbdadm と drbdsetup が分離していると、柔軟性が高
くなります。ほとんどのユーザにとって、drbdsetup を使うことはほとんどないでしょう。
3. drbdmeta DRBD メタデータの作成、ダンプ、リストアなどを行うコマンドです。drbdsetup と同様、ほ
とんどのユーザにとって、drbdmeta を使うことはほとんどないでしょう。
1.3
リソース
DRBD では、レプリケートするデータセットに関するさまざまな属性を総称して、リソース と呼びます。リ
ソースは、以下の要素で構成されます。
リソース名
個々のリソースを区別するために、ホワイトスペース以外の US-ASCII 文字で表される任意の名前
を与えることができます。
ボリューム
どのリソースも、共通のレプリケーションストリームを共有する複数の ボリューム の 1 つからな
る、レプリケーショングループです。DRBD は、リソース内のすべてのボリューム間で書き込みの忠実性が保証
されます。ボリュームは 0 から番号付けされ、1 つのリソースにおいて、最大で 65,535 ボリュームまで可能で
す。ボリュームにはレプリケートされたデータセットが含まれ、DRBD 内部で使用するメタデータのセットも含
まれます。
drbdadm コマンドでは、リソース内のボリュームを、リソース名とボリューム名を<resource>/<volume>の
ように記述して指定します。
4
1.4 リソースのロール (役割)
DRBD デバイス DRBD が管理する仮想的なブロックデバイスです。DRBD が管理する仮想的なブロックデバ
イスで、147 のメジャー番号を持ち、minor 番号は 0 から順次割り振られます。各 DRBD デバイスは、リソース
内の 1 つのボリュームに該当します。関連付けられたブロックデバイスは通常 /dev/drbdX の形式になり、X は
デバイスの minor 番号です。DRBD は、ブロックデバイス名をユーザが定義することもできます。その場合は、
ブロックデバイス名を drbd_ で始まるようにしてください。
初期のバージョンの DRBD は、NBD のデバイスメジャー番号 43 を勝手に使っていました。47 という番
号は、DRBD デバイスメジャー番号として、LANANA-registered に正式に登録されています。
コネクション コネクション は、レプリケートされるデータセットを共有する、2 つのホスト間の通信リンクで
す。現時点では、各リソースは 2 つのホストとこれらのホスト間の 1 つの接続にのみ関与します。ほとんどの場
合、resource と connection という用語は同じ意味で使われます。
drbdadm では、コネクションはリソース名で指定されます。
1.4
リソースのロール (役割)
DRBD のすべてのリソースは、プライマリ または セカンダリ のどちらかのロール (役割) を持っています。
「プライマリ」と「セカンダリ」という用語は適当に選んだものではないことを理解してください。DRBD
開発者は意図的に「アクティブ」と「パッシブ」という用語を避けました。プライマリとセカンダリは、ス
トレージ の可用性に関する概念です。一方アクティブとパッシブは アプリケーション の可用性に関わる
概念です。ハイアベイラビリティクラスタ環境では、一般的にアクティブノードの DRBD はプライマリに
なりますが、これが例外のないルールだということではありません。
• プライマリロールの DRBD デバイスでは、データの読み込みと書き込みが制約なく行えます。この状態
のストレージに対して、ファイルシステムを作成したりマウントでき、ブロックデバイスに対する下位デ
バイス I/O やダイレクト I/O すら可能です。
• セカンダリロールの DRBD デバイスは、対向するノードでのすべてのデータの更新を受け取りますが、自
ノードのアプリケーションからのアクセスは、読み込みと書き込みの両方とも一切受け付けません。読み
込みすら受け付けない理由は、キャッシュの透過性を保証するためです。もしもセカンダリリソースが自
ノードからのアクセスを受け付けると、この保証ができなくなります。
リソースのロールは、もちろんリソースの昇格と降格他に、クラスタ管理アプリケーションの何らかのアルゴ
リズムによって自動で切り替えられます。セカンダリからプライマリへの切り替えを 昇格 と呼びます。一方プ
ライマリからセダンダリの切り替えは 降格 と呼びます。
5
第
2章
DRBD の機能
本章では DRBD の有用な機能とその背景にある情報も紹介します。ほとんどのユーザにとって非常に重要な
機能もありますが、特定の利用目的に対して重要な機能もあります。これらの機能を使うために必要な設定方法
については、第一般的な管理作業章および第トラブルシューティングとエラーからの回復章を参照してください。
2.1
シングルプライマリモード
シングルプライマリモードでは、個々のリソースは、任意の時点でクラスタメンバのどれか 1 台のみプライマ
リになれます。どれか 1 台のクラスタノードのみがデータを更新できることが保証されるため、従来の一般的な
ファイルシステム (ext3、ext4、XFS など) を操作するのに最適な処理モードと言えます。
一般的なハイアベイラビリティクラスタ (フェイルオーバタイプ) を実現する場合、DRBD をシングルプライ
マリモードで設定してください。
2.2
デュアルプライマリモード
デュアルプライマリモードでは、すべてのリソースが任意の時点で両方のノード上でプライマリロールになれ
ます。両方のノードから同一のデータに同時にアクセスできるため、分散ロックマネージャを持つ共有クラスタ
ファイルシステムの利用がこのモードに必須です。利用できるファイルシステムには DRBD と GFS の使用およ
び DRBD と OCFS2 の使用があります。
2 つのノード経由でのデータへの同時アクセスが必要なクラスタシステムの負荷分散をはかりたい場合、デュ
アルプライマリモードが適しています。このモードはデフォルトでは無効になっており、DRBD 設定ファイルで
明示的に有効にする必要があります。
特定のリソースに対して有効にする方法については、デュアルプライマリモードを有効にするを参照してくだ
さい。
2.3
レプリケーションのモード
DRBD は 3 種類のレプリケーションモードをサポートしています。
Protocol A 非同期レプリケーションプロトコル。プライマリノードでのディスクへの書き込みは、自機のディ
スクに書き込んだ上でレプリケーションパケットを自機の TCP 送信バッファに送った時点で、完了したと判断
されます。システムクラッシュなどの強制的なフェイルオーバが起こると、データを紛失する可能性があります。
7
第 2 章 DRBD の機能
クラッシュが原因となったフェイルオーバが起こった場合、待機系ノードのデータは整合性があると判断されま
すが、クラッシュ直前のアップデート内容が反映されない可能性があります。プロトコル A は、遠隔地へのレプ
リケーションに最も適しています。DRBD Proxy と組み合わせて使用すると、効果的なディザスタリカバリソ
リューションとなります。詳しくは DRBD Proxy による遠距離レプリケーションを参照してください。
Protocol B メモリ同期 (半非同期) レプリケーションプロトコル。プライマリノードでのディスクへの書き込み
は、自機のディスクに書き込んだ上でレプリケーションパケットが他機に届いた時点で、完了したと判断されま
す。通常、システムクラッシュなどの強制的なフェイルオーバでのデータ紛失は起こりません。しかし、両ノー
ドに同時に電源障害が起こり、プライマリノードのストレージに復旧不可能な障害が起きると、プライマリ側に
のみ書き込まれたデータを失う可能性があります。
Protocol C 同期レプリケーションプロトコル。プライマリノードでのディスクへの書き込みは、両ノードの
ディスクへの書き込みが終わった時点で完了したと判断されます。このため、どちらかのノードでデータを失っ
ても、系全体としてのデータ紛失には直結しません。当然ながら、このプロトコルを採用した場合であっても、両
ノードまたはそのストレージサブシステムに復旧できない障害が同時に起こると、データは失われます。
このような特質にもとづき、もっとも一般的に使われているプロトコルは C です。
レプリケーションプロトコルを選択するときに考慮しなければならない要因が 2 つあります。データ保護 と レ
イテンシ (待ち時間) です。一方で、レプリケーションプロトコルの選択は スループット にはほとんど影響しま
せん。
レプリケーションプロトコルの設定例については、リソースの設定を参照してください。
2.4
複数の転送プロトコル
DRBD のレプリケーションと同期フレームワークのソケットレイヤは、複数のトランスポートプロトコルをサ
ポートします。
TCP over IPv4 標準的かつ DRBD のデフォルトのプロトコルです IPv4 が有効なすべてのシステムで利用で
きます。
TCP over IPv6 レプリケーションと同期用の TCP ソケットの設定においては、IPv6 もネットワークプロトコ
ルとして使用できます。アドレシング方法が違うだけで、動作上もパフォーマンス上も IPv4 と変わりはありま
せん。
SDP SDP は、InfiniBand などの RDMA に対応する BSD 形式ソケットです。最新のディストリビューション
では、SDP は OFED スタックのの一部として利用できます。SDP は IPv4 形式のアドレシングに使用します。
インフィニバンドを内部接続に利用すると、SDP による高スループット、低レイテンシの DRBD レプリケーショ
ンネットワークを実現することができます。
SuperSockets スーパーソケットは TCP/IP スタック部分と置き換え可能なソケット実装で、モノリシック、
高効率、RDMA 対応などの特徴を持っています。きわめてレイテンシが低いレプリケーションを実現できる
プロトコルとして、DRBD は SuperSockets をサポートしています。現在のところ、SuperSockets は Dolphin
Interconnect Solutions が販売するハードウェアの上でのみ利用できます。
8
2.5 効率的なデータ同期
効率的なデータ同期
2.5
同期ならびに再同期は、レプリケーションとは区別されます。レプリケーションは、プライマリノードでの
データの書き込みに伴って実施されますが、同期はこれとは無関係です。同期はデバイス全体の状態に関わる機
能です。
プライマリノードのダウン、セカンダリノードのダウン、レプリケーション用ネットワークのリンク中断など、
さまざまな理由によりレプリケーションが一時中断した場合、同期が必要になります。DRBD の同期は、もとも
との書き込み順序ではなくリニアに書き込むロジックを採用しているため、効率的です。
• 何度も書き込みが行われたブロックの場合でも、同期は 1 回の書き込みですみます。このため、同期は高
速です。
• ディスク上のブロックレイアウトを考慮して、わずかなシークですむよう、同期は最適化されています。
• 同期実行中は、スタンバイノードの一部のデータブロックの内容は古く、残りは最新の状態に更新されて
います。この状態のデータは inconsistent (不一致) と呼びます。
DRBD では、同期はバックグラウンドで実行されるので、アクティブノードのサービスは同期によって中断さ
れることはありません。
データに不一致箇所が残っているノードは、多くの場合サービスに利用できません。このため、不一致であ
る時間を可能な限り短縮することが求められます。そのため、DRBD は同期直前の LVM スナップショッ
トを自動で作成する LVM 統合機能を実装しています。これは同期中であっても対向ノードと consistent
(一致する) 一致するコピーを保証します。この機能の詳細については DRBD 同期中の自動 LVM スナップ
ショットの使用を参照してください。
可変レート同期
可変レート同期 (デフォルト) の場合、DRBD は同期のネットワーク上で利用可能な帯域幅を検出し、それと、
フォアグランドのアプリケーション I/O からの入力とを比較する、完全自動制御ループに基づいて、最適な同期
レートを選択します。
可変レート同期に関する設定の詳細については、可変同期速度設定を参照してください。
固定レート同期
固定レート同期の場合、同期ホストに対して送信される 1 秒あたりのデータ量 (同期速度) には設定可能な静的
な上限があります。この上限に基づき、同期に必要な時間は、次の簡単な式で予測できます。
同期時間
tsync は同期所要時間の予測値です。D は同期が必要なデータ量で、リンクが途絶えていた間にアプリケーショ
ンによって更新されたデータ量です。R は設定ファイルに指定した同期速度です。ただし実際の同期速度はネッ
トワークや I/O サブシステムの性能による制約を受けます。
固定レート同期に関する設定の詳細については同期速度の設定を参照してください。
チェックサムベース同期
DRBD の同期アルゴリズムは、データダイジェスト (チェックサム) を使うことによりさらに効率化されていま
す。チェックサムベースの同期を行うことで、より効率的に同期対象ブロックの書き換えが行われます。DRBD
は同期を行う前にブロックを 読み込み ディスク上のコンテンツのハッシュを計算します。このハッシュと、相
手ノードの同じセクタのハッシュを比較して、値が同じであれば、そのブロックを同期での書き換え対象から外
9
第 2 章 DRBD の機能
します。これにより、DRBD が切断モードから復旧し再同期するときなど、同期時間が劇的に削減されます。
同期に関する設定の詳細はチェックサムベース同期の設定を参照してください。
2.6
レプリケーションの中断
DRBD が正しく設定されていれば、DRBD はレプリケーションネットワークが輻輳していることを検出し、レ
プリケーションを 中断 します。この場合、プライマリノードはセカンダリから引き離され一時的に同期しない
状態になりますが、セカンダリでは一致するコピーを保持したままです。帯域幅が確保されると、自動で同期が
再開し、バックグラウンド同期が行われます。
レプリケーションの中断は、データセンタやクラウドインスタンス間との共有接続で遠隔地レプリケーション
を行うような、可変帯域幅での接続の場合に通常利用されます。
輻輳のポリシーとレプリケーションの停止についてほ詳細は輻輳ポリシーと中断したレプリケーションの構成を
ご参照ください。
2.7
オンライン照合
オンライン照合機能を使うと、2 ノードのデータの整合性を、ブロックごとに効率的な方法で確認できます。
ここで 効率的 というのはネットワーク帯域幅を効率的に利用することを意味しています。また、照合によっ
て冗長性が損なわれることはありません。しかしオンライン照合は CPU 使用率やシステム負荷を高めます。こ
の意味では、オンライン照合はリソースを必要とします。
一方のノード (照合ソース) で、低レベルストレージデバイスのブロックごとのダイジェストを計算します。
DRBD はダイジェストを他方のノード (照合ターゲット) に転送し、そこでローカルの対応するブロックのダイ
ジェストと照合します。ダイジェストが一致しないブロックは out-of-sync とマークされ、後で同期が行われま
す。DRBD が転送するのはダイジェストであって、ブロックのデータそのものではありません。このため、オン
ライン照合はネットワーク帯域幅をきわめて効率的に活用します。
このプロセスは、照合対象の DRBD リソースを利用したまま実行できます。これが オンライン の由来です。
照合によるパフォーマンス低下は避けられませんが、照合およびその後の同期作業全体を通じてサービスの停止
やシステム全体を停止する必要はありません。
オンライン照合は、週または月に 1 回程度の頻度で cron デーモンから実行するのが妥当です。オンライン照合
機能を有効にして実行する方法や、これを自動化する方法については、オンラインデバイス照合の使用を参照し
てください。
2.8
レプリケーション用トラフィックの整合性チェック
DRBD は、暗号手法にもとづく MD5、SHA-1 または CRD-32C を使って、ノード間のメッセージの整合性を
チェックできます。
DRBD 自身はメッセージダイジェストアルゴリズムを 備えていません。Linux カーネルの暗号 API が提供す
る機能を単に利用するだけです。したがって、カーネルが備えるアルゴリズムであれば、どのようなものでも利
用可能です。
本機能を有効にすると、レプリケート対象のすべてのデータブロックごとのメッセージダイジェストが計算さ
れます。レプリケート先の DRBD は、レプリケーション用パケットの照合にこのメッセージダイジェストを活
用します。データの照合が失敗したら、レプリケート先の DRBD は、失敗したブロックに関するパケットの再
10
2.9 スプリットブレインの通知と自動修復
送を求めます。この機能を使うことで、データの損失を起こす可能性がある次のようなさまざまな状況への備え
が強化され、DRBD によるレプリーションが保護されます。
• 送信側ノードのメインメモリとネットワークインタフェースの間で生じたビット単位エラー (ビット反転)。
この種のエラーは、多くのシステムにおいて TCP レベルのチェックサムでは検出できません。
• 受信側ノードのネットワークインタフェースとメインメモリの間で生じたビット反転。TCP チェックサ
ムが役に立たないのは前項と同じです。
• 何らかのリソース競合やネットワークインタフェースまたはそのドライバのバグなどによって生じたデー
タの損傷。
• ノード間のネットワークコンポーネントが再編成されるときなどに生じるビット反転やデータ損傷。この
エラーの可能性は、ノード間をネットワークケーブルで直結しなかった場合に考慮する必要があります。
レプリケーショントラフィックの整合性チェックを有効にする方法については、レプリケーショントラフィッ
クの整合性チェックを設定をご参照ください。
2.9
スプリットブレインの通知と自動修復
クラスタノード間のすべての通信が一時的に中断され、クラスタ管理ソフトウェアまたは人為的な操作ミスに
よって両方のノードがプライマリになった場合に、スプリットブレインの状態に陥ります。それぞれのノードで
データの書き換えが行われることが可能になってしまうため、この状態はきわめて危険です。つまり、2 つの分
岐したデータセットが作られてしまう軽視できない状況に陥る可能性が高くなります。
クラスタのスプリットブレインは、Heartbeat などが管理するホスト間の通信がすべて途絶えたときに生じま
す。これと DRBD のスプリットブレインは区別して考える必要があります。このため、本書では次のような記
載方法を使うことにします。
• スプリットブレイン は、DRBD のスプリットブレインと表記します。
• クラスタノード間のすべての通信の断絶のことを クラスタ断絶 と表記します。これはクラスタのスプリッ
トブレインのことです。
スプリットブレインに陥ったことを検出すると、DRBD は電子メールまたは他の方法によって管理者に自動的
に通知できます。この機能を有効にする方法についてはスプリットブレインの通知を参照してください。
スプリットブレインへの望ましい対処方法は、スプリットブレインからの手動回復を実施した後、根本原因を取
り除くことです。しかし、ときにはこのプロセスを自動化する方がいい場合もあります。自動化のために、DRBD
は以下のいくつかのアルゴリズムを提供します。
• 「若い」プライマリ側の変更を切り捨てる方法 ネットワークの接続が回復してスプリットブレインを検出
すると、DRBD は 最後に プライマリに切り替わったノードのデータを切り捨てます。
• 「若い」プライマリ側の変更を切り捨てる方法 DRBD は 最初に プライマリに切り替わったノードの変更
を切り捨てます。
• 変更が少ないプライマリ側の変更を切り捨てる方法 DRBD は 2 つのノードでどちらが変更が少ないかを
調べて、少ない方のノードの すべて を切り捨てます。
• 片ノードに変更がなかった場合の正常回復 もし片ノードにスプリットブレインの間にまったく変更がな
かった場合、DRBD は正常に回復し、修復したと判断します。しかし、こういった状況はほとんど考えら
れません。仮にリードオンリーでファイルシステムをマウントしただけでも、デバイスへの書き換えが起
11
第 2 章 DRBD の機能
きるためです。
自動修復機能を a 使うべきかどうかの判断は、個々のアプリケーションに強く依存します。変更量が少ないノー
ドのデータを切り捨てるアプローチは、ある種の Web アプリケーションの場合適しているかもしれません。一
方で、金融関連のデータベースアプリケーションでは、どのような 変更であっても自動的に切り捨てるようなこ
とは受け入れがたく、どのようなスプリットブレインの場合でも手動回復が望ましいでしょう。スプリットブレ
イン自動修復機能を使う場合、アプリケーションの特性を十分に考慮してください。
DRBD のスプリットブレイン自動修復機能を設定する方法については、スプリットブレインからの自動復旧ポ
リシーを参照してください。
2.10
ディスクフラッシュのサポート
ローカルディスクや RAID 論理ディスクでライトキャッシュが有効な場合、キャッシュにデータが記録された
時点でデバイスへの書き込みが完了したと判断されます。このモードは一般にライトバックモードと呼ばれます。
このような機能がない場合の書き込みはライトスルーモードです。ライトバックモードで運用中に電源障害が起
きると、最後に書き込まれたデータはディスクにコミットされず、データを紛失する可能性があります。
この影響を緩和するために、DRBD はディスクフラッシュを活用します。ディスクフラッシュは書き込みオペ
レーションのひとつで、対象のデータが安定した (不揮発性の) ストレージに書き込まれるまで完了しません。す
なわち、キャッシュへの書き込みではなくディスクへの書き込みを保証します。DRBD は、レプリケートする
データとそのメタデータをディスクに書き込むときに、フラッシュ命令を発行します。実際には、DRBD はアク
ティビティログの更新時や書き込みに依存性がある場合などにはライトキャッシュへの書き込みを
回します このことにより、電源障害の可能性に対する信頼性が高まっています。
しかし DRBD がディスクフラッシュを活用できるのは、直下のディスクデバイスがこの機能をサポートして
いる場合に限られることに注意してください。最近のカーネルは、ほとんどの SCSI および SATA デバイスに対
するフラッシュをサポートしています。Linux ソフトウェア RAID (md) は、直下のデバイスがサポートする場
合に限り、RAID-1 に対してフラッシュをサポートします。デバイスマッパ (LVM2、dm-raid、マルチパス) も
フラッシュをサポートしています。
電池でバックアップされた書き込みキャッシュ (BBWC) は、電池からの給電による消失しないストレージで
す。このようなデバイスは、電源障害から回復したときに中断していたディスクへの書き込みをディスクにフラッ
シュできます。このため、キャッシュへの書き込みは、事実上安定したストレージへの書き込みと同等とみなせ
ます。この種のデバイスが使える場合、DRBD の書き込みパフォーマンス向上させるためにフラッシュを無効に
設定できます。詳細は下位デバイスのフラッシュを無効にするを参照ください。
2.11
ディスクエラー処理ストラテジー
どちらかのノードの DRBD 下位ブロックデバイスが I/O エラーを返したときに、DRBD がそのエラーを上位
レイヤ (多くの場合ファイルシステム) に伝えるかどうかを制御できます。
I/O エラーを伝える pass on を指定すると、下位レベルのエラーを DRBD はそのまま上位レイヤに伝えます。
したがって、そのようなエラーへの対応 (ファイルシステムをリードオンリーでマウントしなおすなど) は上位レ
イヤに任されます。このモードはサービスの継続性を損ねることがあるので、多くの場合推奨できない設定だと
いえます。
12
2.12 無効データの処理ストラテジー
I/O エラーを伝えない detach を設定すると、最初の下位レイヤでの I/O エラーに対して、DRBD は自動的に
そのレイヤを切り離します。上位レイヤに I/O エラーは伝えられず、該当ブロックのデータはネットワーク越し
に対向ノードに書き込まれます。その後 DRBD はディスクレスモードと呼ばれる状態になり、すべての I/O は
対向ノードに対して読み込んだり、書き込むようになります。このモードでは、パフォーマンスは犠牲になりま
すが、サービスは途切れることなく継続できます。また、都合のいい任意の時点でサービスを対向ノードに移動
させることができます。
I/O エラー処理方針を設定する方法については I/O エラー処理方針の設定を参照してください。.
2.12
無効データの処理ストラテジー
DRBD はデータの inconsistent(不整合状態) と outdated(無効状態) を区別します。不整合とは、いかなる方
法でもアクセスできずしたがって利用できないデータ状態です。たとえば、進行中の同期先のデータが不整合デー
タの例です。この場合、ノードのデータは部分的に古く、部分的に新しくなっており、ノード間の同期は不可能
になります。下位デバイスの中にファイルシステムが入っていたら、このファイルシステムは、マウントはもち
ろんチェックも実行できません。
無効データは、セカンダリノード上のデータで、整合状態にあるもののプライマリ側と同期していない状態の
データをさします。一時的か永続的かを問わず、レプリケーションリンクが途切れたときに、この状態が生じま
す。リンクが切れている状態でのセカンダリ側の無効データは、クリーンではあるものの、対向ノードのデータ
更新が反映されず古いデータ状態になっている可能性があります。サービスが無効データを使ってしまうことを
防止するために、DRBD は無効データをリソースのロール (役割) ことを許可しません。
ネットワークの中断時にセカンダリノードのデータを無効に設定するためのインタフェースを DRBD は提供
しています。このための通信には、DRBD のレプリケーションリンクとは別のネットワーク通信チャネルを使い
ます。DRBD は無効データをアプリケーションが使ってしまうことを防止するために、このノードがプライマリ
になることを拒絶します。本機能の完全は実装は、DRBD レプリケーションリンクから独立した通信経路を使用
する DRBD と Pacemaker クラスタ用になされていますが、しかしこの API は汎用的なので、他のクラスタ管
理アプリケーションでも容易に本機能を利用できます。
レプリケーションリンクが復活すると、無効に設定されたリソースの無効フラグは自動的にクリアされます。
そして効率的なデータ同期が実行されます。
誤って無効データを使ってしまうことを防止するための設定例については、dopd でのリソースレベルフェン
シングを参照してください。
2.13
3 ノードレプリケーション
この機能は DRBD バージョン 8.3.0 以上で使用可能です。
3 ノードレプリケーションとは、2 ノードクラスタに 3 番目のノードを追加して DRBD でレプリケーションす
るものです。この方法は、バックアップやディザスタリカバリのために使われます。この構成においては、DRBD
Proxy による遠距離レプリケーションの内容も関係しています。
3 ノードレプリケーション既存の DRBD リソースの上にもうひとつの DRBD リソースを 積み重ね ることに
よって実現されます。次の図を参照してください。
下位リソースのレプリケーションには同期モード (DRBD プロトコル C) を使いますが、上位リソースは非同
期レプリケーション (DRBD プロトコル A) で動作させます。
13
第 2 章 DRBD の機能
Upper layer
Lower layer
Primary
図 2.1
Secondary
Backup
DRBD リソースの積み重ね
3 ノードレプリケーションは、常時実行することも、オンデマンドで実行することもできます常時レプリケー
ションでは、クラスタ側のデータが更新されると、ただちに 3 番目のノードにもレプリケートされます。オンデ
マンドレプリケーションでは、クラスタシステムとバックアップサイトの通信はふだんは停止しておき、cron な
どによって定期的に夜間などに同期をはかります。
2.14
DRBD Proxy による遠距離レプリケーション
この機能は DRBD 8.2.7 以降で利用可能です。
DRBD のレプリケーションのモードは非同期モードです。しかし、ソケットの出力バッファが一杯になると
(sndbuf-size を参照ください。DRBD.CONF)、アプリケーションからの書き込みはブロックされてしまいます。
帯域幅が狭いネットワークを通じて書き込みデータが対向ノードに送られるまで、そのデータを書き込んだアプ
リケーションは待たなければなりません。
平均的な書き込み帯域幅は、利用可能なネットワークの帯域幅によって制約されます。ソケットの出力バッファ
に収まるデータ量までのバースト的な書き込みは、問題なく処理されます。
オプション製品の DRBD Proxy のバッファリング機構を使って、この制約を緩和できます。DRBD プライマ
リノードからの書き込みデータは、DRBD Proxy のバッファに格納されます。DRBD Proxy のバッファサイズ
は、アドレス可能空間や搭載メモリの範囲内で自由に設定できます。
データ圧縮を行うように設定することも可能です。圧縮と展開は、応答時間をわずかに増やしてしまいます。
しかしネットワークの帯域幅が制約要因になっているのなら、転送時間の短縮効果は、圧縮と展開によるオーバ
ヘッドを打ち消します。
圧縮展開機能は複数 CPU による SMP システムを想定して実装され、複数 CPU コアをうまく活用できます。
多くの場合、ブロック I/O データの圧縮率は高く、帯域幅の利用効率は向上します。このため、DRBD Proxy
を使うことによって、DRBD プロトコル B または C を使うことも現実的なものとなります。
DRBD Proxy の設定については DRBD Proxy を参照ください。
DRBD Proxy はオープンソースライセンスによらない DRBD プロダクトファミリの製品になります。評
価や購入については sales@3ware.co.jp へご連絡ください。
14
2.15 トラック輸送によるレプリケーション
2.15
トラック輸送によるレプリケーション
トラック輸送 (またはディスク輸送) によるレプリケーションは、ストレージメディアを遠隔サイトに物理的に
輸送することによるレプリケーションです。以下の制約がある場合に、この方法はとくに有効です。
• レプリケート対象データ領域がかなり大きい (数百 GB 以上)
• レプリケートするデータの期待される変更レートは巨大ではない
• 利用可能なサイト間のネットワーク帯域幅が限られている
このような状況にある場合、トラック輸送を使わなければ、きわめて長期間 (数日から数週間またはそれ以上)
の初期同期が必要になってしまいます。トラック輸送でデータを遠隔サイトに輸送する場合、初期同期時間を劇
的に短縮できます。詳細はトラックベースのレプリケーションの使用をご覧ください。
2.16
動的対向ノード
この記述方法は DRBD バージョン 8.3.2 以上で使用できます。
DRBD のやや特殊な使用方法となる設定値として、動的対向ノード があります。動的対向ノードを設定する
と、DRBD のペア同士は特定の名前のホストに接続せず、いくつかのホスト間を動的に選択して接続するする能
力を持ちます。この設定において、DRBD は相手ノードをホスト名ではなく IP アドレスで識別します。
動的対向ノードの設定については 2 セットの SAN ベース Pacemaker クラスタ間を DRBD でレプリケートを
参照ください。
15
第
II 部
DRBD のコンパイル、
インストールおよび設定
第
3章
コンパイル済み DRBD バイナリ
パッケージのインストール
3.1
LINBIT 社が提供するパッケージ
DRBD プロジェクトのスポンサー企業である LINBIT 社は、商用サポート対象のお客様向けに DRBD バイナ
リパッケージを提供しています。これらパッケージは http://www.linbit.com/support/ から入手可能であり、
「公式 DRBD ビルド」です。
これらのビルドは次のディストリビューションで入手できます。
• Red Hat Enterprise Linux (RHEL) バージョン 5、6
• SUSE Linux Enterprise Server (SLES) バージョン 10、11
• Debian GNU/Linux バージョン 5.0 (lenny)、6.0 (squeeze)
• Ubuntu Server Edition LTS バージョン 8.04 (Hardy Heron)、10.04 (Lucid Lynx).
LINBIT 社では、新規の DRBD ソースのリリースと並行してバイナリビルドをリリースしています。
RPM ベースのシステム (SLES、RHEL) へのパッケージのインストールはパッケージ名とともに rpm -i (新
規インストールの場合) または rpm -U (アップグレードの場合) コマンドを呼び出すことで簡単に行えます。
Debian ベースのシステム (Debian GNU/Linux、Ubuntu) では、drbd8-utils と drbd8-module パッケー
ジを dpkg -i または gdebi コマンドでインストールします (該当する場合)。
3.2
ディストリビューションベンダが提供するパッケージ
コンパイル済みバイナリパッケージを含め、いくつかのディストリビューションで DRBD が配布されていま
す。これらのパッケージに対するサポートは、それぞれのディストリビュータが提供します。リリースサイクル
は、DRBD ソースのリリースより遅れる場合があります。
SUSE Linux Enterprise Server
SUSE Linux Enterprise Server (SLES) バージョン 9、10 には DRBD 0.7 が含まれ、SLES 11 High Availability
Extension (HAE) SP1 には DRBD 8.3 が含まれます。
SLES の場合、DRBD は通常は YaST2 のソフトウェアインストールコンポーネントによりインストールされ
ます。これは High Availability パッケージセレクションに同梱されています。
コマンドラインを使用してインストールする場合は、次のコマンドを実行します。
19
第 3 章 コンパイル済み DRBD バイナリパッケージのインストール
yast -i drbd
または
zypper install drbd
Debian GNU/Linux
Debian GNU/Linux リリース 5.0 (lenny) 以降に DRBD 8 が含まれ、Linux カーネル 2.6.32 である 6.0
(squeeze) では、Debian には移植バージョンの DRBD が提供されています。
DRBD がストックカーネルに含まれているため、squeeze で必要なのは drbd8-utils パッケージのインス
トールのみです。
apt-get install drbd8-utils
lenny (obsolete) では、次のようにして DRBD をインストールします。
apt-get install drbd8-utils drbd8-module
CentOS
CentOS のリリース 5 から DRBD 8 が含まれています。
DRBD は yum コマンドで行えます (extras リポジトリが有効になっている事が必要な事に注意してください)。
yum install drbd kmod-drbd
Ubuntu Linux
Ubuntu に DRBD をインストールするには次のコマンドを実行します。
apt-get update
apt-get install drbd8-utils drbd8-module
20
第
4章
ソースからの DRBD の構築と
インストール
4.1
DRBD ソースのダウンロード
DRBD の最新リリースと過去のリリースのソース tar ファイルは、http://oss.linbit.com/drbd/ からダウン
ロードできます。ソース tar ファイルは慣例に従い drbd-x.y.z.tar.gz という名前です。x、y、z は、それぞ
れメジャーリリース、マイナーリリース、バグフィックスリリースの番号です。
ソース tar ファイルをダウンロードする際の DRBD の圧縮ソースアーカイブのサイズは 0.5MB 未満です。現
在の作業用ディレクトリにダウンロードして圧縮解除するには、次のコマンドを実行します。
$ wget http://oss.linbit.com/drbd/8.4/drbd-latest.tar.gz
$ tar -xzf drbd-latest.tar.gz
ソース tar ファイルをダウンロードする際の wget の使用は単に一例です。好みのダウンローダを使用する
ことができます。
/usr/src や /usr/local/src など、通常、ソースコードを格納するディレクトリに DRBD を展開すること
をお勧めします。本書の例では /usr/src を使用しています。
4.2
公開 DRBD ソースリポジトリからソースを
チェックアウトする
DRBD のソースコードは公開 Git リポジトリに置かれています。これは http://git.drbd.org/ でオンライン
ブラウズできます。リポジトリから特定の DRBD リリースをチェックアウトするには、まず、好みの DRBD ブ
ランチを 複製 します。この例では、DRBD 8.4 ブランチから複製します。
$ git clone git://git.drbd.org/drbd-8.4.git
ファイアウォールがポート 9418 への TCP 接続を許可しないように設定されている場合は、HTTP 経由で
チェックアウトすることもできます (HTTP 経由で Git を使う場合は Git ネイティブのプロトコルよりも遅くな
る点に注意してください。そのため可能な限りネイティブプロトコル使用を推奨します)。
$ git clone http://git.drbd.org/drbd-8.4.git
いずれのコマンドの場合も、drbd-8.4 という Git チェックアウト用サブディレクトリが作成されます。特定
の DRBD リリースに相当するソースコードの状態に移動するには、次のコマンドを実行します。
21
第 4 章 ソースからの DRBD の構築とインストール
$ cd drbd-8.4
$ git checkout drbd-8.4.<x>
1. ここで、<x> は構築する DRBD のポイントリリースです。
これで、特定のバージョンの展開された DRBD ソース tar ファイルと同等のものがチェックアウト用ディレク
トリに格納され、ソースから DRBD を構築できるようになります。
同じリリースの展開されたソース tar ファイルと Git チェックアウトには、以下に示す 2 つの小さな違いがあ
ります。
• Git チェックアウトには debian/ サブディレクトリが含まれますが、ソース tar ファイルには含まれませ
ん。これは、tar ファイルに独自の Debian 用ファイル追加したいという Debian メンテナからの要求に応
じたものです。
• ソース tar ファイルには前もって処理された man ページが含まれますが、Git チェックアウトには含まれ
ません。したがって、Git チェックアウトから DRBD を構築する場合は、man ページを構築するための
完全な Docbook ツールチェーンが必要です。ソース tar ファイルから構築する場合は必要ありません。
4.3
ソースから DRBD を構築する
ビルドの前提条件を確認する
ソースから DRBD を構築するには、ビルドするホストが次の前提条件を満たす必要があります。
• make、gcc、glibc 開発ライブラリ、flex スキャナジェネレータがインストールされている必要があります。
モジュールをコンパイルするために使用する gcc は、実行中のカーネルを構築したものと同じバージョン
を使用してください。システムに複数バージョンの gcc がある場合でも、DRBD の構築システム<link
linkend="s-build-customcc">に特定のバージョンの gcc を選択する機能が含まれています。
• git checkout から直接ビルドする場合は、GNU Autoconf が必要になります。ソース tar ファイルからビ
ルドする場合は必要ありません。
• ディストリビューションが提供するストックカーネルを実行している場合は、合致するコンパイル済みカー
ネルヘッダパッケージをインストールする必要があります。これらは通常 kernel-dev,kernel-headers、
linux-headers のような名前です。この場合はカーネルソースツリーの準備を飛ばして DRBD ビルトツ
リーの準備へ進みます。
• ディストリビューションのストックカーネルを実行していない場合 (ソースから構築したカスタム構成を
持つカーネルでシステムが実行されている場合) は、カーネルソースファイルをインストールする必要が
あります。ディストリビューションのパッケージインストールメカニズムにこの機能が含まれている場合
があります。カーネルソースのディストリビューションパッケージは一般に kernel-source のような名
前です。
RPM ベースのシステムの場合は、このパッケージは kernel-source-version.rpm のような名前です。
kernel-version.src.rpm と紛らわしいので注意してください。DRBD を構築するためにインストー
ルするのは、前者のパッケージです。
kernel.org アーカイブの Vanilla カーネルの tar ファイルは、linux-version-tar.bz2 という名前です。これは、
/usr/src/linux-version , に展開し、シンボリックリンク /usr/src/linux でこのディレクトリを指定する
22
4.3 ソースから DRBD を構築する
ようにします。
このように、(ヘッダではなく) カーネルソースに対して DRBD を構築する場合は、カーネルソースツリーの
準備に進みます。
カーネルソースツリーの準備
DRBD を構築するためにソースツリーを準備するには、まず、展開したカーネルソースが置かれたディレクト
リに移動します。これは通常は /usr/src/linux-version、または /usr/src/linux というシンボリックリン
クです。
$ cd /usr/src/linux
次の手順は必須ではありませんが、実行することをお勧めします。この手順を実行する前に、必ず、既存の
.config ファイルを安全な場所にコピーしてください。この手順により、カーネルソースツリーを実質的に元の
状態に戻し、以前の構築や構成の実行により生成されたものを削除します。
$ make mrproper
これで、現在実行中のカーネル構成をカーネルソースツリーに 複製 することができます。このときに次のオ
プションを利用できます。
• 比較的新しい多くのカーネルビルドでは、現在実行中の構成が圧縮されて /proc ファイルシステム経由で
エクスポートされるため、コピー可能です。
$ zcat /proc/config.gz > .config
• SUSE カーネルの Makefile には cloneconfig ターゲットが含まれているため、こうしたシステムでは次
のコマンドを実行できます。
$ make cloneconfig
• インストールによってはカーネル構成が /boot にコピーされる場合があります。こうしたシステムでは
次のコマンドを実行できます
$ cp /boot/config-`uname -r` .config
• 最後に、.config ファイルのバックアップコピーを使用します。これは、現在実行中のカーネルの構築に
使用したファイルのコピーです。
DRBD ビルトツリーの準備
DRBD のコンパイルでは、まず configure スクリプトに含まれる DRBD ソースツリーを設定する必要があ
ります。
git checkout から直接ビルドする場合は、configure スクリプトは含まれておりません。そのため、チェッ
クアウトのトップで、autoconf とタイプし、スクリプトを作成する必要があります。
--help オプションでサポートされているオプションのリストが表示されます。重要なオプションを表にまと
めてあります。
23
第 4 章 ソースからの DRBD の構築とインストール
Option
--prefix
Description
インストールディレクトリ prefix
Default
/usr/local
Remarks
ソフトウェアがインストールされ
るディレクトリです。パッケージ
の場合は、通常/usr に上書きされ
ます。
--localstatedir
動作状態を記録するディレクトリ
/usr/local/var
prefix はデフォルトのままでも、
この値を /var に書き換えるユー
--sysconfdir
システム設定ディレクトリ
/usr/local/etc
--with-km
DRBD カーネルモジュールのビル no
DRBD カーネルモジュールをビル
ド
ドする場合は、このオプションを
ザは多いでしょう。
prefix はデフォルトのままでも、
この値を /etc に書き換えるユー
ザは多いでしょう。
有効にしてください。
--with-utils
DRBD ユーザ空間ユーティリティ yes
最新バージョンのカーネル用に
のビルド
DRBD カーネルモジュールをビ
ルドし、その際、DRBD をアップ
グレードしたくない場合は、この
オプションを無効にしてください。
--with-heartbeat
DRBD Heartbeat 統合のビルド
yes
DRBD の Heartbeat v1 用リソー
スエージェントを使用しない、も
しくは、dopd を使用しない場合に
は、このオプションを無効にして
ください。
--with-pacemaker
DRBD Pacemaker 統合のビルド yes
Pacemaker クラスタリソース管理
プログラムを使用しない場合には、
このオプションを無効にしてくだ
さい。
--with-rgmanager
DRBD Red Hat Cluster Suite no
Red Hat Cluster Suite ク ラ
統合のビルド
スタリソース管理システムの
rgmanager を使用しない場合には、
このオプションを無効にしてくださ
い。実際に rgmanager パッケー
ジのビルドする際、rpmbuild を
パスするには --with rgmanager
が必要なので注意してください。
--with-xen
DRBD Xen 統合
yes (x86 アーキテクチャの場合)
Xen 統合で、block-drbd ヘルパー
スクリプトを使用しない場合には、
このオプションを無効にしてくだ
さい。
--with-bashcompletion
drbdadm に対する bash の自動補 yes
完機能をビルドします。
bash 以外のシェルを使う場合、も
しくは、drbdadm コマンドに対す
る自動補完を使用しない場合には、
このオプションを無効にしてくだ
さい。
--enable-spec
ディストリビューションに対応し
no
た RPM spec ファイルの生成
ディストリビューションに対応す
る RPM spec ファイルを生成
したい場合には、このオプション
を有効にしてください。DRBD
RPM パッケージのビルドもご参
照ください。
ほとんどのユーザーにとっては以下の設定オプションが必要でしょう。
$ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-km
configure スクリプトは、DRBD のビルドをディストリビューション特有のニーズに適合させます。起動され
ると、ディストリビューションに応じて自動で実行され、デフォルトに従って設定されます。デフォルト値を書
き換える場合には、十分に注意してください。
configure スクリプトは、起動されたディレクトリに、ログファイル config.log を生成します。ビルドで発
生した問題をメーリングリストに報告する際には、そのログファイルをメールに添付するか、他の人からもダウ
ンロードできるような状態にしておくとよいでしょう。
24
4.3 ソースから DRBD を構築する
DRBD ユーザ空間ユーティリティのビルド
ユーザ空間ユーティリティをビルドする際には、DRBD を DRBD ビルトツリーの準備しなければなりません。
なお、このオプションはデフォルトで有効になっています。
DRBD ユーザ空間ユーティリティをビルドするには、DRBD をチェックアウトしたディレクトリのトップ、も
しくは、traball を展開したディレクトリで、次のコマンドを起動します。
$ make
$ sudo make install
このコマンドにより、管理ユーティリティ (drbdadm、drbdsetup または drbdmeta) がビルドされ、適切な場
所にインストールされます。DRBD ビルトツリーの準備で、他の --with オプションを選択した場合、DRBD
と他のアプリケーションとを統合するためのスクリプトもインストールされます。
カーネルモジュールとして DRBD をコンパイルする
DRBD カーネルモジュールをビルドするには DRBD ビルトツリーの準備必要があります。このオプションは
デフォルトでは無効になっています。
現在実行中のカーネル用に DRBD を構築する 展開された DRBD ソースがあるディレクトリに移動したら、
drbd という名前のカーネルモジュールサブディレクトリに移動し、ここでモジュールを構築します。
$ cd drbd
$ make clean all
これで、現在実行中のカーネルと一致する DRBD カーネルモジュールが構築されます。このカーネルソース
には /lib/modules/uname -r/build シンボリックリンクでアクセスできます。
コンパイル済みカーネルヘッダに対して構築する
/lib/modules/uname -r/build シンボリックリンクが存
在しない場合に、実行中のストックカーネル (ディストリビューションに含まれるコンパイル済みカーネル) に
対して構築を行う場合は、(カーネルソースではなく) 対応する カーネルヘッダディレクトリを指定するように
KDIR 変数を設定する必要があります。DRBD ビルドプロセスは、通常 /usr/src/linux-version/include
に置かれた実際のカーネルヘッダに加えて、カーネルの Makefile と設定ファイル (.config) も探します。これ
らは一般に構築済みカーネルヘッダパッケージに含まれています。
コンパイル済みカーネルヘッダに対して構築する場合は、たとえば次のようなコマンドを実行します。
$ cd drbd
$ make clean
$ make KDIR=/lib/modules/2.6.38/build
カーネルソースツリーに対して構築する
現在実行中のカーネル 以外 のカーネルに対して DRBD を構築する際
に、ターゲットカーネルのコンパイル済みカーネルソースがない場合は、ターゲットカーネルの完全なソースツ
リーに対して DRBD を構築する必要があります。そのためには、KDIR 変数をカーネルソースディレクトリを
指定するように設定します。
$ cd drbd
$ make clean
$ make KDIR=/path/to/kernel/source
25
第 4 章 ソースからの DRBD の構築とインストール
デフォルト以外の C コンパイラを使用する
CC 変数を使用して、コンパイラを明示的に設定することもできま
す。一部の Fedora バージョンの場合はこの手順が必要です。たとえば、次のようになります。
$ cd drbd
$ make clean
$ make CC=gcc32
構築が正常に完了したか確認する モジュールの構築が正常に完了すると、drbd ディレクトリに drbd.ko とい
うカーネルモジュールファイルが作成されます。必要に応じて、/sbin/modinfo drbd.ko を実行して新しく構築
したモジュールを確認できます。
4.4
DRBD RPM パッケージのビルド
DRBD 構築システムには、DRBD ソースツリーから直接 RPM パッケージを構築する機能が含まれています。
RPM を構築する場合にも、make による構築とインストールについてはビルドの前提条件を確認するが適用され
ます。当然ながら、加えて RPM 構築ツールも必要です。
コンパイル済みヘッダが使用可能な場合に実行中のカーネルに対して構築を行う場合以外はカーネルソースツ
リーの準備も参照してください。
構築システムでは 2 つの方法で RPM を構築することができます。最上位の Makefile で rpm ターゲットを呼び
出す方法が簡単です。
$ ./configure
$ make rpm
$ make km-rpm
この方法では、定義済みのテンプレートから spec ファイルが自動的に生成され、この spec ファイルを使用し
てバイナリ RPM パッケージを構築できます。
make rpm は複数の RPM パッケージを生成します。
その他、より自由度の高い方法として configure を使って spec ファイルを作成し、rpmbuild コマンドを実
行する方法もあります。
$
$
$
$
./configure --enable-spec
make tgz
cp drbd*.tar.gz `rpm -E _sourcedir`
rpmbuild -bb drbd.spec
両方の DRBD ユーザ空間ユーティリティとカーネルモジュールをビルドする場合には、次のコマンドを使い
ます。
$
$
$
$
$
./configure --enable-spec --with-km
make tgz
cp drbd*.tar.gz `rpm -E _sourcedir`
rpmbuild -bb drbd.spec
rpmbuild -bb drbd-kernel.spec
システムの RPM 設定 (または独自の ~/.rpmmacros 設定) が指定する場所に RPM が作成されます。
これらのパッケージを作成したら、システムの他の RPM パッケージと同様にインストール、アップグレード、
アンインストールを行うことができます。
カーネルをアップグレードした場合は、新しいカーネルに合わせて新しい drbd-km パッケージを生成する必
26
4.5 DRBD Debian パッケージの構築
表 4.1
Package name
drbd
DRBD userland RPM packages
Description
DRBD メタパッケージ
Dependencies
他の全ての drbd-* パッケージ
Remarks
トップレベルの仮想パッケージこ
のパッケージをインストールする
と、依存関係にある他のすべての
ユーザ空間パッケージが一緒にイ
ンストールされます。
drbd-utils
管理者ユーティリティ
DRBD を実行するホストに必要な
drbd-udev
udev 統合機能
drbd-utils,udev
drbd-xen
Xen DRBD ヘルパースクリプト
drbd-utils,xen
drbd-heartbeat
DRBD Heartbeat 統合スクリプ drbd-utils,heartbeat
旧 v1 形式 Heartbeat クラスタが
ト
DRBD を管理できるようにしま
パッケージです。
DRBD デバイスに対するシンボ
リックの管理をしやすくします。
xend が DRBD リソースを自動管
理できるようにします。
す。
drbd-pacemaker
drbd-rgmanager
DRBD Pacemaker 統合スクリプ drbd-utils,pacemaker
Pacemaker クラスタが DRBD を
ト
管理できるようにします。
DRBD Red Hat Cluster Suite drbd-utils,rgmanager
Red Hat Cluster Suite リソー
ス管理システムの rgmanage が
DRBD を管理できるようにしま
統合スクリプト
す。
drbd-bashcompletion
Progammable bash completion drbd-utils , bash-completion drbdadm ユーティリティで自動補
完が使えるようにするためのもの
です。
要があります。
一方、DRBD ユーザ空間パッケージの場合は、新規バージョンの DRBD にアップグレードしたときにのみ再
作成が必要です。新規カーネル および 新規バージョンの DRBD にアップグレードした場合は、両方のパッケー
ジをアップグレードする必要があります。
4.5
DRBD Debian パッケージの構築
DRBD 構築システムには、DRBD ソースツリーから直接 Debian パッケージを構築する機能が含まれていま
す。Debian パッケージを構築する場合にも、make による構築とインストールについてはビルドの前提条件を確
認するの条件が実質的に適用されます。加えて、Debian パッケージツールを含む dpkg-dev パッケージも必要
です。さらに、root 以外のユーザとして DRBD を構築する場合には、fakeroot も必要です (この方法を強く
推奨)。
コンパイル済みヘッダが使用可能な場合に実行中のカーネルに対して構築を行う場合以外はカーネルソースツ
リーの準備も参照してください。
DRBD ソースツリーには、debian パッケージ作成に必要なファイルを含む debian サブディレクトリがあり
ます。ただし、このサブディレクトリは DRBD のソース tar ファイルには含まれていません。代わりに、特定の
DRBD リリースに関連付けられた タグ の公開 DRBD ソースリポジトリからソースをチェックアウトする必要
があります。
このようなチェックアウトを作成したら、次のコマンドを実行して DRBD Debian パッケージを構築します。
$ dpkg-buildpackage -rfakeroot -b -uc
この例では、drbd-buildpackage を呼び出して、バイナリのみの構築を有効にし (-b)、ユーザを root
以外とし (-rfakeroot)、さらに変更ファイルの暗号化シグネチャを無効にします (-uc)。もちろん、他の
構築オプションを指定することもできます。詳細は、dpkg-buildpackage の man ページを参照してく
ださい。
27
第 4 章 ソースからの DRBD の構築とインストール
この構築プロセスにより、次の 2 つの Debian パッケージが作成されます。
• DRBD ユーザ空間を含むパッケージ drbd8-utils_x.y.z-BUILD_ARCH.deb ;
• module-assistant に対応したモジュールソースパッケージ (drbd8-module-source_x.y.z-BUILD_all.deb)
これらのパッケージを作成したら、システムの他の Debian パッケージと同様にインストール、アップグレー
ド、アンインストールを行うことができます。
Debian の module-assistant 機能を使用すれば、インストールしたモジュールソースパッケージから実際の
カーネルモジュールを簡単に構築してインストールできます。
# module-assistant auto-install drbd8
上記のコマンドの短縮形も使用できます。
# m-a a-i drbd8
カーネルをアップグレードした場合は、新しいカーネルに合わせてカーネルモジュールを再構築する必要があ
ります (上述の module-assistant 機能を使用)。一方、drbd8-utils と drbd8-module-source パッケージ
の場合は新規バージョンの DRBD にアップグレードしたときにのみ再作成が必要です。新規カーネル および 新
規バージョンの DRBD にアップグレードした場合は、両方のパッケージをアップグレードする必要があります。
28
第
5章
DRBD の設定
5.1
下位レベルストレージの準備
DRBD をインストールしたら、両方のクラスタノードにほぼ同じ容量の記憶領域を用意する必要があります。
これが DRBD リソースの 下位レベルデバイス になります。システムの任意のブロックデバイスを下位レベルデ
バイスとして使用できます。たとえば、次のようなものがあります。
• ハードドライブのパーティション (または物理ハードドライブ全体)
• ソフトウェア RAID デバイス
• LVM 論理ボリュームまたは Linux デバイスマッパインフラストラクチャによって構成されるその他のブ
ロックデバイス
• システム内のその他のブロックデバイス。
リソースを積み重ねる こともできます。つまり、DRBD デバイスを他の DRBD デバイスの下位レベルのデバ
イスとして利用することができます。リソースの積み重ねにはいくつかの注意点があります。詳しくは 3 ノード
構成の作成を参照ください。
ループデバイスを DRBD の下位レベルデバイスとして使用することもできますが、デッドロックの問題が
あるためお勧めできません。
DRBD リソースを作成する前に、そのストレージ領域を空にしておく必要は ありません。DRBD を使用して、
非冗長のシングルサーバシステムから、2 ノードのクラスタシステムを作成することは一般的なユースケースで
すが、いくつか重要な注意点があります。(その場合には)DRBD メタデータを参照ください)
本ガイドの説明は、次のようなとてもシンプルな構成を前提としています。
• 両ホストには使用可能な (現在未使用の) /dev/sda7 というパーティションがある。
• 内部メタデータを使用する。
5.2
ネットワーク構成の準備
必須要件ではありませんが、DRBD によるレプリケーションの実行には、専用接続を使用することをお勧めし
ます。この書き込みには、ギガビットイーサネットどうしをケーブルで直結した接続が最適です。DRBD をス
イッチを介して使用する場合には、冗長コンポーネントと bonding ドライバ (active-backup モードで) の使
用を推奨します。
29
第 5 章 DRBD の設定
一般に、ルータを介して DRBD レプリケーションを行うことはお勧めできません。スループットと待ち時間
の両方に悪影響を及ぼし、パフォーマンスが大幅に低下します。
ローカルファイアウォールの要件として重要な点は、通常、DRBD は 7788 以上の TCP ポートを使用し、それ
ぞれの TCP リソースが個別の TCP ポート上で待機するということです。設定したリソースすべてで、DRBD は
2 つ の TCP 接続を使用します。これらの接続が許可されるようにファイアウォールを設定する必要があります。
SELinux や AppArmor などの MAC (Mandatory Access Control) スキーマが有効な場合は、ファイアウォー
ル以外のセキュリティ要件も適用される場合があります。DRBD が正しく機能するように、必要に応じてローカ
ルセキュリティポリシーを調整してください。
また、DRBD に使用する TCP ポートを別のアプリケーションが使用していないことも確認してください。
複数の TCP ポートをサポートするように DRBD リソースを設定することはできません。DRBD 接続に負荷
分散や冗長性が必要な場合は、イーサネットレベルで簡単に実現できます (この場合も ボンディング ドライバを
使用してください)。
本ガイドの説明は、次のようなとてもシンプルな構成を前提としています。
• 2 つの DRBD ホストそれぞれに、現在使用されていないネットワークインタフェース eth1 が存在する
(IP アドレスはそれぞれ 10.1.1.31 と 10.1.1.32)
• どちらのホストでも他のサービスが TCP ポート 7788∼7799 を使用していない。
• ローカルファイアウォール設定は、これらのポートを介したホスト間のインバウンドとアウトバウンドの
両方の TCP 接続を許可する。
5.3
リソースの設定
DRBD のすべての機能は、設定ファイル /etc/drbd.conf で制御されます。通常、この設定ファイルは、次
のような内容となっています。
include "/etc/ drbd.d/ global_ common.conf";
include "/etc/drbd.d/*.res";
通例、/etc/drbd.d/global_common.conf には DRBD 設定の、global セクションと common セクションの
セクションが含まれます。また、.res ファイルには各 resource セクションセクションが含まれます。
drbd.conf に include ステートメントを使用せずにすべての設定を記載することも可能です。しかし、設定
の見やすさの観点からは、複数のファイルに分割することをお勧めします。
いずれにしても drbd.conf や、その他の設定ファイルは、すべてのクラスタノードで 正確に同じ である必要
があります。
DRBD のソース tar ファイルの scripts サブディレクトリに、サンプル設定ファイルがあります。バ
イナリインストールパッケージの場合、サンプル設定ファイルは直接 /etc にインストールされるか、
/usr/share/doc/packages/drbd などのパッケージ固有の文書ディレクトリにインストールされます。
このセクションは、DRBD の使用を開始するため、必ず理解しておく必要のある設定ファイルの項目について
の説明です。設定ファイルの構文と内容の詳細については、DRBD.CONF を参照してください。
設定例
本ガイドでの説明は、前章で挙げた例をもとした最小限の構成を前提としています。
1. シンプルな DRBD 構成例 (/etc/drbd.d/global_common.conf)
30
5.3 リソースの設定
global {
usage-count yes;
}
common {
net {
protocol C;
}
}
1. シンプルな DRBD リソースの構成例 (/etc/drbd.d/r0.res)
resource r0 {
on alice {
device
disk
address
meta-disk
}
on bob {
device
disk
address
meta-disk
}
}
/dev/drbd1;
/dev/sda7;
10.1.1.31:7789;
internal;
/dev/drbd1;
/dev/sda7;
10.1.1.32:7789;
internal;
この例では、DRBD が次のように構成されます。
• DRBD の使用状況の統計をオプトインとして含める (global セクションを参照).
• 完全に同期したレプリケーションを使用するようにリソースを設定する (レプリケーションのモード)
• クラスタには 2 つのノード alice と bob がある。
• 任意の名前 r0 を持つリソースがあり /dev/sda7 下位レベルデバイスとして使用する。このリソースは、
内部メタデータによって設定されている。
• リソースはネットワーク接続に TCP ポート 7789 を使用し、それぞれ IP アドレス 10.1.1.31 と 10.1.1.32
にバインドされる。
暗黙的に、上記の設定はリソースの 1 つのボリュームを作成し、ゼロ (0) 番号が付与されます。1 つのリソー
スに複数のボリュームを設定する場合には、次のようにします。
1. 複数ボリュームの DRBD リソース構成例 (/etc/drbd.d/r0.res)
resource r0 {
volume 0 {
device
disk
meta-disk
}
volume 1 {
device
disk
meta-disk
}
on alice {
/dev/drbd1;
/dev/sda7;
internal;
/dev/drbd2;
/dev/sda8;
internal;
31
第 5 章 DRBD の設定
address
}
on bob {
address
}
10.1.1.31:7789;
10.1.1.32:7789;
}
ボリュームは既存のデバイスの動作中にも追加できます。新しい DRBD ボリュームを既存のボリュームグ
ループへ追加するを参照ください。
global セクション
このセクションは設定の中で 1 回しか使用できません。通常この設定は /etc/drbd.d/global_common.conf
ファイルに記述します。設定ファイルが 1 つの場合は、設定ファイルの一番上に記述します。このセクションで
使用できるオプションはわずかですが、ほとんどのユーザの場合、必要なのは次の 1 つだけです。
+usage-count+
DRBD プロジェクトはさまざまなバージョンの DRBD の使用状況について統計を取ります。これは、システムに新規の DRBD バー
ジョンがインストールされるたびに、HTTP サーバに接続することにより実行されます。これを無効にするには、+usage-count
no;+ と指定します。デフォルトは +usage-count ask;+ で、DRBD をアップグレードするたびにプロンプトが表示されます。
DRBD の使用状況の統計は公開されています。http://usage.drbd.org をご参照ください。
common セクション
このセクションで、各リソースに継承される設定を簡単に定義できます。通常この設定は /etc/drbd.d/global_
common.conf に記述します。ここで定義するオプションは、リソースごとに定義することもできます。
common セクションは必須ではありませんが、複数のリソースを使用する場合は、記述することを強くお勧め
します。これにより、オプションを繰り返し使用することによって設定が複雑になることを回避できます。
上記の例では、net{ protocol C;} が common セクションで指定されているため、設定されているすべての
リソース (r0 含む) がこのオプションを継承します。ただし、明示的に別の protocol オプションが指定されて
いる場合は除きます。使用可能なその他の同期プロトコルについては、レプリケーションのモードを参照してく
ださい。
resource セクション
各リソースの設定ファイルは、通常 /etc/drbd.d/<resource>.res という名前にします。定義する DRBD
リソースは、設定ファイルで resource name を指定して名前を付ける必要があります。任意の名前を使用できま
すが、空白を除く US-ASCII 文字セットを使う必要があります。
各リソースには 2 つの on <host> サブセクションも必要です (各クラスタノードに 1 つずつ)。その他すべて
の設定は common セクション (記述した場合) から継承されるか、DRBD のデフォルト設定から取得されます。
さらに、オプションの値が両方のホストで等しい場合は、直接 resource セクションで指定することができま
す。このため、設定例は次のように短くすることができます。
resource r0 {
device
/dev/drbd1;
disk
/dev/sda7;
meta-disk internal;
on alice {
address
10.1.1.31:7789;
}
32
5.4 リソースを初めて有効にする
on bob {
address
}
10.1.1.32:7789;
}
5.4
リソースを初めて有効にする
すでに述べた手順に従って最初のリソース設定を完了したら、リソースを稼働させます。
両方のノードに対して、次の手順を行います。
さきほどの構成例 (resource r0{ ...
}) では、<resource> は r0 となります。
メタデータを作成する この手順は、最初にデバイスを作成するときにのみ必要です。これにより、DRBD のメ
タデータを初期化します。
# drbdadm create-md <resource>
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initializing bitmap
New drbd meta data block sucessfully created.
リソースを有効にする これにより、リソースとそのバッキングデバイス (マルチボリュームリソースの場合は、
すべてのデバイス) とを結びつけます。また、対向ノードのリソースと接続します。
# drbdadm up <resource>
Observe /proc/drbd /proc ファイルシステムにある DRBD の仮想状態ファイル /proc/drbd , に次のよう
な情報が記述されています。
# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by buildsystem@linbit, 2011-12-20
12:58:48
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:524236
この時点では Inconsistent/Inconsistent のディスク状態になっているはずです。
これで、DRBD がディスクリソースとネットワークリソースに正しく割り当てられ、稼働できるようになりま
した。次に、どちらのノードをデバイスの初期同期のソースとして使用するか指定する必要があります。
5.5
デバイスの初期同期
DRBD を完全に機能させるには、さらに次の 2 つの手順が必要です。
同期元を選択する
新しく初期化した空のディスクを使用する場合は、任意のディスクを同期元にできます。い
ずれかのノードにすでに重要なデータが格納されている場合は、十分注意して 必ずそのノードを同期元として選
33
第 5 章 DRBD の設定
択してください。デバイスの初期同期の方向が誤っていると、データを失うおそれがあります。慎重に行ってく
ださい。
初期フル同期を開始する
この手順は、最初のリソース設定の際に、同期ソースとして選択した 1 つのノードに
対してのみ実行します。次のコマンドで実行します。
# drbdadm primary --force <resource>
このコマンドを指定すると、初期フル同期が開始します。/proc/drbd で同期の進行状況を監視できます。デ
バイスのサイズによっては、同期に時間がかかる場合があります。
この時点で、初期同期が完了していなくても DRBD デバイスは完全に稼働します。(ただし、パフォーマンス
はいくらか低いです。) 次に、デバイスのファイルシステムを作成します。これを下位ブロックデバイスとして
使用し、マウントして、アクセス可能なブロックデバイスでさまざまな操作を実行することができます。
リソースに対して一般的な管理タスクを行う場合は、一般的な管理作業に進んでください。
5.6
トラックベースのレプリケーションの使用
リモートノードに同期するデータを前もってロードし、デバイスの初期同期をスキップする場合は、次の手順
を行います。
これは、ローカルノードに設定済みだが接続されていないプライマリロールの DRBD リソースがあることを前
提とします。つまり、デバイスの設定が完了し、両方のノードに同一の drbd.conf のコピーが存在しデバイスの
初期同期をローカルノードで実行するコマンドを発行したが、リモートノードがまだ接続されていない状態です。
• ローカルノードで次のコマンドを実行します。
# drbdadm new-current-uuid --clear-bitmap <resource>
• リソースのデータ およびそのメタデータ の正確に同一のコピーを作成します。たとえば、ホットスワッ
プ可能な RAID-1 ドライブの一方を抜き取ります。この場合は、もちろん新しいドライブをセットして
RAID セットを再構築しておくべきでしょう。抜き取ったドライブは、正確なコピーとしてリモートサイ
トに移動できます。別の方法としては、ローカルのブロックデバイスがスナップショットコピーをサポー
トする場合 (LVM の上位で DRBD を使用する場合など) は、dd を使用してスナップショットのビット単
位のコピーを作ってもかまいません。
• ローカルノードで次のコマンドを実行します。
# drbdadm new-current-uuid <resource>
この 2 回目のコマンドには --clear-bitmap がありません。
• 対向ホストの設置場所にコピーを物理的に移動します。
• コピーをリモートノードに追加します。ここでも物理ディスクを接続するか、リモートノードの既存のス
トレージに移動したデータのビット単位のコピーを追加します。レプリケートしたデータだけでなく、関
連する DRBD メタデータも必ず復元するかコピーしてください。そうでない場合、ディスクの移動を正
しく行うことができません。
• リモートノードで次のコマンドを実行します。
34
5.6 トラックベースのレプリケーションの使用
# drbdadm up <resource>
2 つのホストを接続しても、デバイスのフル同期は開始されません。代わりに、drbdadm --clear-bitmap
new-current-uuid の呼び出し以降に変更されたブロックのみを対象とする自動同期が開始します。
以降、データの変更が 全くない 場合でも、アクティビティログの領域が含まれるため、それの同期が短時間行
われます。これはチェックサムベース同期を使用することで緩和されます。
この手順は、リソースが通常の DRBD リソースの場合でもスタックリソースの場合でも使用できます。スタッ
クリソースの場合は、-S または --stacked オプションを drbdadm に追加します。
35
第
III 部
DRBD の使い方
第
6章
一般的な管理作業
この章では、日常的な運用において必要な一般的な管理作業について説明します。トラブルシューティング作業
については取り上げません。これについては、トラブルシューティングとエラーからの回復を参照してください。
6.1
DRBD の状態のチェック
drbd-overview で状態を取得する
DRBD のステータスは drbd-overview ユーティリティで簡単に確認できます。
# drbd-overview
0:home
Connected Primary/Secondary
UpToDate/UpToDate C r--- /home
xfs 200G 158G 43G 79%
1:data
Connected Primary/Secondary
UpToDate/UpToDate C r--- /mnt/ha1
ext3 9.9G 618M 8.8G 7%
2:nfs-root
Connected Primary/Secondary
UpToDate/UpToDate C r--- /mnt/netboot ext3 79G 57G 19G 76%
/proc/drbd でのステータス情報
/proc/drbd は現在設定されているすべての DRBD リソースに関するリアルタイムのステータス情報を表示
する仮想ファイルです。次のようにして、ファイルの内容を確認できます。
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 09b6d528b3b3de50462cd7831c0a3791abc665c3 build by linbit@buildsystem.linbit,
2011-10-12 09:07:35
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----ns:0 nr:0 dw:0 dr:656 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r--ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
2: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r--ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
先頭に version: と記述された最初の行は、システムで使用されている DRBD のバージョンを示します。2
行目にはこのビルドに関する情報が記述されています。
この例の他の 6 行は、構成されている各 DRBD デバイスについて繰り返されるブロックで、先頭にデバイス
のマイナー番号が付いています。この場合、0 はデバイス /dev/drbd0 に対応します。
/proc/drbd のデバイス固有の出力には、リソースについてのさまざまな情報が表示されます。
39
第 6 章 一般的な管理作業
1. cs (connection state) ネットワーク接続の状態。接続状態の種類や詳細については接続状態を参照くだ
さい。
2. ro (roles) ノードのロール最初にローカルノードのロールが表示され、スラッシュの後に対向ノードのロー
ルが表示されます。リソースロールの詳細は、リソースのロールを参照してください。
3. ds (disk states) ハードディスクの状態スラッシュの前にローカルノードの状態、スラッシュの後に対向
ノードのハードディスクの状態が表示されます。さまざまなディスク状態についてはディスク状態をご参
照ください。
レプリケーションプロトコル
Replication protocol はリソースが使用します。A、B、C のいずれかです。詳細
はレプリケーションのモードを参照ください。
I/O フラグ リソースの I/O 状態を反映する 6 種のフラグです。これらフラグの詳細は I/O 状態フラグを参照
ください。
パフォーマンスインジケータ
リソースの利用とパフォーマンスを反映したカウンタです。詳細はパフォーマン
ス指標を参照ください。
接続状態
リソースの接続状態を確認するには、/proc/drbd を監視するか、‘drbdadm cstate‘コマンドを実行します。
# drbdadm cstate <resource>
Connected
リソースの接続状態には次のようなものがあります。
1. StandAlone ネットワーク構成は使用できません。リソースがまだ接続されていない、管理上の理由で切
断されている (‘drbdadm disconnect‘を使用)、認証の失敗またはスプリットブレインにより接続が解除さ
れた、のいずれかが考えられます。
2. Disconnecting 切断中の一時的な状態です。次の状態は StandAlone です。
3. Unconnected 接続を試行する前の一時的な状態です。次に考えられる状態は、WFConnection および
WFReportParams です。
4. Timeout 対向ノードとの通信のタイムアウト後の一時的な状態です。次の状態は Unconnected です。
5. BrokenPipe 対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。
6. NetworkFailure 対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。
7. ProtocolError 対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。
8. TearDown 一時的な状態です。対向ノードが接続を閉じています。次の状態は Unconnected です。
9. WFConnection 対向ノードノードがネットワーク上で可視になるまでノードが待機します。
10. WFReportParams TCP (伝送制御プロトコル) 接続が確立され、ノードが対向ノードからの最初のネット
ワークパケットを待っています。
11. Connected DRBD の接続が確立され、データミラー化がアクティブになっています。これが正常な状態
です。
12. StartingSyncS 管理者により開始されたフル同期が始まっています。次に考えられる状態は SyncSource
または PausedSyncS です。
40
6.1 DRBD の状態のチェック
13. StartingSyncT 管理者により開始されたフル同期が始まっています。次の状態は WFSyncUUID です。
14. WFBitMapS 部分同期が始まっています。次に考えられる状態は SyncSource または PausedSyncS です。
15. WFBitMapT 部分同期が始まっています。次に考えられる状態は WFSyncUUID です。
16. WFSyncUUID 同期が開始されるところです。次に考えられる状態は SyncTarget または PausedSyncT
です。
17. SyncSource 現在、ローカルノードを同期元にして同期を実行中です。
18. SyncTarget 現在、ローカルノードを同期先にして同期を実行中です。
19. PausedSyncS ローカルノードが進行中の同期の同期元ですが、現在は同期が一時停止しています。原因
として、別の同期プロセスの完了との依存関係、または drbdadm pause-sync を使用して手動で同期が
中断されたことが考えられます。
20. PausedSyncT ローカルノードが進行中の同期の同期先ですが、現在は同期が一時停止しています。原因
として、別の同期プロセスの完了との依存関係、または drbdadm pause-sync を使用して手動で同期が
中断されたことが考えられます。
21. VerifyS 現在、ローカルノードを照合元にして、オンラインデバイスの照合を実行中です。
22. VerifyT 現在、ローカルノードを照合先にして、オンラインデバイスの照合を実行中です。
リソースのロール
リソースのロールは、/proc/drbd を監視するか、drbdadm role コマンドを発行することのいずれかによっ
て確認できます。
# drbdadm role <resource>
Primary/Secondary
左側はローカルリソースのロール、右側はリモートリソースのロールです。
リソースロールには次のようなものがあります。
1. Primary 現在、リソースはプライマリロールで読み書き加能です。2 つのノードの一方だけがこのロール
になることができます。ただし、デュアルプライマリモードが有効な場合は例外です。
2. Secondary 現在、リソースがセカンダリロールです。対向ノードから正常に更新を受け取ることができま
すが (切断モード以外の場合)、このリソースに対して読み書きは実行できません。1 つまたは両ノードが
このロールになることができます。
3. Unknown 現在、リソースのロールが不明です。ローカルリソースロールがこの状態になることはありませ
ん。これは、切断モードの場合にのみ、対向ノードのリソースロールだけに表示されます。
ディスク状態
リソースのディスクの状態は、/proc/drbd を監視することにより、または drbdadm dstate コマンドを発
行することのいずれかによって確認できます。
# drbdadm dstate <resource>
UpToDate/UpToDate
左側はローカルディスクの状態、右側はリモートディスクの状態です。
ローカルディスクとリモートディスクの状態には、次のようなものがあります。
1. Diskless DRBD ドライバにローカルブロックデバイスが割り当てられていません。原因として、リソー
41
第 6 章 一般的な管理作業
スが下位デバイスに接続されなかった、drbdadm detach を使用して手動でリソースを切り離した、また
は下位レベルの I/O エラーにより自動的に切り離されたことが考えられます。
2. Attaching メタデータ読み取り中の一時的な状態です。
3. Failed ローカルブロックデバイスが I/O 障害を報告した後の一時的な状態です。次の状態は Diskless
です。
4. Negotiating すでに 接続している DRBD デバイスで 接続 が実行された場合の一時的状態です。
5. Inconsistent データが一致しません。新規リソースを作成した直後に (初期フル同期の前に) 両方のノー
ドがこの状態になります。また、同期中には片方のノード (同期先) がこの状態になります。
6. Outdated リソースデータは一致していますが、無効データの処理ストラテジーです。
7. DUnknown ネットワーク接続を使用できない場合に、対向ノードディスクにこの状態が使用されます。
8. Consistent 接続していない状態でノードのデータが一致しています。接続が確立すると、データが
UpToDate か Outdated か判断されます。
9. UpToDate データが一致していて最新の状態です。これが正常な状態です。
I/O 状態フラグ
/proc/drbd フィールドの I/O 状態フラグは現在のリソースへの I/O オペレーションの状態に関する情報を
含みます。全部で 6 つのフラグがあり、次の値をとります。
1. I/O 停止。I/O の 動作中 には r であり、停止中 には s です。通常時は r です。
2. シリアル再同期。リソースの再同期を待ち受け中で、再同期後 の依存性があるため延期されている場合、
このフラグが a になります。通常は - です。
3. 対向ノードで開始された同期の停止。リソースの再同期を待ち受け中で、対向ノードが何らかの理由で同
期を停止した場合に、このフラグが p になります。通常は - です。
4. ローカルで開始された同期の停止。リソースの再同期を待ち受け中で、ローカルノードのユーザが同期を
停止した場合、このノードが u になります。通常は - です。
5. ローカルでブロックされた I/O。通常は - です。次のいずれかのフラグになります。
• d : 何らかの理由で DRBD 内部で I/O がブロックされたなどの一時的な状況
• b : 下位デバイスの I/O がブロックされている。
• n : ネットワークソケットの輻輳。
• a : デバイス I/O のブロックとネットワーク輻輳が同時に発生。
6. アクティビティログのアップデートの停止アクティビティログへのアップデートが停止された場合、この
フラグが s になります。通常は - です。
パフォーマンス指標
/proc/drbd の 2 行目の各リソースの情報は次のカウンタを含んでいます。
1. ns (ネットワーク送信) ネットワーク接続を介して対向ノードに送信された正味データの量 (単位は Kibyte)。
2. nr (ネットワーク受信) ネットワーク接続を介して対向ノードが受信した正味データの量 (単位は Kibyte)。
3. dw (ディスク書き込み) ローカルハードディスクに書き込まれた正味データ (単位は Kibyte)。
4. dr (ディスク読み取り) ローカルハードディスクから読み取った正味データ (単位は Kibyte)。
5. al (アクティビティログ) メタデータのアクティビティログ領域の更新の数。
6. bm (ビットマップ) メタデータのビットマップ領域の更新の数。
42
6.2 リソースの有効化と無効化
7. lo (ローカルカウント) DRBD が発行したローカル I/O サブシステムに対するオープン要求の数。
8. pe (保留) 対向ノードに送信されたが、対向ノードから応答がない要求の数。
9. ua (未確認) ネットワーク接続を介して対向ノードが受信したが、応答がない要求の数。
10. ap (アプリケーション保留) DRBD に転送されたが、DRBD が応答していないブロック I/O 要求の数。
11. ep (エポック) エポックオブジェクトの数。通常は 1。barrier または none 書き込み順序付けメソッド
を使用する場合は、I/O 負荷により増加する可能性があります。
12. wo (書き込み順序付け) 現在使用されている書き込み順序付けメソッド。b (バリア)、f (フラッシュ)、d
(ドレイン) または n (なし)。
13. oos (非同期) 現在、同期していないストレージの量 (単位は Kibibyte)。
6.2
リソースの有効化と無効化
リソースの有効化
クラスタ構成に応じたクラスタ管理アプリケーションの操作によって、通常、すべての構成されている DRBD
リソースが自動的に有効になります。
• by a cluster resource management application at its discretion, based on your cluster configuration,
or
• またはシステム起動時の /etc/init.d/drbd によっても有効になります。
もし何らかの理由により手動でリソースを起動する必要のある場合、以下のコマンドの実行によって行うこと
ができます。
# drbdadm up <resource>
他の場合と同様に、特定のリソース名の代わりにキーワード all を使用すれば、/etc/drbd.conf で構成さ
れているすべてのリソースを一度に有効にできます。
リソースを無効にする
特定のリソースを一時的に無効にするには、次のコマンドを実行します。
# drbdadm down <resource>
ここでも、リソース名の代わりにキーワード all を使用して、1 回で /etc/drbd.conf に記述されたすべて
のリソースを一時的に無効にできます。
6.3
リソースの設定の動的な変更
動作中のリソースのパラメータを変更できます。次の手順を行います。
• /etc/drbd.conf のリソース構成を変更します。
• 両方のノードで /etc/drbd.conf ファイルを同期します。
• 両ノードで drbdadm adjust <resource> コマンドを実行します。
‘drbdadm adjust‘は ‘drbdsetup‘を通じて実行中のリソースを調整します。保留中の ‘drbdsetup‘呼び出しを確
43
第 6 章 一般的な管理作業
認するには、‘drbdadm‘を -d (予行演習) オプションをつけて実行します。
/etc/drbd.conf の common セクションを変更して一度にすべてのリソースに反映させたいときは、
drbdadm adjust all を実行します。
6.4
リソースの昇格と降格
手動でリソースのロール (役割) をセカンダリからプライマリに切り替える (昇格)、またはその逆に切り替える
(降格) には、次のコマンドを実行します。
# drbdadm primary <resource>
# drbdadm secondary <resource>
DRBD がシングルプライマリモード (DRBD のデフォルト) で、接続状態が Connected の場合、任意のタイ
ミングでどちらか 1 つのノード上でのみリソースはプライマリロールになれます。したがって、<resource> が
対向ノードがプライマリロールになっているときに ‘drbdadm primary <resource>‘を実行すると、エラーが発
生します。
リソースがデュアルプライマリモードに対応するように設定されている場合は、両方のノードをプライマリロー
ルに切り替えることができます。
6.5
基本的な手動フェイルオーバ
Pacemaker を使わず、パッシブ/アクティブ構成でフェイルオーバを手動で制御するには次のようにします。
現在のプライマリノードで DRBD デバイスを使用するすべてのアプリケーションとサービスを停止し、リソー
スをセカンダリに降格します。
# umount /dev/drbd/by-res/<resource>
# drbdadm secondary <resource>
プライマリにしたいノードでリソースを昇格してデバイスをマウントします。
# drbdadm primary <resource>
# mount /dev/drbd/by-res/<resource> <mountpoint>
6.6
DRBD をアップグレードする
DRBD のアップグレードは非常にシンプルな手順です。このセクションでは 8.3.x から 8.4.x へのアップグレー
ドを扱いますが、この手順は他のアップグレードでも使えます。
リポジトリをアップデートする
8.3 から 8.4 の間で多くの変更があったため、それぞれ別個のリポジトリを作りました。両ノードでリポジトリ
のアップデートを行います。
RHEL/CentOS システム /etc/yum.repos.d/linbit.repos.d/linbit.repo ファイルに次の変更を反映するよう編
集します。
44
6.6 DRBD をアップグレードする
[drbd-8.4]
name=DRBD 8.4
baseurl=http://packages.linbit.com/<hash>/8.4/rhel6/<arch>
gpgcheck=0
<hash>と<arch>の部分を埋める必要があります。<hash>キーは、LINNBIT サポートから入手します。
Debian/Ubuntu システム 次の変更点を/etc/apt/sources.list へ反映させるため編集します。
deb http://packages.linbit.com/<hash>/8.4/debian squeeze main
<hash> の部分を埋める必要があります。<hash>キーは、LINNBIT サポートから入手します。
次に DRBD の署名キーを信頼済みキーに追加します。
# gpg --keyserver subkeys.pgp.net --recv-keys
# gpg --export -a 282B6E23 | apt-key add -
0x282B6E23
最後に Debian に認識させるため apt-get update を実行します。
apt-get update
パッケージをアップグレードする
最初に、リソースが同期している事を確認してください。’cat /proc/drbd’ が UpToDate/UpToDate を出力
しています。
bob# cat /proc/drbd
version: 8.3.12 (api:88/proto:86-96)
GIT-hash: e2a8ef4656be026bbae540305fcb998a5991090f build by buildsystem@linbit, 2011-10-28
10:20:38
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----ns:0 nr:33300 dw:33300 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
リソースが同期している事が確認できたので、セカンダリノードのアップグレードから始めます。これは手動
で実行できますが、Pacemaker を使用している場合にはスタンバイモードにしてください。どちらの方法につい
ても、以下をご覧ください。Pacemaker を動作させている場合には、手動の方法は実施しないでください。
• 手動の方法
bob# /etc/init.d/drbd stop
• Pacemaker
セカンダリノードをスタンバイモードにします。この例は bob がセカンダリの場合です。
bob# crm node standby bob
"Unconfigured"と表示されるまでは、クラスタの状態を’crm_mon -rf’ または’cat /proc/drbd’ で確認で
きます。
yum または apt でパッケージをアップデートします。
45
第 6 章 一般的な管理作業
bob# yum upgrade
bob# apt-get upgrade
セカンダリノードのボブでアップグレードが終わり、最新の DRBD 8.4 カーネルモジュールと drbd-utils に
なったら DRBD を開始します。
• 手動
bob# /etc/init.d/drbd start
• Pacemaker
# crm node online bob
bob の’cat /proc/drbd’ の出力結果が 8.4.x を示し、次のようになっています。
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by buildsystem@linbit, 2011-12-20
12:58:48
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----ns:0 nr:12 dw:12 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
プライマリノードの alice では、アップグレードをするまで’cat /proc/drbd’ が以前のバージョンを示して
います。
この時点では異なるバージョンの DRBD が混在しています。プライマリノードの alice で DRBD を使用する
すべてのサービスを停止したら、bob を昇格します。繰り返しですが、この操作は手動でも Pacemaker のシェル
からでも行えます。
• 手動
alice
alice
bob #
bob #
# umount /dev/drbd/by-res/r0
# /etc/init.d/drbd stop
drbdadm primary r0
mount /dev/drbd/by-res/r0/0 /mnt/drbd
マウントコマンドは現在、リソースのボリュームナンバーを定義している’/0’ を参照している点に注意してく
ださい。新しいボリュームの特徴の詳細についてはボリュームを参照してください。
• Pacemaker
# crm node standby alice
この手順は動作中のサービスを停止させてセカンダリサーバの bob へ移行させます。
この状態で DRBD を yum または apt を使って安全にアップグレードできます。
alice# yum upgrade
alice# apt-get upgrade
アップグレードが完了したら alice サーバは最新バージョンの DRBD となり、起動できるようになります。
46
6.7 DRBD 8.4 を 8.3 にダウングレードする。
• 手動
alice# /etc/init.d/drbd start
• Pacemaker
alice# crm node online alice
サービスは bob サーバに残ったままであり、手動で戻さない限りそのままです。
これで両サーバの DRBD は connected の状態で最新バージョンとなります。
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by buildsystem@linbit, 2011-12-20
12:58:48
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----ns:0 nr:12 dw:12 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
構成の移行
DRBD 8.4 は 8.3 の構成と後方互換性がありますが、いくつかの構文は変更になっています。すべての変更点
の一覧は構成における構文の変更点を参照してください。’drbdadm dump all’ コマンドを使うことで、古い構
成をとても簡単に移すことができます。新しいリソース構成ファイルに続いて新しいグローバル構成も両方とも
出力します。この出力を使って変更を適宜行ってください。
6.7
DRBD 8.4 を 8.3 にダウングレードする。
DRBD 8.4 を使っていて 8.3 に戻したい場合、従わなければいけないいくつかの手順があります。このセクショ
ンでは、現在 8.4 のカーネルモジュールをつかっており、8.4 のユーティリティがインストールされていると仮定
します。
DRBD リソースにアクセスしているサービスを停止し、アンマウントし、デバイスをセカンダリに降格します。
それから次のコマンドを実行します。
これらの手順は両サーバで完了する必要があります。
drbdadm down all
drbdadm apply-al all
rmmod drbd
LINBIT リポジトリを使用している場合には apt-get remove drbd8-utils drbd8-module-‘uname -r‘ま
たは ‘yum remove drbd kmod-drbd‘でパッケージを削除できます。
8.4 が削除されたので 8.3 をインストールします。インストールはリポジトリを 8.3 に戻すことでも、8.3 ユー
ザーズガイドの手順でも行えます。
構成を 8.4 フォーマットに移行した場合には 8.3 フォーマットに戻すのを忘れないでください。戻すのに必
要なオプションについては構成における構文の変更点を参照ください。
8.3 が再インストールされたら、drbdadm‘または/etc/init.d/drbd start‘のどちらからでも手動で起動できます。
47
第 6 章 一般的な管理作業
6.8
デュアルプライマリモードを有効にする
デュアルプライマリモードではリソースが両ノードで同時にプライマリになることができます。これは永続的
にも一時的なものとしても加能です。
デュアルプライマリモードではリソースが同期レプリケート (プロトコル C) で設定されていることが必要
です。そのためレイテンシに過敏となり、WAN 環境には適していません。
さらに、両リソースが常にプライマリとなるので、どのようなノード間のネットワーク不通でもスプリット
ブレインが発生します。
永続的なデュアルプライマリモード
デュアルプライマリモードを有効にするため、リソース設定の net セクションで、allow-two-primaries オ
プションを yes に指定します。
resource <resource>
net {
protocol C;
allow-two-primaries yes;
}
...
}
そして、両ノード間で設定を同期することを忘れないでください。両ノードで ‘drbdadm adjust <resource>‘を
実行してください。
これで ‘drbdadm primary <resource>‘で、両ノードを同時にプライマリのロールにすることができます。
一時的なデュアルプライマリモード
通常はシングルプライマリで稼動しているリソースを、一時的にデュアルプライマリモードを有効にするには
次のコマンドを実行してください。
# drbdadm net-options --protocol=C --allow-two-primaries <resource>
一 時 的 な デ ュ ア ル プ ラ イ マ リ モ ー ド を 終 え る に は 、上 記 と 同 じ コ マ ン ド を 実 行 し ま す 。た だ し 、
--allow-two-primaries=no としてください (また、適切であれば希望するレプリケーションプロトコルにも)。
システム起動時の自動昇格
リソースがデュアルプライマリモードをサポートするように設定されている場合は、システム (または DRBD)
の起動時にリソースを自動的にプライマリロールに切り替わるように設定することをお勧めします。
resource <resource>
startup {
become-primary-on both;
}
...
}
スタートアップ時に、/etc/init.d/drbd システム init スクリプトはこのオプションを読み込み、これに沿っ
てリソースを昇格します。
DRBD と Pacemaker クラスタ DRBD 設定では、become-primary-on の方法は必須ではありませんし、
48
6.9 オンラインデバイス照合の使用
推奨もしていません。Pacemaker 設定では、リソース昇格と降格はクラスタ管理システムで操作されます
6.9
オンラインデバイス照合の使用
オンライン照合を有効にする
オンライン照合はデフォルトでは有効になっていません。有効にする場合は、/etc/drbd.conf のリソース構
成に次の行を追加します。
resource <resource>
net {
verify-alg <algorithm>;
}
...
}
<algorithm> は、システムのカーネル構成内のカーネル crypto API でサポートされる任意のメッセージダイ
ジェストアルゴリズムです。通常は sha1、md5、crc32c から選択します。
既存のリソースに対してこの変更を行う場合は、drbd.conf を対向ノードと同期し、両方のノードで ‘drbdadm
adjust <resource>‘を実行します。
オンライン照合の実行
オンライン照合を有効にしたら、次のコマンドでオンライン照合を開始します。
# drbdadm verify <resource>
コマンドを実行すると、DRBD が <resource> に対してオンライン照合を実行します。同期していないブロッ
クを検出した場合は、ブロックに非同期のマークを付け、カーネルログにメッセージを書き込みます。このとき
にデバイスを使用しているアプリケーションは中断なく動作し続けます。また、リソースの昇格と降格も行うこ
とができます。
照合中に同期していないブロックが検出された場合は、照合の完了後に、次のコマンド使用して再同期できます。
# drbdadm disconnect <resource>
# drbdadm connect <resource>
自動オンライン照合
通常は、オンラインデバイス照合を自動的に実行するほうが便利です。自動化は簡単です。一方 のノードに
/etc/cron.d/drbd-verify という名前で、次のような内容のファイルを作成します。
42 0 * * 0
root
/sbin/drbdadm verify <resource>
これにより、毎週日曜日の午前 0 時 42 分に、cron がデバイス照合を呼び出します。
オンライン照合をすべてのリソースで有効にした場合 (たとえば /etc/drbd.conf の common セクションに
verify-alg <algorithm> を追加するなど) には、次のようにできます。
42 0 * * 0
root
/sbin/drbdadm verify all
49
第 6 章 一般的な管理作業
110 × 0.3 = 33MB/s
図 6.1
syncer 速度の例 (有効帯域幅が 110MB/s の場合)
80 × 0.3 = 24MB/s
図 6.2
6.10
cyncer 速度の例 (有効帯域幅が 80MB/s の場合)
同期速度の設定
バックグラウンド同期中は同期先のデータとの一貫性が一時的に失われるため、同期をできるだけ早く完了し
たいと考えるでしょう。ただし、すべての帯域幅がバックグラウンド同期に占有されてしまうと、フォアグラウ
ンドレプリケーションに使用できなくなり、アプリケーションのパフォーマンス低下につながります。これは避
ける必要があります。同期用の帯域幅はハードウェアに合わせて設定する必要があります。
同期速度をセカンダリノードの最大書き込みスループットを上回る速度に設定しても意味がありません。デ
バイス同期の速度をどれほど高速に設定しても、セカンダリノードがその I/O サブシステムの能力より高速
に書き込みを行うことは不可能です。
また、同じ理由で、同期速度をレプリケーションネットワークの帯域幅の能力を上回る速度に設定しても意味
がありません。
永続的な同期速度の設定
リソースがバックグラウンド再同期に使用する最大帯域幅はリソースの resync-rate オプションで指定しま
す。これはリソース設定ファイルの /etc/drbd.conf の disk セクションに含まれている必要があります。
resource <resource>
disk {
resync-rate 40M;
...
}
...
}
毎秒の速度は ビット 単位ではなく バイト で設定します。デフォルトの単位は キビバイト なので 4096 は
4MiB と解釈されます。
経験則では、この数値として使用可能なレプリケーション帯域幅の 30% 程度が適切です。180MB/s の書
き込みスループットを維持できる I/O サブシステム、および 110MB/s のネットワークスループットを維
持できるギガビットイーサネットネットワークの場合は、ネットワークが律速要因になります。速度は次の
ように計算できます。
この結果、rate オプションの推奨値は 33M になります。
一方、最大スループットが 80MB/s の I/O サブシステム、およびギガビットイーサネット接続を使用する場合
は、I/O サブシステムが律速要因になります。速度は次のように計算できます。
この場合、rate オプションの推奨値は 24M になります。
50
6.11 チェックサムベース同期の設定
一時的な同期速度の設定
一時的に同期速度を調整したい場合もあるでしょう。たとえば、いずれかのクラスタノードの定期保守を行っ
たときに、バックグラウンド再同期を高速に実行したい場合などです。また、アプリケーションの書き込み操作
が非常に多いときに、バックグラウンド再同期の速度を落して、既存の帯域幅の多くをレプリケーションのため
に確保したい場合もあります。
たとえば、ギガビットイーサネットリンクのほとんどの帯域幅を再同期に割り当てるには、次のコマンドを実
行します:
# drbdadm disk-options --resync-rate=110M <resource>
このコマンドは一方のノードに対して実行するだけです。
この一時的な設定を元に戻して、/etc/drbd.conf で設定された同期速度を再び有効にするには、次のコマン
ドを実行します。
# drbdadm adjust <resource>
可変同期速度設定
特に複数の DRBD リソースが 1 つのレプリケーション/同期ネットワークを共有する設定においては、固定
速度の同期は最適なアプローチではありません。この場合には、可変レート同期を設定します。このモードでは
DRBD は自動制御のループアルゴリズムを使用して同期速度を常に調整し決定します。このアルゴリズムはフォ
アグラウンド同期に常に十分な帯域幅を確保し、バックグラウンド同期がフォアグラウンドの I/O に与える影響
を少なくします。
最適な可変レート同期の設定は使用できるネットワーク帯域幅、アプリケーションの I/O パターンやリンクの
輻輳によって変わってきます。理想的な設定は DRBD Proxy による遠距離レプリケーションの使用有無によっ
ても変わってきます。この DRBD の特徴を最適化するためにコンサルタントを利用するのもよいでしょう。以
下は、DRBD を使用した環境での設定の 一例 です。
resource <resource> {
disk {
c-plan-ahead 200;
c-max-rate 10M;
c-fill-target 15M;
}
}
c-fill-target の初期値は BDP × 3 がいいでしょう。BDP とはレプリケーションリンク上の帯域幅
遅延積 (Bandwidth Delay Product) です。
6.11
チェックサムベース同期の設定
チェックサムベース同期はデフォルトでは有効になっていません。有効にする場合は、/etc/drbd.conf のリ
ソース構成に次の行を追加します。
resource <resource>
net {
csums-alg <algorithm>;
}
...
51
第 6 章 一般的な管理作業
}
<algorithm> は、システムのカーネル構成内のカーネル crypto API でサポートされる任意のメッセージダイ
ジェストアルゴリズムです。通常は sha1、md5、crc32c から選択します。
既存のリソースに対してこの変更を行う場合は、drbd.conf を対向ノードと同期し、両方のノードで ‘drbdadm
adjust <resource>‘を実行します。
6.12
輻輳ポリシーと中断したレプリケーションの構成
レプリケーション帯域幅が大きく変動する環境 (WAN レプリケーション設定に典型的) の場合、レプリケー
ションリンクは時に輻輳しますデフォルト設定では、これはプライマリノードの I/O のブロックを引き起こし、
これは望ましくない場合があります。
その代わりに、進行中の同期を suspend (中断) に設定し、プライマリのデータセットをセカンダリから pull
ahead (引き離す) にします。このモードでは DRBD はレプリケーションチャネルを開いたままにし、切断モー
ドにはしません。しかし十分な帯域幅が利用できるようになるまで実際にはレプリケートを行いません。
次の例は、DRBD Proxy 構成のためのものです。
resource <resource> {
net {
on-congestion pull-ahead;
congestion-fill 2G;
congestion- extents 2000;
...
}
...
}
通常は congestion-fill と congestion-extents を pull-ahead オプションと合わせて設定するのがよ
い方法でしょう。
congestion-fill の値は以下の値の 90% にするとよいでしょう。
• DRBD Proxy 越しの同期の場合の、DRBD Proxy のバッファメモリの割り当て、または
• DRBD Proxy 構成でない環境での TCP ネットワークの送信バッファ
congestion-extents の値は、影響するリソースの al-extents に設定した値の 90% がよいでしょう。
6.13
I/O エラー処理方針の設定
DRBD がディスクエラー処理ストラテジーは、/etc/drbd.conf の disk セクションの on-io-error オプ
ションで指定します。
resource<resource> {
disk {
on-io-error <strategy>;
...
}
...
}
すべてのリソースのグローバル I/O エラー処理方針を定義したい場合は、これを common セクションで設定し
52
6.14 レプリケーショントラフィックの整合性チェックを設定
ます。
<strategy> は、次のいずれかのオプションです。
1. detach これがデフォルトで、推奨オプションです。下位レベル I/O エラーが発生すると、DRBD はその
ノードの下位デバイスを切り離し、ディスクレスモードで動作を継続します。
2. pass_on 上位層に I/O エラーを通知します。プライマリノードの場合は、マウントされたファイルシス
テムに通知されます。セカンダリノードの場合は無視されます (セカンダリノードには通知すべき上位層
がないため)。
3. call-local-io-error ローカル I/O エラーハンドラとして定義されたコマンドを呼び出します。このオ
プションを使うには、対応する local-io-error ハンドラをリソースの handlers セクションに定義す
る必要があります。local-io-error で呼び出されるコマンド (またはスクリプト) に I/O エラー処理を
実装するかどうかは管理者の判断です。
DRBD の以前のバージョン (8.0 以前) にはもう 1 つのオプション panic があり、これを使用すると、ロー
カル I/O エラーが発生するたびにカーネルパニックによりノードがクラスタから強制的に削除されました。
このオプションは現在は使用できませんが、local-io-error / call-local-io-error インタフェー
スを使用すると同じように動作します。ただし、この動作の意味を十分理解した上で使用してください。た
だし、この動作の意味を十分理解した上で使用してください。
次のコマンドで、実行中のリソースの I/O エラー処理方針を再構成することができます。
• /etc/drbd.d/<resource>.res のリソース構成の編集
• 構成の対向ノードへのコピー
• 両ノードでの drbdadm adjust <resource> の実行
6.14
レプリケーショントラフィックの整合性チェックを設
定
レプリケーション用トラフィックの整合性チェックはデフォルトでは有効になっていません。有効にする場合
は、/etc/drbd.conf のリソース構成に次の行を追加します。
resource <resource>
net {
data-integrity-alg <algorithm>;
}
...
}
<algorithm> は、システムのカーネル構成内のカーネル crypto API でサポートされる任意のメッセージダイ
ジェストアルゴリズムです。通常は sha1、md5、crc32c から選択します。
既存のリソースに対してこの変更を行う場合は、drbd.conf を対向ノードと同期し、両方のノードで ‘drbdadm
adjust <resource>‘を実行します。
6.15
リソースのサイズ変更
オンラインで拡張する
動作中 (オンライン) に下位ブロックデバイスを拡張できる場合は、これらのデバイスをベースとする DRBD
53
第 6 章 一般的な管理作業
デバイスについても動作中にサイズを拡張することができます。その際に、次の 2 つの条件を満たす必要があり
ます。
1. 影響を受けるリソースの下位デバイスが、LVM や EVMS などの論理ボリューム管理サブシステムによっ
て管理されている。
2. 現在、リソースの接続状態が Connected になっている。
両方のノードの下位ブロックデバイスを拡張したら、一方のノードだけがプライマリ状態であることを確認し
てください。プライマリノードで次のように入力します。
# drbdadm resize <resource>
新しいセクションの同期がトリガーされます。同期はプライマリノードからセカンダリノードへ実行されます。
追加する領域がクリーンな場合には、追加領域の同期を--assume-clean オプションでスキップできます。
# drbdadm -- --assume-clean resize <resource>
オフラインで拡張する
外部メタデータを使っている場合、DRBD 停止中に両ノードの下位ブロックデバイスを拡張すると、新しいサ
イズが自動的に認識されます。管理者による作業は必要ありません。両方のノードで次に DRBD を起動した際
に、DRBD デバイスのサイズが新しいサイズになり、ネットワーク接続が正常に確立します。
DRBD リソースで内部メタデータを使用している場合は、リソースのサイズを変更する前に、メタデータを拡
張されるデバイス領域の後ろの方に移動させる必要があります。これを行うには次の手順を実行します。これを
行うには次の手順を実行します
これは高度な手順です。慎重に検討した上で実行してください。
• DRBD リソースを停止します。
# drbdadm down <resource>
• 縮小する前に、メタデータをテキストファイルに保存します。
# drbdadm dump-md <resource> > /tmp/metadata
各ノードごとにそれぞれのダンプファイルを作成する必要があります。この手順は、両方のノードでそれぞれ
実行します。一方のノードのメタデータのダンプを対向ノードにコピーすることは_避けてください_。これは
うまくいきません。
• 両方のノードの下位ブロックデバイスを拡大します。
• これに合わせて、両方のノードについて、/tmp/metadata ファイルのサイズ情報 (la-size-sect) を書
き換えます。la-size-sect は、必ずセクタ単位で指定する必要があります。
• メタデータ領域の再初期化:
# drbdadm create-md <resource>
• 両方のノード上で修正のメタデータをインポートします:
54
6.15 リソースのサイズ変更
# drbdmeta_cmd=$(drbdadm -d dump-md <resource>)
# ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata
Valid meta-data in place, overwrite? [need to type 'yes' to confirm]
yes
Successfully restored meta data
この例では bash パラメータ置換を使用しています。他のシェルの場合、機能する場合もしない場合もあり
ます。現在使用しているシェルが分からない場合は、SHELL 環境変数を確認してください。
• DRBD リソースを再度有効にします。
# drbdadm up <resource>
• 片側のノードで DRBD リソースをプライマリにします
# drbdadm primary <resource>
• 最後に、拡張した DRBD デバイスを活用するために、ファイルシステムを拡張します。
オンラインで縮小する
オンラインでの縮小は外部メタデータ使用の場合のみサポートしています。
DRBD デバイスを縮小する前に、DRBD の上位層 (通常はファイルシステム) を縮小 しなければいけません。
ファイルシステムが実際に使用している容量を、DRBD が知ることはできないため、データが失われないように
注意する必要があります。
_ファイルシステム_ をオンラインで縮小できるかどうかは、使用しているファイルシステムによって異な
ります。ほとんどのファイルシステムはオンラインでの縮小をサポートしません。XFS は縮小そのものを
サポートしません。
オンラインで DRBD を縮小するには、その上位に常駐するファイルシステムを縮小した 後に、次のコマンド
を実行します。
# drbdadm resize --size=<new-size> <resource>
<new-size> には通常の乗数サフィックス (K、M、G など) を使用できます。DRBD を縮小したら、DRBD
に含まれるブロックデバイスも縮小できます (デバイスが縮小をサポートする場合)。
オフラインで縮小する
DRBD が停止しているときに下位ブロックデバイスを縮小すると、次にそのブロックデバイスを接続しようと
しても DRBD が拒否します。これは、ブロックデバイスが小さすぎる (外部メタデータを使用する場合)、また
はメタデータを見つけられない (内部メタデータを使用する場合) ことが原因です。この問題を回避するには、次
の手順を行います (オンラインで縮小するを使用できない場合)。
これは高度な手順です。慎重に検討した上で実行してください。
• DRBD がまだ動作している状態で、一方のノードのファイルシステムを縮小します。
• DRBD リソースを停止します。
55
第 6 章 一般的な管理作業
# drbdadm down <resource>
• 縮小する前に、メタデータをテキストファイルに保存します。
# drbdadm dump-md <resource> >
+/tmp/metadata+
各ノードごとにそれぞれのダンプファイルを作成する必要があります。この手順は、両方のノードでそれぞれ
実行します。一方のノードのメタデータのダンプを対向ノードにコピーすることは 避けてください。これはうま
くいきません。
• 両方のノードの下位ブロックデバイスを縮小します。
• これに合わせて、両方のノードについて、/tmp/metadata ファイルのサイズ情報 (la-size-sect) を書
き換えます。la-size-sect は、必ずセクタ単位で指定する必要があります。
• 内部メタデータを使用している場合は、メタデータ領域を再初期化します (この時点では、縮小によりお
そらく内部メタデータが失われています)。
# drbdadm create-md <resource>
• 両方のノード上で修正のメタデータをインポートします:
# drbdmeta_cmd=$(drbdadm -d dump-md <resource>)
# ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata
Valid meta-data in place, overwrite? [need to type 'yes' to confirm]
yes
Successfully restored meta data
この例では bash パラメータ置換を使用しています。他のシェルの場合、機能する場合もしない場合もあり
ます。現在使用しているシェルが分からない場合は、SHELL 環境変数を確認してください。
• DRBD リソースを再度有効にします。
# drbdadm up <resource>
6.16
下位デバイスのフラッシュを無効にする
バッテリバックアップ書き込みキャッシュ (BBWC) を備えたデバイスで DRBD を実行している場合にの
み、デバイスのフラッシュを無効にできます。ほとんどのストレージコントローラは、バッテリが消耗する
と書き込みキャッシュを自動的に無効にし、バッテリが完全になくなると即時書き込み (ライトスルー) モー
ドに切り替える機能を備えています。このような機能を有効にすることを強くお勧めします。
BBWC 機能を使用していない、またはバッテリが消耗した状態で BBWC を使用しているときに、DRBD の
フラッシュを無効にすると、データが失われるおそれがあります。したがって、これはお勧めできません。
DRBD はディスクフラッシュのサポートを、レプリケートされたデータセットと DRBD 独自のメタデータにつ
いて、個別に有効と無効を切り替える機能を備えています。この 2 つのオプションはデフォルトで有効になってい
ます。このオプションのいずれか (または両方) を無効にしたい場合は、DRBD 設定ファイル /etc/drbd.conf
の disk セクションで設定できます。
レプリケートされたデータセットのディスクフラッシュを無効にするには、構成に次の行を記述します。
56
6.17 スプリットブレイン時の動作の設定
resource <resource>
disk {
disk-flushes no;
...
}
...
}
DRBD のメタデータのディスクフラッシュを無効にするには、次の行を記述します。
resource <resource>
disk {
md-flushes no;
...
}
...
}
リソースの構成を修正し、また、もちろん両ノードの /etc/drbd.conf を同期したら、両ノードで次のコマン
ドを実行して、これらの設定を有効にします。
# drbdadm adjust <resource>
6.17
スプリットブレイン時の動作の設定
スプリットブレインの通知
スプリットブレインが 検出されると、DRBD はつねに split-brain ハンドラを呼び出します (設定されて
いれば)。このハンドラを設定するには、リソース構成に次の項目を追加します。
resource <resource>
handlers {
split-brain <handler>;
...
}
...
}
<handler> はシステムに存在する任意の実行可能ファイルです。
DRBD ディストリビューションでは /usr/lib/drbd/notify-split-brain.sh という名前のスプリットブ
レイン対策用のハンドラスクリプトを提供しています。これは指定したアドレスに電子メールで通知を送信する
だけのシンプルなものです。root@localhost (このアドレス宛のメールは実際のシステム管理者に転送される
と仮定) にメッセージを送信するようにハンドラを設定するには、split-brain handler を次のように記述し
ます。
resource <resource>
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root";
...
}
...
}
実行中のリソースで上記の変更を行い (ノード間で設定ファイルを同期すれば)、後はハンドラを有効にするた
めの他の操作は必要ありません。次にスプリットブレインが発生すると、DRBD が新しく設定したハンドラを呼
57
第 6 章 一般的な管理作業
び出します。
スプリットブレインからの自動復旧ポリシー
スプリットブレインからの自動復旧ポリシーには、状況に応じた複数のオプションが用意されています。DRBD
は、スプリットブレインを検出したときのプライマリロールのノードの数にもとづいてスプリットブレイン回復
手続きを適用します。そのために、DRBD はリソース設定ファイルの net セクションの次のキーワードを読み
取ります。
1. after-sb-0pri スプリットブレインが検出されたときに両ノードともセカンダリロールの場合に適用さ
れるポリシーを定義します。次のキーワードを指定できます。
• disconnect : 自動復旧は実行されません。split-brain ハンドラスクリプト (設定されている場合)
を呼び出し、コネクションを切断して切断モードで続行します。
• discard-younger-primary : 最後にプライマリロールだったホストに加えられた変更内容を破棄し
てロールバックします。
• discard-least-changes : 変更が少なかったほうのホストの変更内容を破棄してロールバックし
ます。
• discard-zero-changes : 変更がなかったホストがある場合は、他方に加えられたすべての変更内容
を適用して続行します。
2. after-sb-1pri スプリットブレインが検出されたときにどちらか 1 つのノードがプライマリロールであ
る場合に適用されるポリシーを定義します。次のキーワードを指定できます。次のキーワードを指定でき
ます。
• disconnect : after-sb-0pri と同様に、split-brain ハンドラスクリプト (構成されている場合)
を呼び出し、コネクションを切断して切断モードで続行します。
• consensus : after-sb-0pri で設定したものと同じ復旧ポリシーが適用されます。これらのポリ
シーを適用した後で、スプリットブレインの犠牲ノードを選択できる場合は自動的に解決します。そ
れ以外の場合は、disconnect を指定した場合と同様に動作します。
• call-pri-lost-after-sb : after-sb-0pri で指定した復旧ポリシーが適用されます。これらの
ポリシーを適用した後で、スプリットブレインの犠牲ノードを選択できる場合は、犠牲ノードで
pri-lost-after-sb ハンドラを起動します。このハンドラは handlers セクションで設定する必要
があります。また、クラスタからノードを強制的に削除します。
• discard-secondary : 現在のセカンダリロールのホストを、スプリットブレインの犠牲ノードにし
ます。
3. after-sb-2pri スプリットブレインが検出されたときに両ノードともプライマリロールである場合に適
用されるポリシーを定義します。このオプションは after-sb-1pri と同じキーワードを受け入れます。
ただし、discard-secondary と consensus は除きます。
上記の 3 つのオプションで、DRBD は追加のキーワードも認識しますが、これらはめったに使用されないため
ここでは省略します。ここで取り上げた以外のスプリットブレイン復旧キーワードについては、DRBD.CONF
を参照してください。
たとえば、デュアルプライマリモードで GFS または OCFS2 ファイルシステムのブロックデバイスとして機
能するリソースの場合、次のように復旧ポリシーを定義できます。
58
6.18 3 ノード構成の作成
resource <resource> {
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root"
...
}
net {
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
...
}
...
}
6.18
3 ノード構成の作成
3 ノード構成では、1 つの DRBD デバイスを別のデバイスの上に スタック (積み重ね) します。
デバイススタックの検討事項
3 ノード構成では次のような事項に注意する必要があります。
• スタックデバイスがアクティブなデバイスです。1 つの DRBD デバイス /dev/drbd0 が構成され、その
上位にスタックデバイス /dev/drbd10 があるとします。この場合は、/dev/drbd10 がマウントされて使
用されるデバイスになります。
• 下位の DRBD デバイス および スタック DRBD デバイス (上位 DRBD デバイス) の両方にそれぞれメタ
データが存在します。上位 DRBD デバイスには、必ず内部メタデータを使用してください。このため、3
ノード構成時の使用可能なディスク領域は、2 ノード構成に比べてわずかに小さくなります。
• スタックされた上位デバイスを実行するには、下位のデバイスがプライマリロールになっている必要があ
ります。
• バックアップノードにデータを同期するには、アクティブなノードのスタックデバイスがプライマリモー
ドで動作している必要があります。
スタックリソースの設定
次の例では alice、bob、charlie という名前のノードがあり、alice と bob が 2 ノードクラスタを構成し、
charlie がバックアップノードになっています。
resource r0 {
net {
protocol C;
}
on alice {
device
/dev/drbd0;
disk
/dev/sda6;
address
10.0.0.1:7788;
meta-disk internal;
}
on bob {
device
/dev/drbd0;
59
第 6 章 一般的な管理作業
disk
/dev/sda6;
address
10.0.0.2:7788;
meta-disk internal;
}
}
resource r0-U {
net {
protocol A;
}
stacked-on-top-of r0 {
device
/dev/drbd10;
address
192.168.42.1:7788;
}
on charlie {
device
disk
address
meta-disk
}
/dev/drbd10;
/dev/hda6;
192.168.42.2:7788; # Public IP of the backup node
internal;
}
他の drbd.conf 設定ファイルと同様に、この設定ファイルもクラスタのすべてのノード (この場合は 3 つ) に
配布する必要があります。非スタックリソース構成にはない次のキーワードにご注意ください。
1. stacked-on-top-of この情報により、DRBD に含まれるリソースがスタックリソースであることを DRBD
に知らせます。これは、非スタックリソース構成ににある 2 つの on セクションのいずれかと置き換えま
す。下位レベルリソースには stacked-on-top-of を使用しないでください。
スタックリソースに Protocol A を使用することは必須ではありません。アプリケーションに応じて任意の
DRBD のレプリケーションプロトコルを選択できます。
スタックリソースを有効にする
スタックリソースを有効にするには、まず、下位レベルリソースを有効にしてどちらか一方をプライマリに昇
格します。
drbdadm up r0
drbdadm primary r0
非スタックリソースと同様に、スタックリソースの場合も DRBD メタデータを作成する必要があります。次
のコマンドで実行します。
# drbdadm create-md --stacked r0-U
次に、スタックリソースを有効にします。
# drbdadm up --stacked r0-U
# drbdadm primary --stacked r0-U
この後でバックアップノードのリソースを起動し、3 ノードレプリケーションを有効にします。:
# drbdadm create-md r0-U
# drbdadm up r0-U
クラスタ管理システムを使えばスタックリソースの管理を自動化できます。Pacemaker クラスタ管理フレーム
ワークで管理する方法については、Pacemaker クラスタでスタック DRBD リソースを使用するを参照してくだ
60
6.19 DRBD Proxy
さい。
6.19
DRBD Proxy
DRBD Proxy 配備に関する検討事項
DRBD Proxy による遠距離レプリケーションプロセスは、DRBD が設定されているマシン上に直接配置する
か、個別の専用サーバに配置することができます。DRBD Proxy インスタンスは、複数のノードの複数の DRBD
デバイスのプロキシとして機能することができます。
DRBD Proxy は DRBD に対して完全に透過的です。通常は大量のデータパケットが DRBD Proxy を含む転
送経路に溜まるため、アクティビティログがかなり大きくなります。これは、プライマリノードのクラッシュ後
の長い再同期の実行を引き起こす可能性があるので、それは DRBD の csums-alg 設定を有効にすることをお勧
めします。
インストール
DRBD Proxy を入手するには、(日本では) 株式会社サードウェアまたはその販売代理店に連絡してください。
特別な理由がない限り、常に最新バージョンの DRBD Proxy を使用してください。
Debian と Debian ベースのシステム上で DRBD Proxy をインストールするには (DRBD Proxy のバージョ
ンとアーキテクチャは、ターゲットのアーキテクチャに合わせてください)、dpkg を次のように使用します。
# dpkg -i drbd-proxy_3.0.0_amd64.deb
RPM ベースのシステム (SLES や Redhat) に DRBD Proxy をインストールする場合は、次のコマンドを使用
します (DRBD Proxy のバージョンとアーキテクチャは、ターゲットのアーキテクチャに合わせてください)。
# rpm -i drbd-proxy-3.0-3.0.0-1.x86_64.rpm
DRBD Proxy の設定には drbdadm が必要なので、これもインストールします。
DRBD Proxy バイナリだけでなく、/etc/init.d に通常に入る起動スクリプトもインストールします。DRBD
Proxy を起動/停止するには、通常はこの起動スクリプトを使ってください。このスクリプトは単に起動/停止す
るだけでなく、drbdadm を使って DRBD Proxy の動作も設定します。
ライセンスファイル
DRBD Proxy の実行には、ライセンスファイルが必要です。DRBD Proxy を実行したいマシンにライセンス
ファイルを設定してください。このファイルは drbd-proxy.license と呼ばれ、対象マシンの /etc ディレク
トリにコピーされ、また drbdpxy ユーザ/グループに所有されている必要があります。
# cp drbd-proxy.license /etc/
設定
DRBD Proxy は DRBD のメイン設定ファイルで設定します。設定は、追加のオプションセクション proxy
とホストセクション内の proxy on セクションで行います。
DRBD ノードで直接実行されるプロキシの DRBD Proxy の設定例を次に示します。
61
第 6 章 一般的な管理作業
resource r0 {
net {
protocol
}
device
disk
meta-disk
A;
minor 0;
/dev/sdb1;
/dev/sdb2;
proxy {
memlimit 100M;
plugin {
zlib level 9;
}
}
on alice {
address 127.0.0.1:7789;
proxy on alice {
inside 127.0.0.1:7788;
outside 192.168.23.1:7788;
}
}
on bob {
address 127.0.0.1:7789;
proxy on bob {
inside 127.0.0.1:7788;
outside 192.168.23.2:7788;
}
}
}
inside IP アドレスは DRBD と DRBD Proxy との通信に使用し、outside IP アドレスはプロキシ間の通信
に使用します。
DRBD Proxy の制御
drbdadm には proxy-up および proxy-down サブコマンドがあり、名前付き DRBD リソースのローカル DRBD
Proxy プロセスとの接続を設定したり削除したりできます。これらのコマンドは、/etc/init.d/drbdproxy が
実装する start および stop アクションによって使用されます。
DRBD Proxy には drbd-proxy-ctl という下位レベル構成ツールがあります。このツールをオプションを指
定せずに呼び出した場合は、対話型モードで動作します。
対話型モードをにせずコマンドを直接渡すには、’-c’ パラメータをコマンドに続けて使用します。
使用可能なコマンドを表示するには次のようにします。
# drbd-proxy-ctl -c "help"
コマンドの周りのダブルクォートは読み飛ばされる点に注意ください。
add connection <name> <listen-lan-ip>:<port> <remote-proxy-ip>:<port>
<local-proxy-wan-ip>:<port> <local-drbd-ip>:<port>
Creates a communication path between two DRBD instances.
set memlimit <name> <memlimit-in-bytes>
Sets memlimit for connection <name>
del connection <name>
Deletes communication path named name.
show
Shows currently configured communication paths.
62
6.19 DRBD Proxy
show memusage
Shows memory usage of each connection.
show [h]subconnections
Shows currently established individual connections
together with some stats. With h outputs bytes in human
readable format.
show [h]connections
Shows currently configured connections and their states
With h outputs bytes in human readable format.
shutdown
Shuts down the drbd-proxy program. Attention: this
unconditionally terminates any DRBD connections running.
Examples:
drbd-proxy-ctl -c "list hconnections"
prints configured connections and their status to stdout
Note that the quotes are required.
drbd-proxy-ctl -c "list subconnections" | cut -f 2,9,13
prints some more detailed info about the individual connections
watch -n 1 'drbd-proxy-ctl -c "show memusage"'
monitors memory usage.
Note that the quotes are required as listed above.
上記のコマンドは、UID 0 (つまり root ユーザ) でのみ受け入れられますが、どのユーザでも使える情報収集
のコマンドがあります (unix のパーミッションが /var/run/drbd-proxy/drbd-proxy-ctl.socket のプロキ
シソケットへのアクセスを許可していれば)。権限の設定については /etc/init.d/drbdproxy の init スクリプ
トを参照してください。
print details
This prints detailed statistics for the currently active connections.
Can be used for monitoring, as this is the only command that may be sent by a user with
UID
quit
Exits the client program (closes control connection).
DRBD Proxy プラグインについて
DRBD proxy 3.0 以降のプロキシでは WAN コネクション用のプラグインを使用できます。現在使用できるプ
ラグインは zlib と lzma です。
zlib プラグインは GZIP アルゴリズムを圧縮に使っています。CPU 使用量が低いのが利点です。
lzma プラグインは liblzma2 ライブラリを使います。数百 MiB の辞書を使って、小さな変更であっても非常
に効率的な繰り返しデータの差分符号化を行います。lzma はより多く CPU とメモリを必要としますが、zlib
よりも高い圧縮率になります。lzma プラグインはライセンスで有効化されてる必要があります。
CPU (速度、スレッド数)、メモリ、インプットと有効なアウトプット帯域幅に応じたプラグインの推奨構成に
ついては、サードウェアに相談してください。
+proxy+ セクションの古い +compressionon+ は使用されておらず、次期リリースではなくなる予定です。
現在は +zlib level 9+ で扱っています。
WAN サイドの帯域幅制限を使用する
DRBD-utils 8.4.4 と DRBD Proxy 3.1.1 は、proxy configuration セクションの bwlimit オプションによっ
て、実験的にコネクションごとの帯域幅制限をサポートしています。
63
第 6 章 一般的な管理作業
これは、指定した帯域幅を (概算で) 超えて使用しないために、データチャンクの送信後に対応する送信スレッ
ドを短時間スリープさせます。
値 0 は 無制限 を意味し、これがデフォルトです。
proxy {
bwlimit 2M;
...
}
上記の例では WAN コネクション上の外向き通信速度を毎秒 2MiB に制限し、他のデータが利用する余裕を確
保しています。
トラブルシューティング
DRBD proxy のログは syslog の LOG_DAEMON ファシリティに記録されます。通常ログは /var/log/daemon.log
に記録されます。
DRBD Proxy でデバッグモードを有効にするには次のようにします。
# drbd-proxy-ctl -c 'set loglevel debug'
たとえば、DRBD Proxy が接続に失敗すると、Rejecting connection because I can’t connect on
the other side というようなメッセージがログに記録されます。その場合は、DRBD が (スタンドアローン
モードでなく) 両方のノードで動作していて、両方ノードでプロキシが動作していることを確認してください。ま
た、両方のノードで設定値を確認してください。
64
第
7章
トラブルシューティングと
エラーからの回復
この章では、ハードウェアやシステムに障害が発生した場合に必要な手順について説明します。
7.1
ハードドライブの障害の場合
ハードドライブの障害への対処方法は、DRBD がディスク I/O エラーを処理する方法 (ディスクエラー処理ス
トラテジーを参照)、また設定されているメタデータの種類 (DRBD メタデータを参照) によって異なります。
ほとんどの場合、ここで取り上げる手順は DRBD を直接物理ハードドライブ上で実行している場合にのみ
適用されます。次に示す層の上で DRBD を実行している場合には通常は適用されません。
• MD ソフトウェア RAID セット (この場合は ‘mdadm‘を使用してドライブ交換を管理)
• デバイスマッパ RAID(‘dmraid‘を使用)
• ハードウェア RAID 機器 (障害が発生したドライブの扱いについては、ベンダの指示に従う)
• 一部の非標準デバイスマッパ仮想ブロックデバイス (デバイスマッパのマニュアルを参照)
手動で DRBD をハードドライブから切り離す
DRBD が I/O エラーを伝える (非推奨)、まず DRBD リソースを切り離すとよいでしょう。つまり補助記憶装
置から切り離します。
drbdadm detach <resource>
‘drbdadm dstate‘コマンドを実行して、リソースが ディスクレスモード になったことを確認します。
drbdadm dstate <resource>
Diskless/UpToDate
ディスク障害がプライマリノードで発生した場合、スイッチオーバーと、この手順を組み合わせることもでき
ます。
I/O エラー時の自動切り離し
DRBD が I/O エラーを伝えない (推奨オプション) されている場合、手動での操作なしで、DRBD はすでにリ
ソースを下位ストレージから自動的に切り離しているはずです。その場合でも drbdadm dstate コマンドを使
用して、リソースが実際にディスクレスモードで実行されているか確認します。
65
第 7 章 トラブルシューティングとエラーからの回復
障害が発生したディスクの交換 (内部メタデータを使用している場合)
内部メタデータを使用している場合、新しいハードディスクで DRBD デバイスを再構成するだけで十分です。
交換したハードディスクのデバイス名が交換前と異なる場合は、DRBD 設定ファイルを適切に変更してください。
新しいメタデータを作成してから、リソースを再接続します。
drbdadm create-md <resource>
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initializing bitmap
New drbd meta data block sucessfully created.
drbdadm attach <resource>
新しいハードディスクの完全同期が瞬時に自動的に始まります。通常のバックグラウンド同期と同様、同期の
進行状況を /proc/drbd で監視することができます。
障害の発生したディスクの交換 (外部メタデータを使用している場合)
外部メタデータを使用している場合でも、手順は基本的に同じです。ただし、DRBD だけではハードドライブ
が交換されたことを認識できないため、追加の手順が必要です。
drbdadm create-md <resource>
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initializing bitmap
New drbd meta data block sucessfully created.
drbdadm attach <resource>
drbdadm invalidate <resource>
上記の ‘drbdadm invalidate‘コマンドが同期をトリガーします。この場合でも、同期の進行状況は /proc/drbd
で確認できます。
7.2
ノード障害に対処する
DRBD が (実際のハードウェア障害であれ手動による介入であれ) 対向ノードがダウンしていることを検出す
ると、DRBD は自身の接続状態を Connected から WFConnection に変更し、対向ノードが再び現れるのを待ち
ます。その後、DRBD リソースは 切断モード で動作します。切断モードでは、リソースおよびリソースに関連
付けられたブロックデバイスが完全に利用可能で、必要に応じて昇格したり降格したりします。ただし、ブロッ
クの変更は対向ノードにレプリケートされません。切断中に変更されたブロックについての内部情報は DRBD が
格納します。
一時的なセカンダリノードの障害に対処する
現時点でセカンダリロールでリソースを持っているノードに一時的に障害が生じた場合 (たとえばメモリ交換
で直るようなメモリの問題) には、障害が発生したノードを修復してオンラインに戻すだけで十分です。修正し
たノードを起動すると、ノード間の接続が再確立され、停止中にプライマリノードに加えられた変更内容すべて
がセカンダリノードに同期されます。
この時点で、DRBD の再同期アルゴリズムの性質により、セカンダリノードのリソースの一貫性が一時的
に失われます。この短時間の再同期の間は、対向ホストが使用できない場合でも、セカンダリノードをプラ
イマリロールに切り替えることができません。したがって、セカンダリノードの実際のダウンタイムとその
66
7.3 スプリットブレインからの手動回復
後の再同期の間は、クラスタが冗長性を持たない期間になります。
一時的なプライマリノードの障害に対処する
DRBD からみると、プライマリノードの障害とセカンダリノードの障害はほぼ同じです。生き残ったノードが
対向ノードの障害を検出し、切断モードに切り替わります。DRBD は生き残ったノードをプライマリロールに 昇
格しません。昇格はクラスタ管理システムが管理します。
障害が発生したノードが修復されてクラスタに戻る際に、セカンダリロールになります。すでに述べたように、
それ以上の手動による介入は必要ありません。このときも DRBD はリソースのロールを元に戻しません。変更
を行うように設定されている場合は、クラス管理システムがこの変更を行います。
プライマリノードに障害が発生すると、DRBD はアクティビティログというメカニズムによってブロックデバ
イスの整合性を確保します。詳細はアクティビティログを参照してください。
永続的なノード障害に対処する
ノードに回復不能な問題が発生した場合やノードが永久的に破損した場合は、次の手順を行う必要があります。
• 障害が発生したハードウェアを同様のパフォーマンスとディスク容量を持つハードウェアと交換します。
障害が発生したノードを、それよりパフォーマンスが低いものと置き換えることも可能ですが、お勧めはで
きません。障害が発生したノードを、それよりディスク容量が小さいものと置き換えることはできません。
この場合、DRBD を置き換えたノードに接続できません。
• OS とアプリケーションをインストールします。
• DRBD をインストールし、生き残ったノードから /etc/drbd.conf と、全ての /etc/drbd.d/ をコピー
します。
• DRBD の設定に記載された手順を行います。デバイスの初期同期の前まで実行します。
この時点で、デバイスの完全同期を手動で開始する必要はありません。生き残ったプライマリノードへの接続
時に、同期が自動的に開始します。
7.3
スプリットブレインからの手動回復
ノード間の接続が可能になると、ノード間で初期ハンドシェイクのプロトコルが交換されます。この時点で
DRBD はスプリットブレインが発生したかどうかを判断できます。両方のノードがプライマリロールであるか、
もしくは切断中に両方がプライマリロールになったことを検出すると、DRBD は即座にレプリケーション接続を
切断します。その場合、システムログにたとえば次のようなメッセージが記録されます。
Split-Brain detected, dropping connection!
スプリットブレインが検出されると、1 つのノードは常に StandAlone の状態でリソースを保持します。もう
一方のノードもまた StandAlone 状態になるか (両方のノードが同時にスプリットブレインを検出した場合)、ま
たは WFConnection 状態になります (一方のノードがスプリットブレインを検出する前に対向ノードが切断をし
た場合)。
DRBD がスプリットブレインから自動的に回復するように設定されていない場合は、この時点で手動で介入
して、変更内容を破棄するほうのノードを選択する必要があります。(このノードは_スプリットブレインの犠牲
ノード_と呼ばれる)。この介入は次のコマンドで行います。
67
第 7 章 トラブルシューティングとエラーからの回復
スプリットブレインの犠牲ノードは StandAlone の接続状態である必要があり、そうでなければ次のコマ
ンドはエラーを返してきます。次のコマンド実行で確実に standalone にできます。
drbdadm disconnect <resource>
drbdadm secondary <resource>
drbdadm connect --discard-my-data <resource>
他方のノード (スプリットブレインの生存ノード) の接続状態も StandAlone の場合には、次のコマンド実行
します。
drbdadm connect <resource>
ノードがすでに WFConnection 状態の場合は自動的に再接続するので、この手順は省略できます。
スプリットブレインの影響を受けるリソースが 3 ノード構成の作成の場合は、単に ‘drbdadm‘ではなく、‘drbdadm
--stacked‘を使用します。
接続すると、スプリットブレインの犠牲ノードの接続状態がすぐに SyncTarget に変化し、残ったプライマリ
ノードによって変更内容が上書きされます。
スプリットブレインの犠牲ノードは、デバイスのフル同期の対象にはなりません。代わりに、ローカル側で
の変更がロールバックされ、スプリットブレインの生存ノードに対して加えられた変更が犠牲ノードに伝播
されます。
再同期が完了すると、スプリットブレインが解決したとみなされ、2 つのノードが再び完全に一致した冗長レ
プリケーションストレージシステムとして機能します。
68
第
IV 部
DRBD とアプリケーションの
組み合わせ
第
8章
DRBD と Pacemaker クラスタ
Pacemaker クラスタスタックと DRBD の組み合わせは、もっとも一般的な DRBD の使いみちです。Pacemaker
は、さまざまな使用シナリオにおいて DRBD を非常に強力なものにするアプリケーションの 1 つです。
8.1
Pacemaker の基礎
Pacemaker は、Linux のプラットフォーム用の、高度で機能豊富な、幅広く活用されているクラスタリソース
マネージャです。豊富なマニュアルが用意されています。この章を理解するために、以下のドキュメントを読む
ことを強くお勧めします。
• Clusters From Scratch 高可用性クラスタ構築ステップバイステップガイド
• CRM CLI (command line interface) toolCRM のシェルやシンプルかつ直感的なコマンドラインインタ
フェースのマニュアル
• Pacemaker Configuration ExplainedPacemaker の背景にあるコンセプトや設計を説明している参考ド
キュメント
8.2
クラスタ構成に DRBD のサービスを追加する
ここでは、Pacemaker クラスタで、DRBD のサービスを有効にする方法を説明します。
DRBD OCF リソースエージェントを採用する場合は、DRBD に関するすべての操作、すなわち起動、終
了、昇格、降格は OCF リソースエージェントに 完全に 委ねるべきです。つまり、DRBD の起動スクリプ
トを無効にしてください。
chkconfig drbd off
ocf:linbit:drbd OCF リソースエージェントはマスター/スレーブ機能をサポートするので、Pacemaker は
複数のノードで DRBD リソースを開始して監視でき、必要に応じて昇格と降格をコントロールできます。ただ
し、Pacemaker をシャットダウンした場合やノードをスタンバイモードにすると、これらの影響を受けるノード
の drbd リソースは停止されます。
DRBD に同梱される OCF リソースエージェントは、linbit プロバイダに属しているため、/usr/lib/
ocf/resource.d/linbit/drbd としてインストールされます。heartbeat 2 に同梱されている古いリ
ソースエージェントは、heartbeat プロバイダを使用して、/usr/lib/ocf/resource.d/heartbeat/
drbd にインストールされています。古い OCF RA の使用はお勧めできません。
71
第 8 章 DRBD と Pacemaker クラスタ
drbd OCF リソースエージェントを使用して、Pacemaker CRM クラスタで MySQL データベース用の DRBD
を使用する構成を有効にするには、必要なリソースを定義し、昇格した DRBD リソースのみでサービスが開始
するように Pacemaker 制約を設定する必要があります。これには、次の例で説明するように crm シェルを使用
します。これには、次の例で説明するように crm シェルを使用します。
Listing: MySQL 用に DRBD を使用する Pacemaker 設定
crm configure
crm(live)configure# primitive drbd_mysql ocf:linbit:drbd \
params drbd_resource="mysql" \
op monitor interval="29s" role="Master" \
op monitor interval="31s" role="Slave"
crm(live)configure# ms ms_drbd_mysql drbd_mysql \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem \
params device="/dev/drbd/by-res/mysql" \
directory="/var/lib/mysql" fstype="ext3"
crm(live)configure# primitive ip_mysql ocf:heartbeat:IPaddr2 \
params ip="10.9.42.1" nic="eth0"
crm(live)configure# primitive mysqld lsb:mysqld
crm(live)configure# group mysql fs_mysql ip_mysql mysqld
crm(live)configure# colocation mysql_on_drbd \
inf: mysql ms_drbd_mysql:Master
crm(live)configure# order mysql_after_drbd \
inf: ms_drbd_mysql:promote mysql:start
crm(live)configure# commit
crm(live)configure# exit
bye
これで設定が有効になります。DRBD リソースを昇格させるノードを Pacemaker が選択し、同じノードで
DRBD で保護されたリソースグループを開始します。
8.3
Pacemaker クラスタでリソースレベルの
フェンシングを使用する
ここでは、DRBD のレプリケーションリンクが遮断された場合に、Pacemaker が drbd マスター/スレーブリ
ソースを昇格させないようにするために必要な手順の概要を説明しますこれにより、Pacemaker が古いデータで
サービスを開始し、プロセスでの不要な「タイムワープ」の原因になることが回避されます。
DRBD 用のリソースレベルのフェンシングを有効にするには、リソース設定で次の行を追加する必要があり
ます。
resource <resource> {
disk {
fencing resource-only;
...
}
}
同時に、使用するクラスタインフラストラクチャによっては handlers セクションも変更しなければなりま
せん。
72
8.3 Pacemaker クラスタでリソースレベルのフェンシングを使用する
• Heartbeat を使用した Pacemaker クラスタは dopd でのリソースレベルフェンシングで説明している設定
を使用できます。
• Corosync と Heartbeat を使用したクラスタは CIB (Cluster Information Base) を使ったリソースレベル
フェンシングで説明されている機能を使うことがきます。
最低でも 2 つの独立したクラスタ通信チャネルを設定しなければ、この機能は正しく動作しません。Heartbeat
ベースの Pacemaker クラスタでは ha.cf 設定ファイルに最低 2 つのクラスタ通信のリンクを定義する必
要があります。Corosync クラスタでは最低 2 つの冗長リングを corosync.conf に記載しなければいけ
ません。
dopd でのリソースレベルフェンシング
Heartbeat を使用した Pacemaker クラスタでは、DRBD は DRBD outdate-peer daemon 、または略して dopd
と呼ばれるリソースレベルのフェンシング機能を使用できます。
dopd 用の Heartbeat 設定 dopd を有効にするには、次の行を /etc/ha.d/ha.cf ファイルに追加します。
respawn hacluster /usr/lib/heartbeat/dopd
apiauth dopd gid=haclient uid=hacluster
使用するディストリビューションに応じて dopd のパスを調整する必要があります。一部のディストリビュー
ションとアーキテクチャでは、正しいパスが /usr/lib64/heartbeat/dopd になります。
変更を行い ha.cf を対向ノードにコピーをしたら、設定ファイルを読み込むために Pacemaker をメンテナン
スモードにして /etc/init.d/heartbeat reload を実行します。その後、dopd プロセスが動作していること
を確認できるでしょう。
このプロセスを確認するには、ps ax | grep dopd を実行するか、killall -0 dopd を使用します。
dopd の DRBD 設定 dopd が起動したら、DRBD リソース設定にアイテムを追加します。
resource <resource> {
handlers {
fence-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
...
}
disk {
fencing resource-only;
...
}
...
}
dopd と同様に、システムのアーキテクチャやディストリビューションによっては drbd-peer-outdater バ
イナリは /usr/lib64/heartbeat に配置されます。
最後に、drbd.conf を対向ノードにコピーし、drbdadm adjust resource を実行して、リソースを再構成
し、変更内容を反映します。
dopd 機能のテスト 設定した dopd が正しく動作しているか確認するためには、Heartbeat サービスが正常に
動作しているときに、構成済みの接続されているリソースのレプリケーションリンクを遮断します。ネットワー
クリンクを物理的に取り外すことで簡単にできますが、少々強引ではあります。あるいは、一時的に iptables
73
第 8 章 DRBD と Pacemaker クラスタ
ルールを追加して、DRBD 用 TCP トラフィックを遮断します。
すると、リソースの接続状態が Connected から WFConnection に変わります。数秒後にディスク状態が
Outdated/DUnknown に変化します。これで dopd が機能していることを確認できます。
これ以降は、古いリソースをプライマリロールに切り替えようとしても失敗します。
物理リンクを接続するか、一時的な iptables ルールを削除してネットワーク接続を再確立すると、接続状態
が Connected に変化し、すぐに SyncTarget になります (ネットワーク遮断中に、プライマリノードで変化が
起こった場合)。同期が終了すると、無効状態であったリソースに再度 UpToDate のマークが付きます。
CIB (Cluster Information Base) を使ったリソースレベルフェンシング
Pacemaker 用のリソースレベルフェンシングを有効にするには、drbd.conf の 2 つのオプション設定をする
必要があります。
resource <resource> {
disk {
fencing resource-only;
...
}
handlers {
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
...
}
...
}
DRBD レプリケーションリンクが切断された場合には crm-fence-peer.sh スクリプトがクラスタ管理シス
テムに連絡し、この DRBD リソースに関連付けられた Pacemaker のマスター/スレーブリソースが決定され、現
在アクティブなノード以外のすべてのノードでマスター/スレーブリソースが昇格されることがないようにしま
す。逆に、接続が再確立して DRBD が同期プロセスが完了すると、この制約は解除され、クラスタ管理システム
は再び任意のノードのリソースを自由に昇格させることができます。
8.4
Pacemaker クラスタでスタック DRBD リソースを
使用する
スタックリソースでは、マルチノードクラスタの多重冗長性のために、あるいはオフサイトのディザスタリカ
バリ機能を確立するために DRBD を使用できます。このセクションでは、そのような構成における DRBD およ
び Pacemaker の設定方法について説明します。
オフサイトディザスタリカバリ機能を Pacemaker クラスタに追加する
この構成シナリオでは、1 つのサイトの 2 ノードの高可用性クラスタと、一般的には別のサイトに設置する独
立した 1 つのノードについて説明します。第 3 のノードは、ディザスタリカバリノードとして機能するスタンド
アロンサーバです。次の図で概念を説明します。次の図で概念を説明します。
この例では alice と bob が 2 ノードの Pacemaker クラスタを構成し、charlie は Pacemaker に管理されな
いオフサイトのノードです。
このような構成を作成するには、3 ノード構成の作成の説明に従って、まず DRBD リソースを設定および初期
を行います。そして、次の CRM 構成で Pacemaker を設定します。
74
8.4 Pacemaker クラスタでスタック DRBD リソースを使用する
stacked
left
left
stacked
alice
bob
charlie
Pacemaker Cluster
(local)
図 8.1
Stand-Alone Node
(remote)
Pacemaker クラスタの DRBD リソースのスタック
primitive p_drbd_r0 ocf:linbit:drbd \
params drbd_resource="r0"
primitive p_drbd_r0-U ocf:linbit:drbd \
params drbd_resource="r0-U"
primitive p_ip_stacked ocf:heartbeat:IPaddr2 \
params ip="192.168.42.1" nic="eth0"
ms ms_drbd_r0 p_drbd_r0 \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true" globally-unique="false"
ms ms_drbd_r0-U p_drbd_r0-U \
meta master-max="1" clone-max="1" \
clone-node-max="1" master-node-max="1" \
notify="true" globally-unique="false"
colocation c_drbd_r0-U_on_drbd_r0 \
inf: ms_drbd_r0-U ms_drbd_r0:Master
colocation c_drbd_r0-U_on_ip \
inf: ms_drbd_r0-U p_ip_stacked
colocation c_ip_on_r0_master \
inf: p_ip_stacked ms_drbd_r0:Master
order o_ip_before_r0-U \
inf: p_ip_stacked ms_drbd_r0-U:start
order o_drbd_r0_before_r0-U \
inf: ms_drbd_r0:promote ms_drbd_r0-U:start
この構成を /tmp/crm.txt という一時ファイルに保存し、次のコマンドで現在のクラスタにインポートします。
crm configure < /tmp/crm.txt
この設定により、次の操作が正しい順序で alice と bob クラスタで行われます。
1. Pacemaker は DRBD リソース r0 を両クラスタノードで開始し、1 つのノードをマスター (DRBD Primary)
ロールに昇格させます。
75
第 8 章 DRBD と Pacemaker クラスタ
stacked
stacked
left
left
right
right
alice
bob
charlie
daisy
Pacemaker Cluster
(local)
図 8.2
Pacemaker Cluster
(remote)
Pacemaker クラスタの DRBD リソースのスタック
2. Pacemaker は IP アドレス 192.168.42.1 の、第 3 ノードへのレプリケーションに使用するスタックリソー
スを開始します。これは、r0 DRBD リソースのマスターロールに昇格したノードで行われます。
3. r0 がプライマリになっていて、かつ、r0-U のレプリケーション用 IP アドレスを持つノードで、Pacemaker
はオフサイトノードに接続およびレプリケートを行う r0-U DRBD リソースを開始します。
4. 最後に、Pacemaker が r0-U リソースもプライマリロールに昇格させるため、ディザスタリカバリノード
とのレプリケーションが始まります。
このように、この Pacemaker 構成では、クラスタノード間だけではなく第 3 のオフサイトノードでも完全な
データ冗長性が確保されます。
このタイプの構成は、DRBD Proxy による遠距離レプリケーションを併用するのが一般的です。
スタックリソースを使って、Pacemaker クラスタの 4 ノード冗長化を実現する
この構成では、全部で 3 つの DRBD リソース (2 つの非スタック、1 つのスタック) を使って、4 方向ストレー
ジの冗長化を実現します。4 ノードクラスタの意義と目的は、3 ノードまで障害が発生しても、可用なサービスを
提供し続けられるということです。
次の例で概念を説明します。
この例では、alice、bob、charlie、daisy が 2 セットの 2 ノード Pacemaker クラスタを構成しています。
alice と bob は left という名前のクラスタを構成し、互いに DRBD リソースを使ってデータをレプリケート
します。一方 charlie と daisy も同様に、right という名前の別の DRBD リソースでレプリケートします。
3 番目に、DRBD リソースをスタックし、2 つのクラスタを接続します。
Pacemaker バージョン 1.0.5 の Pacemaker クラスタの制限により、CIB バリデーションを有効にしたま
まで 4 ノードクラスタをつくることはできません。CIB バリデーションは汎用的に使うのには向かない特
殊な高度な処理です。これは、今後のペースメーカーのリリースで解決されることが予想されます。
このような構成を作成するには、3 ノード構成の作成の説明に従って、まず DRBD リソースを設定して初期化
します (ただし、ローカルがクラスタになるだけでなく、リモート側にもクラスタになる点が異なります)。そし
て、次の CRM 構成で Pacemaker を設定し、left クラスタを開始します。
76
8.4 Pacemaker クラスタでスタック DRBD リソースを使用する
primitive p_drbd_left ocf:linbit:drbd \
params drbd_resource="left"
primitive p_drbd_stacked ocf:linbit:drbd \
params drbd_resource="stacked"
primitive p_ip_stacked_left ocf:heartbeat:IPaddr2 \
params ip="10.9.9.100" nic="eth0"
ms ms_drbd_left p_drbd_left \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
ms ms_drbd_stacked p_drbd_stacked \
meta master-max="1" clone-max="1" \
clone-node-max="1" master-node-max="1" \
notify="true" target-role="Master"
colocation c_ip_on_left_master \
inf: p_ip_stacked_left ms_drbd_left:Master
colocation c_drbd_stacked_on_ip_left \
inf: ms_drbd_stacked p_ip_stacked_left
order o_ip_before_stacked_left \
inf: p_ip_stacked_left ms_drbd_stacked:start
order o_drbd_left_before_stacked_left \
inf: ms_drbd_left:promote ms_drbd_stacked:start
この構成を /tmp/crm.txt という一時ファイルに保存し、次のコマンドで現在のクラスタにインポートします。
crm configure < /tmp/crm.txt
CIB に上記の設定を投入すると、Pacemaker は以下のアクションを実行します。
1. alice と bob をレプリケートするリソース left を起動し、いずれかのノードをマスターに昇格します。
2. IP アドレス 10.9.9.100 (alice または bob、いずれかのリソース left のマスターロールを担っている
方) を起動します。
3. IP アドレスを設定したのと同じノード上で、DRBD リソース stacked が起動します。
4. target-role="Master"が指定されているため、スタックした DRBD リソースがプライマリになります。
さて、以下の設定を作り、クラスタ right に進みましょう。
primitive p_drbd_right ocf:linbit:drbd \
params drbd_resource="right"
primitive p_drbd_stacked ocf:linbit:drbd \
params drbd_resource="stacked"
primitive p_ip_stacked_right ocf:heartbeat:IPaddr2 \
params ip="10.9.10.101" nic="eth0"
ms ms_drbd_right p_drbd_right \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
ms ms_drbd_stacked p_drbd_stacked \
meta master-max="1" clone-max="1" \
clone-node-max="1" master-node-max="1" \
notify="true" target-role="Slave"
colocation c_drbd_stacked_on_ip_right \
inf: ms_drbd_stacked p_ip_stacked_right
colocation c_ip_on_right_master \
77
第 8 章 DRBD と Pacemaker クラスタ
left
(alternate)
left
right
(alternate)
right
Shared
Storage
Shared
Storage
Pacemaker Cluster
(local)
Pacemaker Cluster
(remote)
図 8.3
SAN ベースのクラスタ間のレプリケートに DRBD を用いる
inf: p_ip_stacked_right ms_drbd_right:Master
order o_ip_before_stacked_right \
inf: p_ip_stacked_right ms_drbd_stacked:start
order o_drbd_right_before_stacked_right \
inf: ms_drbd_right:promote ms_drbd_stacked:start
CIB に上記の設定を投入すると、Pacemaker は以下のアクションを実行します。
1. charlie と daisy 間をレプリケートする DRBD リソース right を起動し、これらのノードのいずれか
をマスターにします。
2. IP アドレス 10.9.10.101 を開始します (charlie または daisy のいずれか。リソース right でマスター
の役割を担っている方)。
3. IP アドレスを設定したのと同じノード上で、DRBD リソース stacked が起動します。
4. target-role="Slave" が指定されているため、スタックリソースはセカンダリのままになります。
8.5
2 セットの SAN ベース Pacemaker クラスタ間を
DRBD でレプリケート
これは、拠点が離れた構成に用いるやや高度な設定です。2 つのクラスタが関与しますが、それぞれのクラス
タは別々の SAN(ストレージエリアネットワーク) ストレージにアクセスします。サイト間の IP ネットワークを
使って 2 つの SAN ストレージのデータを同期させるために DRBD を使います。
次の図で概念を説明します。
このような構成の場合、DRBD の通信にかかわるホストをあらかじめ明確に指定しておくことは不可能です。
つまり、動的接続構成の場合、DRBD は特定の物理マシンではなく動的対向ノードで通信先を決めます。
このタイプの設定は、通常、DRBD Proxy による遠距離レプリケーションや、またはトラック輸送による
レプリケーションと組み合わせます。
このタイプの設定は共有ストレージを扱うので、STONITH を構築してテストすることは、正常に動作するた
めに必要不可欠です。ただし、STONITH は本書の範囲を超えるので、以下の設定例は省略しています。
78
8.5 2 セットの SAN ベース Pacemaker クラスタ間を DRBD でレプリケート
DRBD リソース構成
動的接続する DRBD リソースを有効にするには、次のように drbd.conf を設定します。
resource <resource> {
...
device /dev/drbd0;
disk /dev/sda1;
meta-disk internal;
floating 10.9.9.100:7788;
floating 10.9.10.101:7788;
}
floating のキーワードは、通常リソース設定の on <host> セクションの代わりに指定します。このモード
では、DRBD はホスト名ではなく、IP アドレスや TCP ポートで相互接続を認識します。動的接続を適切に運用
するには、物理 IP アドレスではなく仮想 IP アドレスを指定してください (これはとても重要です)。上の例のよ
うに、離れた地点ではそれぞれ別々の IP ネットワークに属するのが一般的です。したがって、動的接続を正しく
運用するには DRBD の設定だけではなく、ルータやファイアウォールの適切な設定も重要です。
Pacemaker リソース構成
DRBD 動的接続の設定には、少なくとも Pacemaker 設定が必要です (2 つの各 Pacemaker クラスタに係わる)。
• 仮想クラスタ IP アドレス
• マスター/スレーブ DRBD リソース (DRBD OCF リソースエージェントを使用)
• リソースを適切なノードで正しい順序に起動するための各種制約
レプリケーション用アドレスに 10.9.9.100 を使う動的接続構成と、mysql というリソースを構築するには、
次のように crm コマンドで Pacemaker を設定します。
crm configure
crm(live)configure# primitive p_ip_float_left ocf:heartbeat:IPaddr2 \
params ip=10.9.9.100
crm(live)configure# primitive p_drbd_mysql ocf:linbit:drbd \
params drbd_resource=mysql
crm(live)configure# ms ms_drbd_mysql drbd_mysql \
meta master-max="1" master-node-max="1" \
clone-max="1" clone-node-max="1" \
notify="true" target-role="Master"
crm(live)configure# order drbd_after_left \
inf: p_ip_float_left ms_drbd_mysql
crm(live)configure# colocation drbd_on_left \
inf: ms_drbd_mysql p_ip_float_left
crm(live)configure# commit
bye
CIB に上記の設定を投入すると、Pacemaker は以下のアクションを実行します。
1. IP アドレス 10.9.9.100 を起動する (alice または bob のいずれか)
2. IP アドレスの設定にもとづいて DRBD リソースを起動します。
3. DRBD リソースをプライマリにします。
次に、もう一方のクラスタで、これとマッチングする設定を作成します。その Pacemaker のインスタンスを
次のコマンドで設定します。
79
第 8 章 DRBD と Pacemaker クラスタ
crm configure
crm(live)configure# primitive p_ip_float_right ocf:heartbeat:IPaddr2 \
params ip=10.9.10.101
crm(live)configure# primitive drbd_mysql ocf:linbit:drbd \
params drbd_resource=mysql
crm(live)configure# ms ms_drbd_mysql drbd_mysql \
meta master-max="1" master-node-max="1" \
clone-max="1" clone-node-max="1" \
notify="true" target-role="Slave"
crm(live)configure# order drbd_after_right \
inf: p_ip_float_right ms_drbd_mysql
crm(live)configure# colocation drbd_on_right
inf: ms_drbd_mysql p_ip_float_right
crm(live)configure# commit
bye
CIB に上記の設定を投入すると、Pacemaker は以下のアクションを実行します。
1. IP アドレス 10.9.10.101 を起動する (charlie または daisy のいずれか)。
2. IP アドレスの設定にもとづいて DRBD リソースを起動します。
3. target-role="Slave" が指定されているため、DRBD リソースは、セカンダリのままになります。
サイトのフェイルオーバ
拠点が離れた構成では、サービス自体をある拠点から他の拠点に切り替える必要が生じるかもしれません。こ
れは、計画された移行か、または悲惨な出来事の結果でしょう。計画にもとづく移行の場合、一般的な手順は次
のようになります。
• サービス移行元のクラスタに接続し、影響を受ける DRBD リソースの target-role 属性を マスター か
ら Slave に変更します。DRBD がプライマリであることに依存したリソースは自動的に停止し、その後
DRBD はセカンダリに降格します。DRBD はセカンダリのまま動作し続け、新しいプライマリからのデー
タ更新を受け取ってレプリケートします。
• サービス移行先のクラスタに接続し、DRBD リソースの target-role 属性を スレーブ から マスター
に変更します。DRBD リソースは昇格し、DRBD リソースのプライマリ側に依存した他の Pacemaker リ
ソースを起動します。そしてリモート拠点への同期が更新されます。
• フェイルバックをするには、手順を逆にするだけです。
アクティブな拠点で壊滅的な災害が起きると、その拠点はオフラインになり、以降その拠点からバックアップ
側にレプリケートできなくなる可能性があります。このような場合には
• リモートサイトが機能しているならそのクラスタに接続し、DRBD リソースの target-role 属性を Slave
から Master に変えてください。DRBD リソースは昇格し、DRBD リソースがプライマリになることに
依存する他の Pacemaker リソースも起動します。DRBD リソースを昇格し、DRBD リソースのプライマ
リ側に依存した他の Pacemaker リソースを起動します。そしてリモート拠点への同期が更新されます。
• 元の拠点が回復または再構成される、DRBD リソースに再度接続できるようになります。その後、逆の手
順でフェイルバックします。
80
第
9章
DRBD と Red Hat Cluster Suite
この章では RDBD を Red Hat Cluster 高可用性クラスタのためのレプリケーションストレージとして使用す
る方法を説明します。
ここでは非公式な Red Hat Cluster という用語を歴代の複数の正式な製品名として使用しており、そのな
かには Red Hat Cluster Suite と Red Hat Enterprise Linux High Availability Add-On が含まれてい
ます。
9.1
Red Hat Cluster の背景情報
Fencing
Red Hat Cluster は本来は共有ストレージクラスタを主な対象として設計されたもので、ノードフェンシング
によって共有リソースへの非協調的な同時アクセスを回避します。Red Hat Cluster Suite のフェンシングインフ
ラストラクチャは、フェンシングデーモン fenced とシェルスクリプトとして実装されるフェンシングエージェ
ントに依存しています。
DRBD ベースのクラスタは共有ストレージリソースを利用しないため、DRBD としては厳密にはフェンシン
グは必要ありません。ただし、Red Hat Cluster Suite は DRBD ベースの構成の場合でもフェンシングを必要と
します。
リソースグループマネージャ
リソースグループマネージャ (rgmanager または clurgmgr) は Pacemaker と似ています。これは、クラスタ
管理スイートと管理対象アプリケーションとの間の主要なインタフェースとして機能します。
Red Hat Cluster リソース Red Hat Cluster では、個々の高可用性アプリケーション、ファイルシステム、IP
アドレスなどを resource と呼びます。
たとえば、NFS エクスポートがマウントされているファイルシステムに依存するように、リソースは互いに依
存しています。リソースは別のリソース内に入れ子になって、リソースツリー を構成します。入れ子の内部のリ
ソースが、入れ子の外部のリソースからパラメータを継承する場合もあります。Pacemaker にはリソースツリー
の概念はありません。
Red Hat Cluster サービス 相互に依存するリソースの集合を サービス と呼びます。Pacemaker ではこのよう
な集合を リソースグループ と呼んでいます。
81
第 9 章 DRBD と Red Hat Cluster Suite
rgmanager リソースエージェント rgmanager により呼び出されるリソースエージェントは、Pacemaker で
使用されるものと同様に、Open Cluster Framework (OCF) で定義されたシェルベースの API を使用します
が、Pacemaker はフレームワークで定義されていない拡張機能も利用します。このように理論的には、Red Hat
Cluster Suite と Pacemaker のリソースエージェントはおおむね互換性がありますが、実際にはこの 2 つのクラ
スタ管理スイートは似たようなタスクや同一のタスクに異なるリソースエージェントを使用します。
Red Hat Cluster リソースエージェントは /usr/share/cluster ディレクトリにインストールされます。オー
ルインワン型の Pacemaker OCF リソースエージェントとは異なり、一部の Red Hat Cluster リソースエージェ
ントは、実際のシェルコードを含む .sh ファイルと、XML 形式のリソースエージェントメタデータを含む、
.metadata ファイルに分割されています。
DRBD は Red Hat Cluster リソースエージェントも提供しています。これは通常通りのディレクトリに
drbd.sh および drbd.metadata としてインストールされています。
9.2
Red Hat Cluster の構成
ここでは、Red Hat Cluster を実行するために必要な構成手順の概要を説明します。クラスタ構成の準備は比
較的容易で、すべての DRBD ベースの Red Hat Cluster に必要なのは、2 つの参加ノード (Red Hat のドキュ
メントでは クラスタメンバ と呼ばれる) フェンシングデバイスだけです。
Red Hat cluster の構成の詳細は、Red Hat Cluster と GFS(Global File System) についての Red Hat の
マニュアルをご参照ください。
cluster.conf ファイル
RHEL クラスタの構成は単一の設定ファイル /etc/cluster/cluster.conf に記載されています。次のよう
な方法でクラスタ構成を管理できます。
設定ファイルを直接編集する
これがもっとも簡単な方法です。テキストエディタ以外に必要なものはありま
せん。
system-config-cluster GUI を使用する これは Glade を使用して Python で記述された GUI アプリケー
ションです。X ディスプレイ (直接サーバコンソール上、または SSH 経由のトンネル) が必要です。
Conga web ベース管理インフラストラクチャを使用する Conga インフラストラクチャは、ローカルクラスタ
管理システムと通信するノードエージェント (ricci)、クラスタリソースマネージャ、クラスタ LVM デーモン、
および管理用 Web アプリケーション (luci) から構成されます。luci を使用して、シンプルな Web ブラウザで
クラスタインフラストラクチャを構成することができます。
9.3
Red Hat Cluster フェイルオーバクラスタで
DRBD を使用する
ここでは、GFS については取り上げず、Red Hat Cluster フェイルオーバクラスタ用の DRBD の設定方法
のみを取り上げます。GFS (および GFS2) の構成については、DRBD と GFS の使用を参照してください。
このセクションでは、DRBD と Pacemaker クラスタの同様のセクションのように、高可用性 MySQL データ
82
9.3 Red Hat Cluster フェイルオーバクラスタで DRBD を使用する
ベースを構成することを前提としています。次のような構成パラメータを使用します。
• データベースのストレージ領域として使用する DRBD リソース名は mysql で、これによりデバイス
/dev/drbd0 を管理する。
• DRBD デバイスに ext3 ファイルシステムが格納され、これが /var/lib/mysql (デフォルトの MySQL
データディレクトリ) にマウントされる。
• MySQL データベースがこのファイルシステムを利用し、専用クラスタ IP アドレス 192.168.42.1 で待機
する。
クラスタ構成の設定
高可用性 MySQL データベースを設定するには、/etc/cluster/cluster.conf ファイルを作成するか変更
して、次の構成項目を記述します。
まず /etc/cluster/cluster.conf を適切なテキストエディタで開きリソース構成に次の項目を記述します。
<rm>
<resources />
<service autostart="1" name="mysql">
<drbd name="drbd-mysql" resource="mysql">
<fs device="/dev/drbd/by-res/mysql/0"
mountpoint="/var/lib/mysql"
fstype="ext3"
name="mysql"
options="noatime"/>
</drbd>
<ip address="10.9.9.180" monitor_link="1"/>
<mysql config_file="/etc/my.cnf"
listen_address="10.9.9.180"
name="mysqld"/>
</service>
</rm>
この例では、ボリュームリソースが 1 つであることを前提にしています。
<service/> でリソース参照を相互に入れ子にするのは、Red Hat Cluster Suite でリソースの依存関係を記
述する方法です。
構成が完了したら、必ず、<cluster> 要素の config_version 属性をインクリメントしてください。次のコ
マンドを実行して、実行中のクラスタ構成に変更内容をコミットします。
ccs_tool update /etc/cluster/cluster.conf
cman_tool version -r <version>
必ず、2 番目のコマンドの <version> を新しいクラスタ構成のバージョン番号と置き換えてください。
cluster.conf ファイルに drbd リソースエージェントを含めると、system-config-cluster GUI 構
成ユーティリティと Conga Web ベースクラスタ管理インフラストラクチャの両方が、クラスタ構成に関す
る問題についてのメッセージを返します。これは、2 つのアプリケーションが提供する Python クラスタ管
理ラッパが、クラスタインフラストラクチャに他社製の拡張機能が使用されることを前提としていないため
です。
したがって、クラスタ構成に drbd リソースエージェントを使用する場合は、クラスタ構成のために
system-config-cluster または Conga を使用することはお勧めできません。これらのツールは正しく機能
するはずですが、これらはクラスタの状態を監視するためにのみ使用してください。
83
第
10 章
DRBD と LVM の使用
この章では、DRBD の管理と LVM2 について説明します。特に、次のような項目を取り上げます。
• LVM 論理ボリュームを DRBD の下位デバイスとして使用する。
• DRBD デバイスを LVM の論理ボリュームとして使用する。
• 上記の 2 つを組み合わせ、DRBD を使用して階層構造の LVM を実装する。
上述の用語についてよく知らない場合は、LVM の基礎を参照してくださいまた、ここで説明する内容にとどま
らず、LVM についてさらに詳しく理解することをお勧めします。
10.1
LVM の基礎
LVM2 は、Linux デバイスマッパフレームワークのコンテキストにおける論理ボリューム管理の実装です。元
の LVM 実装とは名前と略語を除き、実際には何の共通点もありません。古い実装 (現在では LVM1 と呼ばれる)
は時代遅れとみなされているため、ここでは取り上げません。
LVM を使用する際には、次に示す基本的なコンセプトを理解することが重要です。
物理ボリューム (PV) PV (Physical Volume: 物理ボリューム) は LVM によってのみ管理される配下のブロッ
クデバイスです。ハードディスク全体または個々のパーティションが PV になります。ハードディスクにパーティ
ションを 1 つだけ作成して、これを独占的に Linux LVM で使用するのが一般的です。
パーティションタイプ"Linux LVM" (シグネチャは 0x8E) を使用して、LVM が独占的に使用するパーティ
ションを識別できます。ただし、これは必須ではありません。PV の初期化時にデバイスに書き込まれるシ
グネチャによって LVM が PV を認識します。
ボリュームグループ (VG) VG (Volume Group: ボリュームグループ) は LVM の基本的な管理単位です。VG
は 1 つまたは複数の PV で構成されます。各 VG は一意の名前を持ちます。実行時に PV を追加したり、PV を
拡張して、VG を大きくすることができます。
Logical Volume (LV) 実行時に VG 内に LV (Logical Volume: 論理ボリューム) を作成することにより、カー
ネルの他の部分がこれらを通常のブロックデバイスとして使用できます。このように、LV はファイルシステム
の格納をはじめ、ブロックデバイスと同様のさまざまな用途に使用できます。オンライン時に LV のサイズを変
更したり、1 つの PV から別の PV に移動したりすることができます (PV が同じ VG に含まれる場合)。
85
第 10 章
DRBD と LVM の使用
sLV
LV
...
LV
sLV
Volume Group (VG)
PV
PV
...
PV
図 10.1 LVM overview
スナップショット論理ボリューム (SLV) スナップショットは LV の一時的なポイントインタイムコピーです。
元の LV(コピー元ボリューム) のサイズが数百 GB の場合でも、スナップショットは一瞬で作成できます。通常、
スナップショットは元の LV と比べてかなり小さい領域しか必要としません。
10.2
DRBD の下位デバイスとして論理ボリュームを
使用する
Linux では、既存の論理ボリュームは単なるブロックデバイスであるため、これを DRBD の下位デバイスとし
て使用できます。この方法で LV を使用する場合は、通常通りに LV を作成して DRBD 用に初期化するだけです。
次の例では、LVM 対応システムの両方のノードに foo というボリュームグループがすでに存在します。この
ボリュームグループの論理ボリュームを使用して、r0 という DRBD リソースを作成します。
まず、次のコマンドで論理ボリュームを作成します。
86
10.3 DRBD 同期中の自動 LVM スナップショットの使用
lvcreate --name bar --size 10G foo
Logical volume "bar" created
このコマンドは DRBD クラスタの両方のノードで実行する必要があります。これで、いずれかのノードに
/dev/foo/bar というブロックデバイスが作成されます。
次に、新しく作成したボリュームをリソース構成に加えます。
resource r0 {
...
on alice {
device /dev/drbd0;
disk
/dev/foo/bar;
...
}
on bob {
device /dev/drbd0;
disk
/dev/foo/bar;
...
}
}
これでリソースを初めて有効にするできます。手順は LVM 対応以外のブロックデバイスと同様です。
10.3
DRBD 同期中の自動 LVM スナップショットの使用
DRBD が同期をしている間、SyncTarget の状態は同期が完了するまでは Inconsistent (不整合) の状態で
す。この状況では SyncSource で (修復できない) 障害があった場合に残念なことになります。正常なデータを
持つノードが死に、誤った情報を持つノードが残ってしまいます。
LVM 論理ボリュームを DRBD に渡す際には、同期の開始時に自動スナップショットを作成し、またこれを完
了後に自動削除する方法によって、この問題を軽減することができます
再同期中に自動でスナップショットをするには、リソース設定に以下の行を追加します。
Listing: DRBD 同期前の自動スナップショット作成
resource r0 {
handlers {
before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh";
after-resync-target "/usr/lib/drbd/unsnapshot-resync-target-lvm.sh";
}
}
2 つのスクリプトは DRBD が呼び出した ハンドラ に自動で渡す $DRBD_RESOURCE$ 環境変数を解析します。
snapshot-resync-target-lvm.sh スクリプトは、同期の開始前に、リソースが含んでいるボリュームの LVM
スナップショットを作成します。そのスクリプトが失敗した場合、同期は 開始されません。
同期が完了すると、unsnapshot-resync-target-lvm.sh スクリプトが必要のなくなったスナップショット
を削除します。スナップショットの削除に失敗した場合、スナップショットは残り続けます。
できる限り不要なスナップショットは確認するようにしてください。スナップショットが満杯だと、スナッ
プショット自身と 元のボリューム の障害の原因になります。
SyncSource に修復できない障害が起きて、最新のスナップショットに復帰したいときには、いつでも lvconvert
-M コマンドで行えます。
87
第 10 章
DRBD と LVM の使用
10.4
DRBD リソースを物理ボリュームとして構成する
DRBD リソースを物理ボリュームとして使用するためには、DRBD デバイスに PV のシグネチャを作成する必
要があります。リソースが現在プライマリロールになっているノードで、次のいずれかのコマンドを実行します。
# pvcreate /dev/drbdX
または
# pvcreate /dev/drbd/by-res/<resource>/0
この例では、ボリュームリソースが 1 つであることを前提にしています。
次に、LVM が PV シグネチャをスキャンするデバイスのリストにこのデバイスを加えます。このためには、通
常は /etc/lvm/lvm.conf という名前の LVM 設定ファイルを編集する必要があります。devices セクションで
filter というキーワードを含む行を見つけて編集します。すべての の PV を DRBD デバイスに格納する場合
には、次ように filter オプションを編集します。
filter = [ "a|drbd.*|", "r|.*|" ]
このフィルタ表現が DRBD デバイスで見つかった PV シグネチャを受け入れ、それ以外のすべてを拒否 (無視)
します。
デフォルトでは LVM は /dev にあるすべてのブロックデバイスの PV シグネチャをスキャンします。これ
は filter=["a|.*|"] に相当します。
LVM の PV でスタックリソースを使用する場合は、より明示的にフィルタ構成を指定する必要があります。対
応する下位レベルリソースや下位デバイスで PV シグネチャを無視している場合、LVM はスタックリソースで
PV シグネチャを検出する必要があります。次の例では、下位レベル DRBD リソースは 0 から 9 のデバイスを使
用し、スタックリソースは 10 以上のデバイスを使用しています。
filter = [ "a|drbd1[0-9]|", "r|.*|" ]
このフィルタ表現は、/dev/drbd10 から /dev/drbd19 までの DRBD のデバイスで見つかった PV シグニ
チャを受け入れ、それ以外のすべてを拒否 (無視) します。
lvm.conf ファイルを変更したら vgscan コマンドを実行します。LVM は構成キャッシュを破棄し、デバイ
スを再スキャンして PV シグネチャを見つけます。
システム構成に合わせて、別の filter 構成を使用することもできます。重要なのは、次の 2 つです。
• PV として使用するデバイスに、DRBD のデバイスを許容する
• 対応する下位レベルデバイスを拒否 (除外) して、LVM が重複した PV シグネチャを見つけることを回避
する。
さらに、次の設定で、LVM のキャッシュを無効にする必要があります。
write_cache_state = 0
LVM のキャッシュを無効にした後、/etc/lvm/cache/.cache を削除して、古いキャッシュを削除してくだ
さい。
対向ノードでも、上記の手順を繰り返します。
システムのルートファイルシステムが LVM 上にある場合、boot の際にボリュームグループはイニシャル
88
10.5 新しい DRBD ボリュームを既存のボリュームグループへ追加する
RAM ディスク (initrd) から起動します。そのため、LVM ツールは initrd イメージに含まれる lvm.conf
ファイルを検査します。そのため、lvm.conf に変更を加えたら、ディストリビューションに応じてユー
ティリティ (mkinitrd、update-initramfs など) で確実にアップデートしなければなりません。
新しい PV を構成したら、ボリュームグループに追加するか、新しいボリュームグループを作成します。この
とき、DRBD リソースがプライマリロールになっている必要があります。
# vgcreate <name> /dev/drbdX
同じボリュームグループ内に DRBD 物理ボリュームと DRBD 以外の物理ボリュームを混在させることが
できますが、これはお勧めできません。また、混在させても実際には意味がないでしょう。
VG を作成したら、 lvcreate コマンドを使用して、(DRBD 以外を使用するボリュームグループと同様に) こ
こから論理ボリュームを作成します。
10.5
新しい DRBD ボリュームを既存のボリューム
グループへ追加する
新しい DRBD でバックアップした物理ボリュームを、ボリュームグループへ追加したいといった事があるで
しょう。その場合には、新しいボリュームは既存のリソース設定に追加しなければなりません。そうすることで
VG 内の全 PV のレプリケーションストリームと書き込みの適合度が確保されます。
LVM ボリュームグループを Pacemaker による高可用性 LVM で説明しているように Pacemaker で管理し
ている場合には、DRBD 設定の変更前にクラスタメンテナンスモードになっている事が 必須 です。
追加ボリュームを加えるには、リソース設定を次のように拡張します。
resource r0 {
volume 0 {
device
disk
meta-disk
}
volume 1 {
device
disk
meta-disk
}
on alice {
address
}
on bob {
address
}
}
/dev/drbd1;
/dev/sda7;
internal;
/dev/drbd2;
/dev/sda8;
internal;
10.1.1.31:7789;
10.1.1.32:7789;
DRBD 設定が全ノード間で同じである事を確認し、次のコマンドを発行します。
# drbdadm adjust r0
これによって、リソース r0 の新規ボリューム 1 を有効にするため、暗黙的に drbdsetup new-minor r0 1
が呼び出されます。新規ボリュームがレプリケーションストリームに追加されると、イニシャライズやボリュー
ムグループへの追加ができるようになります。
89
第 10 章
DRBD と LVM の使用
# pvcreate /dev/drbd/by-res/<resource>/1
# lvextend <name> /dev/drbd/by-res/<resource>/1
で新規 PV の /dev/drbd/by-res/<resource>/1 が <name> VG へ追加され、VG 全体にわたって書き込み
の忠実性を保護します。
DRBD を使用する入れ子の LVM 構成
10.6
論理ボリュームを DRBD の下位デバイスとして使用し、かつ、同時に DRBD デバイス自体を物理ボリューム
として使用することもできます。例として、次のような構成を考えてみましょう。
• /dev/sda1 と /dev/sdb1 という 2 つのパーティションがあり、これらを物理ボリュームとして使用し
ます。
• 2 つの PV が local というボリュームグループに含まれます。
• この GV に 10GiB の論理ボリュームを作成し、r0 という名前を付けます。
• この LV が DRBD リソースのローカル下位デバイスになります。名前は同じ r0 で、デバイス /dev/drbd0
に対応します。
• このデバイスが replicated というもう 1 つのボリュームグループの唯一の PV になります。
• この VG には foo (4GiB) と bar (6GiB) というさらに 2 つの論理ボリュームが含まれます。
この構成を有効にするために、次の手順を行います。
• /etc/lvm/lvm.conf で適切な filter オプションを設定します。
filter = ["a|sd.*|", "a|drbd.*|", "r|.*|"]
このフィルタ表現が、SCSI および DRBD デバイスで見つかった PV シグネチャを受け入れ、その他
すべてを拒否 (無視) します。
lvm.conf ファイルを変更したら vgscan コマンドを実行します。LVM は構成キャッシュを破棄し、
デバイスを再スキャンして PV シグネチャを見つけます。
• LVM キャッシュ無効の設定
write_cache_state = 0
LVM のキャッシュを無効にした後、/etc/lvm/cache/.cache を削除して、古いキャッシュを削除
してください。
• ここで、2 つの SCSI パーティションを PV として初期化します。
# pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created
# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
• 次に、初期化した 2 つの PV を含む local という名前の下位レベル VG を作成します。
90
10.6 DRBD を使用する入れ子の LVM 構成
# vgcreate local /dev/sda1 /dev/sda2
Volume group "local" successfully created
• これで、DRBD の下位デバイスとして使用する論理ボリュームを作成できます。
# lvcreate --name r0 --size 10G local
Logical volume "r0" created
• 対向ノードに対して、ここまでのすべての手順を繰り返します。
• /etc/drbd.conf を編集して、r0 という名前の新しいリソースを作成します。
resource r0 {
device /dev/drbd0;
disk /dev/local/r0;
meta-disk internal;
on <host> { address <address>:<port>; }
on <host> { address <address>:<port>; }
}
新しいリソース構成を作成したら、忘れずに drbd.conf の内容を対向ノードにコピーします。
• リソースを初めて有効にするに従って (両方のノードの) リソースを初期化します。
• 一方のノードリソースを昇格します。
# drbdadm primary r0
• リソースを昇格したノードで、DRBD デバイスを新しい物理ボリュームとして初期化します。
# pvcreate /dev/drbd0
Physical volume "/dev/drbd0" successfully created
• 初期化した PV を使用して、同じノードに replicated という VG を作成します。
# vgcreate replicated /dev/drbd0
Volume group "replicated" successfully created
• 最後に、新しく作成したこの VG 内に新しい論理ボリュームを作成します。
VG:
# lvcreate --name foo --size 4G replicated
Logical volume "foo" created
# lvcreate --name bar --size 6G replicated
Logical volume "bar" created
これで、論理ボリューム foo と bar をローカルノードで /dev/replicated/foo と /dev/replicated/bar
として使用できます。
91
第 10 章
DRBD と LVM の使用
Switching the VG to the other node
他のノードでも使用できるように、プライマリノードで次のコマンドを実行します。
# vgchange -a n replicated
0 logical volume(s) in volume group "replicated" now active
# drbdadm secondary r0
次に他のノード (まだセカンダリの) でコマンドを発行します。
# drbdadm primary r0
# vgchange -a y replicated
2 logical volume(s) in volume group "replicated" now active
これでブロックデバイス /dev/replicated/foo と /dev/replicated/bar が他の (現在はプライマリの)
ノードで有効になります。
10.7
Pacemaker による高可用性 LVM
対向ノード間でのボリュームグループの転送と、対応する有効な論理ボリュームの作成のプロセスは自動化す
ることができます。Pacemaker の LVM リソースエージェントはまさにこのために作られています。
既存の Pacemaker 管理下にある DRBD の下位デバイスのボリュームグループをレプリケートするために、crm
シェルで次のコマンドを実行してみましょう。
Listing: DRBD の下位デバイスの LVM ボリュームグループに関する Pacemaker 設定
primitive p_drbd_r0 ocf:linbit:drbd \
params drbd_resource="r0" \
op monitor interval="29s" role="Master" \
op monitor interval="31s" role="Slave"
ms ms_drbd_r0 p_drbd_r0 \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
primitive p_lvm_r0 ocf:heartbeat:LVM \
params volgrpname="r0"
colocation c_lvm_on_drbd inf: p_lvm_r0 ms_drbd_r0:Master
order o_drbd_before_lvm inf: ms_drbd_r0:promote p_lvm_r0:start
commit
この設定を反映させると、現在の DRBD リソースのプライマリ (マスター) ロールがどちらであっても、Pacemaker
は自動的に r0 ボリュームグループを有効にします。
92
第
11 章
DRBD と GFS の使用
この章では、DRBD リソースを共有 GFS (Global File System) バージョン 2 を持つブロックデバイスとして
設定する方法をかいつまんで説明します。
詳細な手順については LINBIT の技術ガイドをご参照ください。GFS in dual-primary setups.
このガイドでは DRBD のデュアルプライマリセットアップを扱います。デュアルプライマリセットアップ
は適切な設定を行わないと データが破壊される可能性があります。
デュアルプライマリリソースの設定を行う予定のある場合、事前に LINBIT の技術ガイドをお読みください
Dual primary: think twice
もしこのドキュメントに何か不明点や不明瞭な点があれば、お気軽に LINBIT へご相談ください。
11.1
GFS の基礎
Red Hat Global File System (GFS) は、同時アクセス共有ストレージファイルシステムの Red Hat による実
装です。同様のファイルシステムのように、GFS でも複数のノードが読み取り/書き込みモードで、同時に同じ
ストレージデバイスにアクセスすることが可能です。データが破損するおそれはありません。これには、クラス
タメンバからの同時アクセスを管理する DLM (Distributed Lock Manager) が使用されます。
本来、GFS は従来型の共有ストレージデバイスを管理するために設計されたものですが、デュアルプライマリ
モードで DRBD を GFS 用のレプリケートされたストレージデバイスとして問題なく使用することができます。
アプリケーションについては、読み書きの待ち時間が短縮されるというメリットがあります。これは、GFS が一
般的に実行される SAN デバイスとは異なり、DRBD が通常はローカルストレージに対して読み書きを行うため
です。また、DRBD は各 GFS ファイルシステムに物理コピーを追加して、冗長性を確保します。
GFS ファイルシステムは通常は RedHat 独自のクラスタ管理フレームワークの DRBD と Red Hat Cluster
Suite と密接に統合されています。この章では DRBD を GFS とともに使用する方法を Red Hat Cluster の観点
から説明します。また、Pacemaker クラスタマネージャへの接続の説明では、リソースマネジメントと STONITH
についても説明します。
GFS、Pacemaker、Red Hat Cluster は Red Hat Enterprise Linux (RHEL) と、CentOS などの派生ディス
トリビューションで入手できます。同じソースからビルドされたパッケージが Debian GNU/Linux でも入手で
きます。この章の説明は、Red Hat Enterprise Linux システムで GFS を実行することを前提にしています。
93
第 11 章
DRBD と GFS の使用
11.2
GFS2 用の DRBD リソースの作成
GFS は共有クラスタファイルシステムで、すべてのクラスタノードからストレージに対して同時に読み取り/
書き込みアクセスが行われることを前提としています。したがって、GFS ファイルシステムを格納するために使
用する DRBD リソースはデュアルプライマリモードで設定する必要があります。また、スプリットブレインから
の自動復旧ポリシーするための DRBD の機能を使用することをお勧めします。両ノードのリソース昇格や GFS
ファイルシステムの開始は、Pacemaker が制御します。DRBD リソースの準備をするため、リソース構成に次
の行を追加してください。
resource <resource> {
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
...
}
...
}
回復ポリシーを設定することは、事実上、自動データロス設定を行うことです。十分にご理解のうえご使用
ください。
こ れ ら の オ プ シ ョ ン を DRBD の 設 定に 追 加 し た ら 、リ ソ ー ス を 初 め て 有 効 に す る 。リ ソ ー ス の
allow-two-primaries オプションが yes に設定されているので、両ノードのリソースの昇格と降格するこ
とができます。
再度確認してください fencing/STONITH を構成している事を確認し、すべてのユースケースを広範に
カバーするよう、特にデュアルプライマリの設定をテストしてください。
デュアルプライマリリソースのリソースフェンシングを有効にする
DRBD のリソースフェンシングを有効にするためには、DRBD 構成中に以下のセクションが必要です。
disk {
fencing resource-and-stonith;
}
handlers {
fence-peer
after-resync-target
}
"/usr/lib/drbd/crm-fence-peer.sh";
"/usr/lib/drbd/crm-unfence-peer.sh";
このスクリプトは、DRBD のインストール時に追加されます。
クラスタのデュアルプライマリ設定でのフェンシングでは、DRBD ユーザーズガイドの#ch-rhcs.html[9.1.1.
フェンシング] セクションの短さに惑わされないでください。すべてのデュアルプライマリでクラスタの
フェンシング設定が必要です。詳細な情報については、Red Hat Cluster のドキュメントをご参照くださ
い。5.5.Configuring Fence Devices また、5.6.Configuring Fencing for Cluster Members
94
11.3 CMAN を構成する
11.3
CMAN を構成する
GFS を動作させるには、Red Hat クラスタマネージャの cman が必要です。cman は、次のステップで行う
pacemaker のように柔軟で構成しやすくありません。
もし pacemaker を使いたくなければ、cman の該当するマニュアルを参照してください。
GFS ファイルシステムを作成する前に cman を構成します。
2 ノードクラスタを構成する場合、クォーラムを獲得することはできません。cman にクォーラムを無視す
る設定を行う事が必要です。以下のようにして設定できます。
# sed -i.orig "s/.*CMAN_QUORUM_TIMEOUT=.*/CMAN_QUORUM_TIMEOUT=0/g"
/etc/sysconfig/cman
次のものは、/etc/cluster/cluster.conf での cman のクラスタ構成です。
<?xml version="1.0"?>
<cluster name="my-cluster" config_version="1">
<logging debug="off"/>
<clusternodes>
<clusternode name="gfs-machine1" nodeid="1">
<fence>
<method name="pcmk-redirect">
<device name="pcmk" port="gfs-machine1"/>
</method>
</fence>
</clusternode>
<clusternode name="gfs-machine2" nodeid="2">
<fence>
<method name="pcmk-redirect">
<device name="pcmk" port="gfs-machine2"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fencedevices>
<fencedevice name="pcmk" agent="fence_pcmk"/>
</fencedevices>
</cluster>
これは、cman にクラスタ名は my-cluster、クラスタノード名は gfs-machine1 と gfs-machine2 であり、
pacemaker によって fencing されるという設定です。
構成が済んだら cman を起動します。
11.4
GFS ファイルシステムの作成
デュアルプライマリの DRBD リソースで GFS ファイルシステムを作成するには, 次のコマンドを 1 つ (!) の
ノード (これは プライマリ でなければいけません) で実行します。
mkfs -t gfs2 -p lock_dlm -j 2 -t <cluster>:<name> /dev/<drbd-resource>
-j オプションは GFS 用に確保するジャーナルの数を示しています。これは GFS クラスタのノードの数と等
95
第 11 章
DRBD と GFS の使用
しい値です。DRBD は 2 つまでのノードしかサポートしないため、ここで設定する値は常に 2 です。
DRBD 9 では 1 つのディスクを 2 ノード以上で共有することができます。そうしたい場合には、大きな
ジャーナルの値を指定するか、稼動しているファイルシステムにジャーナルを作成する必要があります。
-t オプションはロックテーブル名を定義します。<cluster>:<name> という形式が続きます。<cluster> は
/etc/cluster/cluster.conf に定義したクラスタ名に一致しなければなりません。このように、特定のクラス
タのメンバだけにファイルシステムの使用が許可されます。これに対して、<name> はクラスタ内で一意の任
意のファイルシステム名です。
11.5
Pacemaker での GFS2 ファイルシステムの使用
Pacemaker をクラスタリソースマネージャとして使用したい場合、現在の構成を Pacemaer に設定して、リ
ソースを管理するように設定しなければなりません。
Pacemaker の構成が fencing と STONITH の動作のすべてに注意して行われていることを確認してくださ
い (詳細な情報については LINBIT 社の技術ガイドをご参照ください。GFS in dual-primary setups)
Pacemaker の構成は右記に記載のように行ってください。クラスタ構成に DRBD のサービスを追加する.
ここではデュアルプライマリ構成であるため、マスタースレーブ構成に次の変更を行います。
crm(live)configure# ms ms_drbd_xyz drbd_xyz \
meta master-max="2" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
master-max が 2 になっている点に注目ください。この設定によって DRBD リーソースが両クラスタノード
で昇格されます。
さらに、GFS ファイルシステムを両ノードで開始したいので、プリミティブのファイルシステムのクローンを
追加します。
crm(live)configure# clone cl_fs_xyz p_fs_xyz meta interleave="true"
96
第
12 章
DRBD と OCFS2 の使用
この章では、共有 Oracle Cluster File System バージョン 2 (OCFS2) を格納するブロックデバイスとして
DRBD リソースを設定する方法を説明します。
全てのクラスタファイルシステムには、fencing が 必要 です。DRBD リソース経由だけでなく、STONITH
でもです。問題のあるメンバは 必ず kill されなければなりません。
次のような設定がよいでしょう。
disk {
fencing resource-and-stonith;
}
handlers {
# Make sure the other node is confirmed
# dead after this!
outdate-peer "/sbin/kill-other-node.sh";
}
これらは 非 揮発性のキャッシュである必要があります。GFS2 に関するものであり、OCFS2 についてで
はありませんが、https://fedorahosted.org/cluster/wiki/DRBD_Cookbook が参考になるでしょう。
12.1
OCFS2 の基礎
Oracle Cluster File System バージョン 2 (OCFS2) は、Oracle Corporation が開発した同時アクセス共有ス
トレージファイルシステムです。前バージョンの OCFS は Oracle データベースペイロード専用に設計されてい
ましたが、OCFS2 はほとんどの POSIX セマンティクスを実装する汎用ファイルシステムです。OCFS2 の最も
一般的なユースケースは、もちろん Oracle Real Application Cluster (RAC) ですが、OCFS2 は負荷分散 NFS
クラスタなどでも使用できます。
本来、CFS2 は従来の共有ストレージデバイス用に設計されたものですが、デュアルプライマリモードにも問
題なく配備できます。OCFS2 が通常実行される SAN デバイスとは異なり、DRBD はローカルストレージに対
して読み書きを行うため、ファイルシステムからデータを読み取るアプリケーションの読み取り待ち時間が短縮
できるというメリットがあります。さらに、DRBD の場合は、単一のファイルシステムイメージを単に共有する
のではなく、各ファイルシステムイメージにさらにコピーを追加するため、OCFS2 に冗長性が加わります。
他の共有クラスタファイルシステム DRBD と GFS の使用などと同様に、OCFS2 で複数のノードが読み取
り/書き込みモードで同じストレージデバイスに同時にアクセスできます。データが破損するおそれはありませ
ん。これには、クラスタノードからの同時アクセスを管理する DLM (Distributed Lock Manager) が使用され
97
第 12 章
DRBD と OCFS2 の使用
ます。DLM 自体は、システムに存在する実際の OCFS2 ファイルシステムとは別個の仮想ファイルシステム
(ocfs2_dlmfs) を使用します。
OCFS2 は組み込みクラスタ通信層を使用して、クラスタメンバシップおよびファイルシステムのマウントとマ
ウント解除操作を管理したり、これらのタスクを DRBD と Pacemaker クラスタクラスタインフラストラクチャ
に委ねることができます。
OCFS2 は、SUSE Linux Enterprise Server (OCFS2 が主にサポートされる共有クラスタファイルシステ
ム)、CentOS、Debian GNU/Linux および Ubuntu Server Edition で入手できます。また、Oracle は Red Hat
Enterprise Linux (RHEL) 用のパッケージも提供しています。この章の説明は、SUSE Linux Enterprise Server
システムで OCFS2 を実行することを前提としています。
12.2
OCFS2 用の DRBD リソースの作成
OCFS2 は共有クラスタファイルシステムで、すべてのクラスタノードからストレージに対して同時に読み取
り/書き込みアクセスが行われることを前提としています。したがって、OCFS2 ファイルシステムを格納するた
めに使用する DRBD リソースは、デュアルプライマリモードで設定する必要があります。また、スプリットブ
レインからの自動復旧ポリシーするための DRBD の機能を使用することをお勧めします。リソースは起動後直
ちにプライマリロールに切り替わる必要があります。上記のすべてを実行するために、次の行をリソース構成に
記述してください。
resource <resource> {
startup {
become-primary-on both;
...
}
net {
# allow-two-primaries yes;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
...
}
...
}
回復ポリシーを設定することは、事実上、自動データロス設定を行うことです。十分にご理解のうえご使用
ください。
最初の構成の際に allow-two-primaries オプションを 有効にする のはお勧めできません。これは、最初の
リソース同期が完了してから有効にしてください。
こ れ ら の オ プ シ ョ ン を DRBD の 設 定に 追 加 し た ら 、リ ソ ー ス を 初 め て 有 効 に す る 。リ ソ ー ス の
allow-two-primaries オプションを yes にすると、両方のノードのリソースをプライマリロールにリソー
スの昇格と降格させることができます。
12.3
OCFS2 ファイルシステムの作成
OCFS 対応の mkfs コマンドを使って、OCFS2 ファイルシステムを作成します。
98
12.4 Pacemaker による OCFS2 の管理
mkfs -t ocfs2 -N 2 -L ocfs2_drbd0 /dev/drbd0
mkfs.ocfs2 1.4.0
Filesystem label=ocfs2_drbd0
Block size=1024 (bits=10)
Cluster size=4096 (bits=12)
Volume size=205586432 (50192 clusters) (200768 blocks)
7 cluster groups (tail covers 4112 clusters, rest cover 7680 clusters)
Journal size=4194304
Initial number of node slots: 2
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 0 block(s)
Formatting Journals: done
Writing lost+found: done
mkfs.ocfs2 successful
2 ノードスロット OCFS2 ファイルシステムが /dev/drbd0 に作成され、ファイルシステムのラベルが
ocfs2_drbd0 に設定されます。mkfs の呼び出し時に、その他のオプションを指定することもできます。詳
細は mkfs.ocfs2 システムマニュアルページを参照ください。
12.4
Pacemaker による OCFS2 の管理
Pacemaker にデュアルプライマリ DRBD リソースを追加する
既存の OCFS2 用の DRBD リソースの作成は、次の crm 設定で Pacemaker リソース管理に追加することが
できます。
primitive p_drbd_ocfs2 ocf:linbit:drbd \
params drbd_resource="ocfs2"
ms ms_drbd_ocfs2 p_drbd_ocfs2 \
meta master-max=2 clone-max=2 notify=true
メタ変数 master-max=2 に注意してください。これは Pacemaker のマスター/スレーブのデュアルマス
ターモードを有効にします。これはまた、allow-two-primaries も yes に DRBD 設定で設定されて
いる必要があります。これらを忘れると、リソースの検証中に Pacemaker でフラグ設定エラーが発生する
かもしれません。
OCFS2 を Pacemaker で管理するには
OCFS2 とロックマネージャ (DLM) の分散カーネルを管理するために、Pacemaker は、3 つの異なるリソー
スエージェントを使用します。
• ocf:pacemaker:controld ̶ Pacemaker の DLM に対してのインタフェース
• ocf:ocfs2:o2cb ̶ Pacemaker の OCFS2 クラスタ管理へのインタフェース
• ocf:heartbeat:Filesystem ̶ Pacemaker のクローンとして構成したときにクラスタファイルシステ
ムをサポートする汎用ファイルシステム管理リソースエージェント
次の crm 設定のようにリソースグループの クローン を作成することによって、OCFS2 の管理に必要な
Pacemaker リソースをすべてのノードで起動できます。
99
第 12 章
DRBD と OCFS2 の使用
primitive p_controld ocf:pacemaker:controld
primitive p_o2cb ocf:ocfs2:o2cb
group g_ocfs2mgmt p_controld p_o2cb
clone cl_ocfs2mgmt g_ocfs2mgmt meta interleave=true
この構成がコミットされると、Pacemaker は、クラスタ内のすべてのノードで controld と o2cb のリソース
タイプのインスタンスを起動します。
Pacemaker に OCFS2 ファイルシステムを追加する
Pacemaker は OCF2 ファイルシステムにアクセスするのに、従来の ocf:heartbeat:Filesystem リソース
エージェントを使います。これはクローンモードにおいてもです。Pacemaker の管理下に OCFS2 ファイルシス
テムを配置するには、次の crm 設定を使用します。
primitive p_fs_ocfs2 ocf:heartbeat:Filesystem \
params device="/dev/drbd/by-res/ocfs2/0" directory="/srv/ocfs2" \
fstype="ocfs2" options="rw,noatime"
clone cl_fs_ocfs2 p_fs_ocfs2
この例では、ボリュームリソースが 1 つであることを前提にしています。
OCFS2 ファイルシステムを管理する Pacemaker の制約の追加
すべての OCFS2 関連のリソースとクローンを結びつけるには、Pacemaker 構成に以下の制約を加えてくだ
さい。
order o_ocfs2 ms_drbd_ocfs2:promote cl_ocfs2mgmt:start cl_fs_ocfs2:start
colocation c_ocfs2 cl_fs_ocfs2 cl_ocfs2mgmt ms_drbd_ocfs2:Master
12.5
Pacemaker を使わない OCFS2 管理
OCFS2 DLM をサポートしない旧バージョンの Pacemaker しか使えない場合、この節が参考になります。
したがって、この節は以前の方式を使っている方の参照のためにだけ残してあります。新規インストールの
場合は、Pacemaker による OCFS2 の管理方式を使ってください。
OCFS2 をサポートするようにクラスタを設定する
設定ファイルの作成
OCFS2 は主要な設定ファイル /etc/ocfs2/cluster.conf を使用します。
OCFS2 クラスタを作成する際には、必ず、両方のホストを設定ファイルに追加してください。クラスタの相
互接続通信には、通常はデフォルトポート (7777) が適切です。他のポート番号を選択する場合は、DRBD (およ
び他の構成された TCP/IP) が使用する既存のポートと衝突しないポートを選択する必要があります。
cluster.conf ファイルを直接編集したくない場合は、ocfs2console というグラフィカルな構成ユーティリ
ティを使用することもできます。通常はこちらのほうが便利です。いずれの場合も /etc/ocfs2/cluster.conf
ファイルの内容はおおよそ次のようになります。
node:
ip_port = 7777
ip_address = 10.1.1.31
number = 0
100
12.5 Pacemaker を使わない OCFS2 管理
name = alice
cluster = ocfs2
node:
ip_port = 7777
ip_address = 10.1.1.32
number = 1
name = bob
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
クラスタ構成を設定したら、scp を使用して構成をクラスタの両方のノードに配布します。
O2CB ドライバの設定
• SUSE Linux Enterprise システム
SLES では、o2cb の起動スクリプトの configure オプションを利用することができます。
/etc/init.d/o2cb configure
Configuring the O2CB driver.
This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
<ENTER> without typing an answer will keep that current value. Ctrl-C
will abort.
Load O2CB driver on boot (y/n) [y]:
Cluster to start on boot (Enter "none" to clear) [ocfs2]:
Specify heartbeat dead threshold (>=7) [31]:
Specify network idle timeout in ms (>=5000) [30000]:
Specify network keepalive delay in ms (>=1000) [2000]:
Specify network reconnect delay in ms (>=2000) [2000]:
Use user-space driven heartbeat? (y/n) [n]:
Writing O2CB configuration: OK
Loading module "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading module "ocfs2_nodemanager": OK
Loading module "ocfs2_dlm": OK
Loading module "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Starting O2CB cluster ocfs2: OK
• .Debian GNU/Linux システム
Debian の場合は、/etc/init.d/o2cb の configure オプションは使用できません。代わりに、ocfs2-tools
パッケージを再設定してドライバを有効にします。
dpkg-reconfigure -p medium -f readline ocfs2-tools
Configuring ocfs2-tools
Would you like to start an OCFS2 cluster (O2CB) at boot time? yes
Name of the cluster to start at boot time: ocfs2
The O2CB heartbeat threshold sets up the maximum time in seconds that a node
awaits for an I/O operation. After it, the node "fences" itself, and you will
probably see a crash.
It is calculated as the result of: (threshold - 1) x 2.
101
第 12 章
DRBD と OCFS2 の使用
Its default value is 31 (60 seconds).
Raise it if you have slow disks and/or crashes with kernel messages like:
o2hb_write_timeout: 164 ERROR: heartbeat write timeout to device XXXX after NNNN
milliseconds
O2CB Heartbeat threshold: `31`
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Setting cluster stack "o2cb": OK
Starting O2CB cluster ocfs2: OK
OCFS2 ファイルシステムの使用
クラスタ構成を完了して、ファイルシステムを作成すると、他のファイルシステムと同様にマウントすること
ができます。
mount -t ocfs2 /dev/drbd0 /shared
dmesg コマンドで表示されるカーネルログに次のような行が見つかるはずです。
ocfs2: Mounting device (147,0) on (node 0, slot 0) with ordered data mode.
その時点から、両方のノードで OCFS2 ファイルシステムに読み取り/書き込みモードでアクセスできるように
なります。
102
第
13 章
DRBD と Xen の使用
この章では、Xen ハイパーバイザを使用する仮想化環境の VBD (Virtual Block Device: 仮想ブロックデバイ
ス) として DRBD を使用する方法を説明します。
13.1
Xen の基礎
Xen はケンブリッジ大学 (英国) で開発された仮想化フレームワークで、その後は XenSource, Inc. (現在は
Citrix 傘下) が維持管理しています。Debian GNU/Linux (バージョン 4.0 以降)、SUSE Linux Enterprise Server
(リリース 10 以降)、Red Hat Enterprise Linux (リリース 5) など、ほとんどの Linux ディストリビューション
の比較的新しいリリースには Xen が含まれています。
Xen では準仮想化が使用されます。これは、仮想化ホストとゲスト仮想マシンの高度な協調を必要とする仮想
化方式です。従来のハードウェアエミュレーションにもとづく仮想化ソリューションよりも高いパフォーマンス
を実現します。適切な仮想化拡張機能をサポートする CPU の場合、Xen は完全なハードウェアエミュレーショ
ンもサポートします。これは Xen の用語では HVM (「Hardware-assisted Virtual Machine: ハードウェア支援
仮想マシン」) と呼ばれます。
本書の執筆時点で、Xen が HVM 用にサポートする CPU 拡張機能は Intel の Virtualization Technology
(VT、以前のコードネームは「Vanderpool」) および AMD の Secure Virtual Machine (SVM、以前の
「Pacifica」) です。
Xen は ライブマイグレーション をサポートします。これは、実行中のゲストオペレーティングシステムを 1
つの物理ホストからもう 1 つへ中断なく転送する機能です。
DRBD リソースをレプリケートされた Xen 用仮想ブロックデバイス (VBD) として設定すると、2 つのサーバ
の両方で domU の仮想ディスクとして使えます。さらに自動フェイルオーバさせることも可能になります。こ
のように、DRBD は、仮想化以外の他の用途と同様に、Linux サーバに冗長性を提供するだけでなく、Xen に
よって仮想化できる他のオペレーティングシステムにも冗長性を提供します。これには 32 ビットまたは 64 ビッ
ト Intel 互換アーキテクチャで実行可能な実質上すべてのオペレーティングシステムが含まれます。
13.2
Xen とともに使用するために DRBD モジュール
パラメータを設定する
Xen Domain-0 カーネルの場合は、disable_sendpage を 1 に設定して DRBD モジュールをロードすること
をお勧めします。ファイル /etc/modprobe.d/drbd.conf を作成するか開いて、次の行を入力します。
103
第 13 章
DRBD と Xen の使用
options drbd disable_sendpage=1
13.3
Xen VBD として適切な DRBD リソースを作成す
る
Xen の仮想ブロックデバイスとして使用する DRBD リソースの設定は比較的簡単です。基本的には、他の目
的に使用する DRBD リソースの構成とほぼ同様です。ただし、ゲストインスタンスのライブマイグレーション
を有効にしたい場合は、そのリソースのデュアルプライマリモードを有効にする必要があります。
resource <resource> {
net {
allow-two-primaries yes;
...
}
...
}
デュアルプライマリモードを有効にするのは、Xen がライブマイグレーションを開始する前にすべての VBD
の書き込みアクセスをチェックするためです。リソースは、移行元ホストと移行先ホストの両方で使用されるよ
うに設定されます。
13.4
DRBD VBD の使用
DRBD リソースを仮想ブロックデバイスとして使用するには、Xen domU 設定に次のような行を追加する必
要があります。
disk = [ 'drbd:<resource>,xvda,w' ]
この設定例では、resource という名前の DRBD リソースを読み取り/書きみモード (w) で /dev/xvda として
domU で使用できるようにします。
もちろん、複数の DRBD リソースを単一の domU で使用することもできます。その場合は、上記の例のよう
に、コンマで区切って disk オプションにさらに項目を追加します。
ただし、次に示す 3 つの状況ではこの方法を使用できません。
• 完全に仮想化された (HVM) domU を構成する場合
• グラフィカルインストールユーティリティを使用して domU をインストールし、さらに そのグラフィカ
ルインストーラが drbd: 構文をサポートしない場合。
• kernel、initrd、extra オ プ シ ョ ン を 指 定 せ ず に domU を 構 成 し 、代 わ り に bootloader と
bootloader_args により Xen 擬似ブートローダを使用するように指定し、さらにこの擬似ブートローダ
が drbd: 構文をサポートしない場合。
・
pygrub (Xen 3.3 より前) および domUloader.py (SUSE Linux Enterprise Server 10 の Xen に同
梱) は、仮想ブロックデバイス構成の drbd: 構文をサポートしない擬似ブートローダの例です。
・
Xen 3.3 以降の pygrub および SLES 11 に同梱される domUloader.py のバージョンはこの構文を
サポートします。
このような場合は、従来の phy: デバイス構文、およびリソース名ではなく、リソースに関連付けられた DRBD
104
13.5 DRBD で保護された domU の開始、停止、移行
デバイス名を使用する必要があります。ただし、この場合は DRBD の状態遷移を Xen の外部で管理する必要が
あるため、drbd リソースタイプを使用する場合より柔軟性が低下します。
13.5
DRBD で保護された domU の開始、停止、移行
domU の開始 DRBD で保護された domU を設定したら、通常の domU と同様に開始できます。
xm create <domU>
Using config file "+/etc/xen/<domU>+".
Started domain <domU>
このとき、VBD として設定した DRBD リソースは、プライマリロールに昇格され、通常どおりに Xen にア
クセスできるようになります。
domU の停止 これも同様に簡単です。
xm shutdown -w <domU>
Domain <domU> terminated.
この場合も、domU が正常にシャットダウンされると、DRBD リソースがセカンダリロールに戻ります。
domU の移行 これも通常の Xen ツールで実行します。
xm migrate --live <domU> <destination-host>
この場合、短時間に連続して複数の管理ステップが自動的に実行されます。
1. destination-host のリソースがプライマリロールに昇格されます。
2. domU のライブマイグレーションがローカルホストで開始します。
3. 移行先ホストへの移行が完了すると、ローカル側でリソースがセカンダリロールに降格されます。
最初にリソースをデュアルプライマリモードに設定するのは、両方のリソースを短時間だけ両方のホストでプ
ライマリロールとして実行する必要があるためです。
13.6
DRBD と Xen 統合の内部
Xen はネイティブで次のタイプの仮想ブロックデバイスをサポートします。
phy このデバイスタイプは、ホスト環境で使用可能な「物理的な」ブロックデバイスをゲスト domU に基本的
には透過的な方法で渡します。
file このデバイスタイプは、ファイルベースのブロックデバイスイメージをゲスト domU で使用するための
ものです。元のイメージファイルからループブロックデバイスを作成し、このブロックデバイスを phy デバイス
タイプとほぼ同じ方法で domU に渡します。
domU 構成の disk オプションで設定された仮想ブロックデバイスが phy: と file: 以外の接頭辞を使用す
る場合、または接頭辞をまったく使用しない場合 (この場合は Xen のデフォルトの phy デバイスタイプが使用さ
れる) は、Xen スクリプトディレクトリ (通常は/etc/xen/scripts) にある block - prefix というヘルパースクリ
105
第 13 章
DRBD と Xen の使用
プトが使用されます。
DRBD は drbd デバイスタイプ用のスクリプト (/etc/xen/scripts/block-drbd) を提供しています。この章
の前半で述べたように、このスクリプトは必要に応じて DRBD リソースの状態遷移を制御します。
13.7
Xen と Pacemaker の統合
DRBD で保護される Xen VBD のメリットを十分に活用するために heartbeat を使用し、関連する domU を
heartbeat リソースとして管理することをお勧めします。
Xen domU を Pacemaker リソースとして構成し、フェイルオーバを自動化することができます。これには Xen
OCF リソースエージェントを使用します。この章で説明した Xen デバイスタイプとして drbd を使用している場
合は、Xen クラスタリソースで使用するために個別に drbd リソースを設定する必要は ありません。block-drbd
ヘルパースクリプトによって必要なリソース移行がすべて実行されます。
106
第
V部
DRBD パフォーマンスの
最適化
第
14 章
ブロックデバイスのパフォーマンス測定
14.1
スループットの測定
DRBD を使用することによるシステムの I/O スループットへの影響を測定する際には、スループットの 絶対
値 はほとんど意味がありません。必要なのは、DRBD が I/O パフォーマンスに及ぼす 相対的 な影響です。し
たがって、I/O スループットを測定する際には、必ず DRBD がある場合とない場合の両方を測定する必要があ
ります。
ここで説明するテストは破壊的です。データが上書きされるため、DRBD デバイスの同期が失われます。し
たがって、テストが完了したら破棄することができるスクラッチボリュームに対してのみテストを行ってく
ださい。
I/O スループットを見積もるには、比較的大きなデータチャンクをブロックデバイスに書き込み、システムが
書き込み操作を完了するまでの時間を測定します。これは一般的なユーティリティ dd を使用して簡単に測定で
きます。比較的新しいバージョンにはスループット見積もり機能が組み込まれています。
簡単な dd ベースのスループットベンチマークは、たとえば次のようになります。ここでは、test という名前
のスクラッチリソースが現在接続されており、両方のノードでセカンダリロールになっています。
#
#
#
#
#
TEST_RESOURCE=test
TEST_DEVICE=$(drbdadm sh-dev $TEST_RESOURCE)
TEST_LL_DEVICE=$(drbdadm sh-ll-dev $TEST_RESOURCE)
drbdadm primary $TEST_RESOURCE
for i in $(seq 5); do
dd if=/dev/zero of=$TEST_DEVICE bs=512M count=1 oflag=direct
done
# drbdadm down $TEST_RESOURCE
# for i in $(seq 5); do
dd if=/dev/zero of=$TEST_LL_DEVICE bs=512M count=1 oflag=direct
done
このテストでは、512M のデータチャンクを DRBD デバイスに書き込み、次に比較のために下位デバイスに書
き込みます。両方のテストをそれぞれ 5 回繰り返し、統計平均を求めます。結果は dd が生成するスループット
測定です。
新規に有効にした DRBD デバイスの場合は、最初の dd 実行ではパフォーマンスがかなり低くなりますが、
これは正常な状態です。アクティビティログがいわゆる「コールド」な状態のためで、問題はありません。
109
第 14 章
ブロックデバイスのパフォーマンス測定
14.2
待ち時間の測定
待ち時間を測定する際の対象はスループットベンチマークとはまったく異なります。I/O 待ち時間テストでは、
非常に小さいデータチャンク (理想的にはシステムが処理可能な最も小さいデータチャンク) を書き込み、書き込
みが完了するまでの時間を測定します。通常はこれを何度か繰り返して、通常の統計変動を相殺します。
スループットの測定と同様に、I/O 待ち時間の測定にも一般的な dd ユーティリティを使用できますが、異な
る設定とまったく異なった測定を行います。
以下は簡単な dd ベースの待ち時間のマイクロベンチマークです。ここでは、test という名前のスクラッチリ
ソースが現在接続されており、両方のノードでセカンダリロールになっています。
#
#
#
#
#
#
#
TEST_RESOURCE=test
TEST_DEVICE=$(drbdadm sh-dev $TEST_RESOURCE)
TEST_LL_DEVICE=$(drbdadm sh-ll-dev $TEST_RESOURCE)
drbdadm primary $TEST_RESOURCE
dd if=/dev/zero of=$TEST_DEVICE bs=512 count=1000 oflag=direct
drbdadm down $TEST_RESOURCE
dd if=/dev/zero of=$TEST_LL_DEVICE bs=512 count=1000 oflag=direct
このテストでは、512 バイトのデータチャンクを DRBD デバイスに 1,000 回書き込み、次に比較のために下位
デバイスにも 1000 回書き込みます。512 バイトは Linux システム (s390 以外のすべてのアーキテクチャ) が扱う
ことができる最小のブロックサイズです。
dd が生成するスループット測定はこのテストではまったく意味がなく、ここで重要なのは、1,000 回の書き込
みが完了するまでにかかった 時間 です。この時間を 1,000 で割ると、1 つのセクタへの書き込みの平均待ち時間
を求めることができます。
110
第
15 章
DRBD のスループット最適化
この章では、DRBD のスループットの最適化について説明します。スループットを最適化するためのハード
ウェアに関する検討事項と、チューニングを行う際の詳細な推奨事項について取り上げます。
15.1
ハードウェアの検討事項
DRBD のスループットは、配下の I/O サブシステム (ディスク、コントローラおよび対応するキャッシュ) の
帯域幅とレプリケーションネットワークの帯域幅の両方の影響を受けます。
I/O サブシステムのスループット I/O サブシステムのスループットは、主に平行して書き込み可能なディスク
の数によって決まります。比較的新しい SCSI または SAS ディスクの場合、一般に 1 つのディスクに約 40MB/s
でストリーミング書き込みを行うことができます。ストライピング構成で配備する場合は、I/O サブシステムによ
り書き込みがディスク間に並列化されます。この場合、スループットは、1 つのディスクのスループットに構成内
に存在するストライプの数を掛けたものになります。RAID-0 または RAID-1+0 構成で、3 つのストライプがあ
る場合は同じ 40MB/s のディスクのスループットが 120MB/s になり、5 つのストライプがある場合は 200MB/s
になります。
ハードウェアのディスク ミラーリング (RAID-1) は、一般にスループットにはほとんど影響ありません。
ディスクの パリティ付きストライピング (RAID-5) はスループットに影響し、通常はストライピングに
比べてスループットが低下します。
ネットワークのスループット
ネットワークスループットは一般にネットワーク上に存在するトラフィック量と
経路上にあるルータやスイッチなどのスループットによって決定されます。ただし、DRBD のレプリケーショ
ンリンクは通常は専用の背面間ネットワーク接続であるため、これらはあまり関係がありません。したがって、
ネットワークのスループットを向上させるには、高スループットのプロトコル (10 ギガビットイーサネットなど)
に切り換えるか、複数のネットワークリンクからなるリンク集積体を使用します。後者は Linux bonding ネッ
トワークドライバを使用して実現できます。
15.2
スループットオーバヘッドの予測
DRBD に関連するスループットオーバヘッドを見積もる際には、必ず次の制限を考慮してください。
• DRBD のスループットは下位 I/O サブシステムのスループットにより制限される。
111
第 15 章
DRBD のスループット最適化
• DRBD のスループットは使用可能なネットワーク帯域幅により制限される。
理論上の 最大 スループットは上記の 小さい方 によって決まります。この最大スループットは DRBD のス
ループットオーバヘッドが加わることにより低下しますが、これは 3% 未満だと考えられます。
• たとえば、200MB/s のスループットが可能な I/O サブシステムを持つ 2 つのクラスタノードが、ギガ
ビットイーサネットリンクで接続されているとします。TCP 接続の場合、ギガビットイーサネットのス
ループットは 110MB/s 程度だと考えられるため、この構成ではネットワーク接続が律速要因になります。
DRBD の最大スループットは 107MB/s 程度になるでしょう。
• 一方、I/O サブシステムの持続した書き込みスループットが 100MB/s 程度の場合は、これが律速要因と
なり、DRDB の最大スループットはわずか 97MB/s になります。
15.3
チューニングの推奨事項
DRBD には、システムのスループットに影響する可能性があるいくつかの構成オプションがあります。ここで
は、スループットを向上させるための調整について、いくつかの推奨事項を取り上げます。ただし、スループッ
トは主としてハードウェアに依存するため、ここで取り上げるオプションを調整しても、効果はシステムによっ
て大きく異なります。パフォーマンスチューニングについて、必ず効く「特効薬」は存在しません。
max-buffers と max-epoch-size の設定
これらのオプションはセカンダリノードの書き込みパフォーマンスに影響します。max-buffers はディスク
にデータを書き込むために DRBD が割り当てるバッファの最大数で、max-epoch-size は、2 つの書き込みバ
リア間で許容される書き込み要求の最大数です。ほとんどの状況では、この 2 つのオプションを並行して同じ値
に設定するのが適切です。パフォーマンスを上げるためには max-buffers は max-epoch-size 以上でなけれ
ばなりません。デフォルト値は両方とも 2048 です。比較的高パフォーマンスのハードウェア RAID コントロー
ラの場合、この値を 8000 程度に設定すれば十分です。
resource <resource> {
net {
max-buffers 8000;
max-epoch-size 8000;
...
}
...
}
I/O アンプラグ境界値の調整
I/O アンプラグ境界値は、正常動作中に I/O サブシステムのコントローラが「キックされる」(保留された I/O
要求を強制的に処理する) 頻度に影響します。このオプションはハードウェアに大きく依存するため、一般的な
推奨値はありません。
コントローラによっては、頻繁に「キックされる」とパフォーマンスが向上する場合があり、こうしたコント
ローラにはこの値を比較的小さく設定すると効果的です。DRBD で許容される最小値 (16) まで小さくすること
も可能です。キックされないほうがパフォーマンスが高くなるコントローラの場合は、この値を max-buffers
と同じ値まで大きくすることをお勧めします。
112
15.3 チューニングの推奨事項
resource <resource> {
net {
unplug-watermark 16;
...
}
...
}
TCP 送信バッファサイズの調整
TCP 送信バッファは送信 TCP トラフィックのメモリバッファです。デフォルトサイズは 128KiB です。高ス
ループットネットワーク (専用ギガビットイーサネット、負荷分散ボンディング接続など) で使用する場合は、こ
のサイズを 512KiB かそれ以上に設定すると効果があるでしょう。送信バッファサイズを 2MiB 以上にすること
は一般にはお勧めできません。また、スループットが向上する可能性もありません。
resource <resource> {
net {
sndbuf-size 512k;
...
}
...
}
TCP 送信バッファの自動調整もサポートされます。この機能を有効にすると、DRBD が適切な TCP 送信バッ
ファサイズを動的に選択します。TCP 送信バッファの自動調整を有効にするには、次のようにバッファサイズを
ゼロに設定します。
resource <resource> {
net {
sndbuf-size 0;
...
}
...
}
アクティビティログサイズの調整
DRBD を使用するアプリケーションが、デバイス全体に分散した小さな書き込みを頻繁に発行する、書き込み
集約型の場合は、十分に大きなアクティビティログを使用することをお勧めします。そうでない場合、頻繁なメ
タデータ更新により書き込みパフォーマンスが低下する可能性があります。
resource <resource> {
disk {
al-extents 3389;
...
}
...
}
バリアとディスクフラッシュを無効にする
次に取り上げる推奨事項は、不揮発性 (バッテリでバックアップされた) のコントローラキャッシュのある
システムで のみ で適用されます。
113
第 15 章
DRBD のスループット最適化
バッテリでバックアップされた書き込みキャッシュを持つシステムには、停電時にデータを保護する機能が組
み込まれています。その場合は、同じ目的を持つ DRBD 自体の保護機能の一部を無効にすることもできます。こ
れはスループットの面で有効な場合があります。
resource <resource> {
disk {
disk-barrier no;
disk-flushes no;
...
}
...
}
114
第
16 章
DRBD の待ち時間の最適化
この章では、DRBD の待ち時間の最適化について説明します。待ち時間を最小にするためのハードウェアに関
する検討事項と、チューニングを行う際の詳細な推奨事項について取り上げます。
16.1
ハードウェアの検討事項
DRBD の待ち時間は、配下の I/O サブシステム (ディスク、コントローラおよび対応するキャッシュ) の待ち
時間とレプリケーションネットワークの待ち時間の両方の影響を受けます。
I/O サブシステムの待ち時間 I/O サブシステムの待ち時間には、主としてディスクの回転速度が影響します。
したがって、高速回転のディスクを使用すれば I/O サブシステムの待ち時間が短縮します。
同様に、BBWC (Battery-Backed Write Cache) を使用すると、書き込み完了までの時間が短くなり、書き
込みの待ち時間を短縮できます。手頃な価格のストレージサブシステムの多くは何らかのバッテリバックアップ
キャッシュを備えており、管理者がキャッシュのどの部分を読み書き操作に使用するか設定できます。ディスク
読み取りキャッシュを完全に無効にし、すべてのキャッシュメモリをディスク書き込みキャッシュとして使用す
る方法をお勧めします。
ネットワークの待ち時間
ネットワークの待ち時間は、基本的にはホスト間の RTT (Packet Round-Trip Time)
です。これ以外にもいくつかの要因がありますが、そのほとんどは、DRBD レプリケーションリンクとして推奨
する、DRBD 専用回線接続の場合は問題になりません。ギガビットイーサネットリンクには常に一定の待ち時間
が発生しますが、通常、これは 100∼200 マイクロ秒程度のパケット往復時間です。
ネットワークの待ち時間をこれより短くするには、待ち時間が短いネットワークプロトコルを利用する以外あ
りません。たとえば、Dolphin SuperSockets の Dolphin Express などを介して DRDB を実行します。
16.2
待ち時間オーバヘッドの予測
スループットに関して、DRDB に関連する待ち時間オーバヘッドを見積もる際には、必ず次の制限を考慮して
ください。
• DRBD の待ち時間は下位 I/O サブシステムの待ち時間により制限される。
• DRBD の待ち時間は使用可能なネットワークの待ち時間により制限される。
DRBD の理論上の_最小_待ち時間は、上記 2 つの_合計_です。さらにわずかなオーバヘッドが追加されま
115
第 16 章
DRBD の待ち時間の最適化
すが、これは 1% 未満だと予測されます。
• たとえば、ローカルディスクサブシステムの書き込み待ち時間が 3ms で、ネットワークリンクの待ち時間
が 0.2ms だとします。予測される DRBD の待ち時間は 3.2ms で、ローカルディスクに書き込むだけのと
きと比べて約 7% 待ち時間が増加することになります。
CPU のキャッシュミス、コンテキストスイッチなど、他にも待ち時間に影響する要因があります。
16.3
チューニングの推奨事項
CPU マスクの設定
DRBD では、カーネルスレッドの明示的な CPU マスクを設定できます。これは、CPU サイクルが DRBD と
競合するアプリケーションの場合に特に役立ちます。
CPU マスクは数字で、バイナリ表現の最下位ビットが第 1 の CPU を表し、その次のビットが第 2 の CPU を
表します。ビットマスクの設定ビットは、対応する CPU が DRBD によって使用されていることを示し、クリア
されたビットは使用されていないことを示します。たとえば、CPU マスク 1 (00000001) は、DRBD が第 1 の
CPU だけを使用することを示します。マスク 12 (00001100) は DRBD が第 3 と第 4 の CPU を使用することを
示します。
次に、リソースの CPU マスク構成の例を示します。
resource <resource> {
options {
cpu-mask 2;
...
}
...
}
DRBD とこれを使用するアプリケーションとの CPU 競合を最小限に抑えるためには、もちろん、DRBD
が使用していない CPU だけをアプリケーションが使用するように設定する必要があります。
一部のアプリケーションは、DRBD 自体と同様に設定ファイルでこの設定を行うことができます。アプリケー
ションによっては、init スクリプトで taskset コマンドを呼び出す必要があります。
ネットワーク MTU の変更
ブロックベースのファイルシステムが DRBD の上の層に置かれている場合は、レプリケーションネットワー
クの MTU サイズをデフォルトの 1500 バイトより大きい値に変更すると効果的な場合があります。(エクステン
トベースの場合は異なります) 口語的には「ジャンボフレームを有効にする」といいます。
ブロックベースのファイルシステムには、ext3、ReiserFS (バージョン 3) および GFS があります。エクス
テントベースのファイルシステムには、XFS、Lustre および OCFS2 があります。エクステントベースの
ファイルシステムの場合は、少数の大きなファイルが格納されている場合を除き、ジャンボフレームを有効
にしてもメリットはありません。
MTU は、次のコマンドを使用して変更できます。:
ifconfig <interface> mtu <size>
または
116
16.3 チューニングの推奨事項
ip link set <interface> mtu <size>
<interface> には DRBD のレプリケーションに使用するネットワークインタフェース名を指定します。<size>
の一般的値は 9000 (バイト) です。
deadline deadline I/O スケジューラを有効にする
高性能なライトバックに対応したハードウェア RAID コントローラを使う場合、CFQ の代わりに単純な
deadline を I/O スケジューラに指定する方が DRBD の待ち時間を小さくできることがあります。比較的新し
いカーネル構成 (多くのディストリビューションでは 2.6.18 より後) ではデフォルトでは有効になっている CFQ
スケジューラよりも、こちらの使用をお勧めします。
I/O スケジューラ構成に変更を加える場合は、/sys にマウントされる sysfs 仮想ファイルシステムを使用で
きます。スケジューラ構成は /sys/block/<device> に置かれています。<device>は DRBD が使用する下位
デバイスです。
deadline スケジューラを有効にするには、次のコマンドを使用します。
`echo deadline > /sys/block/<device>/queue/scheduler`
次の値も設定することにより、さらに待ち時間を短縮できます。
• フロントマージを無効にします。:
echo 0 > /sys/block/<device>/queue/iosched/front_merges
• 読み取り I/O deadline を 150 ミリ秒にします (デフォルトは 500ms)。
echo 150 > /sys/block/<device>/queue/iosched/read_expire
• 書き込み I/O デッドラインを 1500 ミリ秒にします (デフォルトは 3000ms)。
echo 1500 > /sys/block/<device>/queue/iosched/write_expire
上記の値の変更により待ち時間が大幅に改善した場合は、システム起動時に自動的に設定されるようにしてお
くと便利です。Debian および indexterm:[Ubuntu Linux]Ubuntu システムの場合は、sysfsutils パッケージ
と /etc/sysfs.conf 設定ファイルでこの設定を行うことができます。
グローバル I/O スケジューラを選択するには、カーネルコマンドラインを使用して elevator オプションを渡
します。そのためには、ブートローダ構成 (GRUB ブートローダを使用する場合通常は /boot/grub/menu.lst
に格納) を編集し、カーネルブートオプションのリストに elevator=deadline を追加します。
117
第
VI 部
DRBD をさらに詳しく知る
第
17 章
DRBD の内部
この章では DRBD の内部アルゴリズムと内部構造について、いくつか の背景情報を取り上げます。これは、
DRBD の背景について関心のあるユーザが対象です。DRBD 開発者が参考にできるほど深い内容には踏み込ん
でいません。開発者の方は資料に記載された文書や DRBD リソースソースコードを参照してください。
DRBD メタデータ
17.1
DRBD はレプリケートするデータに関するさまざまな情報を専用の領域に格納しています。このメタデータに
は次のようなものがあります。
• DRBD デバイスのサイズ
• 世代識別子 (GI、詳細は世代識別子を参照)
• アクティビティログ (AL、詳細はアクティビティログを参照)
• クイック同期ビットマップ (詳細はクイック同期ビットマップを参照)
このメタデータは 内部 または 外部に格納されます。いずれの方法で格納するかは、リソースごとに設定でき
ます。
内部メタデータ
内部メタデータを使用するようにリソースを設定すると、DRBD はメタデータを実際の本稼働データと同じ下
位レベルの物理デバイスに格納します。デバイスの 末尾 の領域がメタデータを格納するための領域として確保
されます。
メリット
メタデータは実際のデータと密接にリンクされているため、ハードディスクに障害が発生しても、管
理者は特に何かする必要はありません。メタデータは実際のデータとともに失われ、ともに復元されます。
デメリット RAID セットではなく、下位レベルデバイスが唯一の物理ハードディスクの場合は、内部メタデー
タが原因で書き込みスループットが低下することがあります。アプリケーションによる書き込み要求の実行によ
り、DRBD のメタデータの更新が引き起こされる場合があります。メタデータがハードディスクの同じ磁気ディ
スクに格納されている場合は、書き込み処理によって、ハードディスクの書き込み/読み取りヘッドが 2 回余分に
動作することになります。
すでにデータが書き込まれているディスク領域を下位デバイスに指定して DRBD でレプリケートする場合
で、内部メタデータを使うには、DRBD のメタデータに必要な領域を 必ず 確保してください。
121
第 17 章
DRBD の内部
Cs
Ms = d 18 e × 8 + 72
2
図 17.1 DRBD メタデータサイズの計算 (正確)
そうでない場合、DRBD リソースの作成時に、新しく作成されるメタデータによって下位レベルデバイスの末
尾のデータが上書きされ、既存のファイルが破損します。以下のいずれかの方法でこれを避けることができます。
• 下位レベルデバイスを拡張します。これには、LVM などの論理ボリューム管理機能を使用します。ただ
し、対応するボリュームグループに有効な空き領域が必要です。ハードウェアストレージソリューション
を使用することもできます。
• 下位レベルデバイスの既存のファイルシステムを縮小します。ファイルシステムによっては実行できない
場合があります。
• 上記 2 つが不可能な場合は、代わりに外部メタデータを使用します。
下位レベルデバイスをどの程度拡張するか、またはファイルシステムをどの程度縮小するかについては、メタ
データサイズの見積りを参照してください。
外部メタデータ
外部メタデータは、本稼働データを格納するものとは異なる個別の専用ブロックデバイスに格納します。
メリット
一部の書き込み処理では、外部メタデータを使用することにより、待ち時間をいくらか短縮できます。
デメリット メタデータが実際の本稼働データに密接にリンクされません。つまり、ハードウェア障害により本
稼働データだけが破損したか、DRBD メタデータは破損しなかった場合、手動による介入が必要です。生き残っ
たノードから切り替えるディスクに、手動でデータの完全同期を行う必要があります。
次の項目 すべて に該当する場合には、外部メタデータ使用する以外の選択肢はありません。
• DRBD でレプリケートしたい領域にすでにデータが格納されている。
• この既存デバイスを拡張することができない。
• デバイスの既存のファイルシステムが縮小をサポートしていない。
デバイスのメタデータを格納する専用ブロックデバイスが必要とするサイズにについてはメタデータサイズの
見積りを参照してください。
メタデータサイズの見積り
次の式を使用して、DRBD のメタデータに必要な領域を正確に計算できます。
Cs はセクタ単位のデータデバイスサイズです。
デバイスサイズは ‘blockdev --getsz <device>‘を実行して取得できます。
結果の Ms もセクタ単位です。MB に変換する場合は 2048 で割ります (521 バイトをセクタサイズとする、s390
122
17.2 世代識別子
MMB
CMB
<
+1
32768
図 17.2 DRBD メタデータサイズの見積り (概算)
を除くすべての標準の Linux プラットフォームの場合)。
実際には、次の計算で得られる大まかな見積りで十分です。この式では、単位はセクタではなくメガバイトで
ある点に注意してください。
17.2
世代識別子
DRBD では 世代識別子 (GI) を使用してレプリケートされたデータの「世代」を識別します。
これは DRBD の内部メカニズムで、次のような目的で使用されます。
• 2 つのノードが実際に同じクラスタのメンバか確認する (2 つのノードが誤って接続されたものではないこ
と確認する)。
• バックグラウンド同期の方向を確認する (必要な場合)。
• 完全な再同期が必要か、部分的な再同期で十分か判断する。
• スプリットブレインを検出する。
データの世代
DRBD は次のような場合に、新しい データ世代 の開始としてマークを付けます。
• デバイスの初期フル同期。
• 切断したリソースがプライマリロールに切り替わる。
• プライマリロールのリソースが切断する。
つまり、リソースの接続状態が Connected になり、両方のノードのディスク状態が UpToDate になると、両
方のノードの現在のデータ世代が同一になります。逆も同様です。逆も同様です。
新規のデータ世代は 8 バイトの UUID (Universally Unique Identifier) で識別されます。
世代識別子タプル
DRBD では、現在と履歴のデータ世代について 4 組の情報がローカルリソースメタデータに格納されます。
現在 UUID
これは、ローカルノードからみた最新のデータ世代の世代識別子です。リソースが Connected に
なり完全に同期されると、両ノードの現在 UUID が同一になります。
Bitmap UUID これは、オンディスク同期ビットマップにより変更が追跡されている世代の UUID です。オ
ンディスク同期ビットマップ自体については、切断モードの間のみこの識別子が意味を持ちます。リソースが
123
第 17 章
DRBD の内部
Before
After
Current
Current
Bitmap (empty)
Bitmap
Historical (1)
Historical (1)
Historical (2)
Historical (2)
図 17.3 新規データ世代の開始時に変化する GI タプル
Before
After
Current
Current
Bitmap
Bitmap
Historical (1)
Historical (1)
Historical (2)
Historical (2)
図 17.4 再同期開始時の GI タプルの変化
Connected の場合は、この UUID は常に空 (ゼロ) です。
2 つの履歴 UUID これらは現在の世代より前の 2 つのデータ世代識別子です。
まとめて、これら 4 つを 世代識別子タプル、または略して「GI タプル」と呼びます。
世代識別子の変化
新規データ世代の開始
ネットワーク障害や手動の介入によりノードが対向ノードとの接続を失うと、DRBD は
次のようにローカル世代識別子を変更します。
1. 新規データ世代に対して新規 UUID が作成されます。これが、プライマリノードの新しい現在 UUID に
なります。
2. 以前の UUID は、ビットマップが変更を追跡している世代を参照します。したがって、これがプライマリ
ノードの新しいビットマップ UUID になります。
3. セカンダリノードでは GI タプルは変化しません。
再同期の開始 再同期を開始すると、DRBD はローカルの世代識別子に対して次のような変更を行います。
1. 同期元の現在 UUID は変化しません。
2. 同期元のビットマップ UUID が循環して、第 1 の履歴 UUID になります。
3. 同期元で新規のビットマップ UUID が生成されます。
4. この UUID が同期先の新しい現在 UUID になります。
124
17.2 世代識別子
Before
After
Current
Current
Bitmap
Bitmap (empty)
Historical (1)
Historical (1)
Historical (2)
Historical (2)
図 17.5 再同期完了時の GI タプルの変化
5. 同期先のビットマップ UUID と履歴 UUID は変化しません。
再同期の完了
再同期が完了すると、次のような変更が行われます。
1. 同期元の現在 UUID は変化しません。
2. 同期元のビットマップ UUID が循環して第 1 の履歴 UUID になり、第 1 の UUID が第 2 の履歴 UUID に
移動します。第 2 の履歴 UUID がすでに存在する場合は破棄されます。
3. 次に、同期元のビットマップ UUID が空 (ゼロ) になります。
4. 同期先は、同期元から GI タプル全体を取得します。
世代識別子と DRBD の状態
ノード間の接続が確立すると、2 つのノードは現在入手可能な世代識別子を交換し、それに従って処理を続行
します。結果は次のようにいくつか考えられます。
両ノードの現在 UUID が空の場合
ローカルノードと対向ノードの両方で現在 UUID が空の状態です。新規に
構成され、初回フル同期が完了していない場合は、通常この状態です。同期が開始していないため、手動で開始
する必要があります。
1 つのノードの現在 UUID が空の場合 対向ノードの現在 UUID が空で、自身は空でない場合です。これは、ロー
カルノードを同期元とした初期フル同期が進行中であることを表します。初期フル同期の開始時に、ローカルノー
ドの DRBD はディスク上の同期ビットマップのすべてのビットを 1 にして、ディスク全体が非同期だとマークし
ます。その後ローカルノードを同期元とした同期が始まります。逆の場合 (ローカルの現在 UUID が空で、対向
ノードが空でない場合) は、DRBD は同様のステップをとります。ただし、ローカルノードが同期先になります。
現在 UUID が等しい場合
ローカルの現在 UUID と対向ノードの現在 UUID が空はなく、同じ値を持っている
状態です。両ノードがともにセカンダリで、通信切断中にどのノードもプライマリにならなかったことを表しま
す。この状態では同期は必要ありません。
ビットマップ UUID が対向ノードの現在 UUID と一致する場合
ローカルノードのビットマップ UUID が対向
ノードの現在 UUID と一致し、対向ノードのビットマップ UUID が空の状態です。これは、ローカルノードがプ
ライマリで動作している間にセカンダリノードが停止して再起動したときに生じる正常な状態です。これは、リ
125
第 17 章
DRBD の内部
モートノードは決してプライマリにならず、ずっと同じデータ世代にもとづいて動作していたことを意味します。
この場合、ローカルノードを同期元とする通常のバックグラウンド再同期が開始します。逆に、ローカルノード
自身の ビットマップ UUID が空で、対向ノードの ビットマップがローカルノードの現在 UUID と一致する状態
の場合。これはローカルノードの再起動に伴う正常な状態です。この場合、ローカルノードを同期先とする通常
のバックグラウンド再同期が開始します。
現在 UUID が対向ノードの履歴 UUID と一致する場合 ローカルノードの現在 UUID が対向ノードの履歴 UUID
のうちの 1 つと一致する状態です。これは過去のある時点では同じデータを持っていたが、現在は対向ノードが
最新のデータを持ち、しかし対向ノードのビットマップ UUID が古くなって使用できない状態です。通常の部分
同期では不十分なため、ローカルノードを同期元とするフル同期が開始します。DRBD はデバイス全体を非同
期状態とし、ローカルノードを同期先とするバックグラウンドでのフル再同期を始めます。逆の場合 (ローカル
ノードの履歴 UUID のうち 1 つが対向ノードの現在 UUID と一致する)、DRBD は同様のステップを行います
が、ローカルノードが同期元となります。
ビットマップ UUID が一致し、現在 UUID が一致しない場合
ローカルノードの現在 UUID が対向ノードの現
在 UUID と異なるが、ビットマップ UUID は一致する状態はスプリットブレインです。ただし、データ世代は
同じ親を持っています。この場合、設定されていれば DRBD がスプリットブレイン自動回復ストラテジが実行
されます。設定されていない場合、DRBD はノード間の通信を切断し、手動でスプリットブレインが解決される
まで待機します。
現在 UUID もビットマップ UUID も一致しない場合
ローカルノードの現在 UUID が対向ノードの現在 UUID
と異なり、ビットマップ UUID も 一致しない 状態です。これもスプリットブレインで、しかも過去に同一のデー
タ状態であったという保証もありません。したがって、自動回復ストラテジが構成されていても役に立ちません。
DRBD はノード間通信を切断し、手動でスプリットブレインが解決されるまで待機します。
いずれの UUID も一致しない場合 最後は、DRBD が 2 つのノードの GI タプルの中に一致するものを 1 つも検
出できない場合です。この場合は、関連のないデータと、切断に関する警告がログに記録されます。これは、相
互にまったく関連のない 2 つのクラスタノードが誤って接続された場合に備える DRBD の機能です。
17.3
アクティビティログ
目的
書き込み操作中に、DRBD は書き込み操作をローカルの下位ブロックデバイスに転送するだけでなく、ネット
ワークを介して送信します。実用的な目的で、この 2 つの操作は同時に実行されます。タイミングがランダムな
場合は、書込み操作が完了しても、ネットワークを介した転送がまだ始まっていないといった状況が発生する可
能性があります。
この状況で、アクティブなノードに障害が発生してフェイルオーバが始まると、このデータブロックのノード
間の同期は失われます。障害が発生したノードにはクラッシュ前にデータブロックが書き込まれていますが、レ
プリケーションはまだ完了していません。そのため、ノードが回復しても、このブロックは回復後の同期のデー
タセット中から取り除かれる必要があります。さもなくば、クラッシュしたノードは生き残ったノードに対して
「先書き」状態となり、レプリケーションストレージの「オール・オア・ナッシング」の原則に違反してしまいま
126
17.3 アクティビティログ
R × tsync
E=
4
図 17.6 同期速度とターゲットの同期時間にもとづくアクティブエクステントの計算
す。これは DRBD だけでなく、実際、すべてのレプリケーションストレージの構成で問題になります。バージョ
ン 0.6 以前の DRBD を含む他の多くのストレージソリューションでは、アクティブなノードに障害が発生した場
合、回復後にそのノードを改めてフル同期する必要があります。
バージョン 0.7 以降の DRBD は、これとは異なるアプローチを採用しています。アクティビティログ (AL)
は、メタデータ領域にに格納され、「最近」書き込まれたブロックを追跡します。この領域は ホットエクステン
ト と呼ばれます。
アクティブモードだったノードに一時的な障害が発生し、同期が行われる場合は、デバイス全体ではなく AL
でハイライトされたホットエクステントだけが同期されます。これによって、アクティブなノードがクラッシュ
したときの同期時間を大幅に短縮できます。
アクティブエクステント
アクティビティログの設定可能なパラメータに、アクティブエクステントの数があります。アクティブエクス
テントは 4MiB 単位でプライマリのクラッシュ後に再送されるデータ量に追加されますこのパラメータは、次の
対立する 2 つの状況の折衷案としてご理解ください。
アクティブエクステントが多い場合
大量のアクティビティログを記録すれば書き込みスループットが向上しま
す。新しいエクステントがアクティブになるたびに、古いエクステントが非アクティブにリセットされます。こ
の移行には、メタデータ領域への書き込み操作が必要です。アクティブエクステントの数が多い場合は、古いア
クティブエクステントはめったにスワップアウトされないため、メタデータの書き込み操作が減少し、その結果
パフォーマンスが向上します。
アクティブエクステントが少ない場合
アクティビティログが小さい場合は、アクティブなノードが障害から回
復した後の同期時間が短くなります。
アクティビティログの適切なサイズの選択
エクステントの数は所定の同期速度における適切な同期時間にもとづいて定義します。アクティブエクステン
トの数は次のようにして算出できます。
R は MB/秒単位の同期速度、tsync は秒単位のターゲットの同期時間です。E は求めるアクティブエクステン
トの数です。
スループット速度が 90MiByte/秒の I/O サブシステムがあり、同期速度が 30MiByte/s に設定されていると
します (R =30)。ターゲットの同期時間は 4 分 (240 秒) を維持する必要があります。(tsync =240):
正確な計算結果は 1800 ですが、DRBD の AL 実装のハッシュ関数はエクステントの数が素数に設定されてい
127
第 17 章
DRBD の内部
30 × 240
E=
= 1800 ≈ 1801
4
図 17.7 同期速度とターゲット同期時間にもとづくアクティブエクステントの計算 (例)
る場合に最適に動作します。したがって、ここでは 1801 を選択します。
17.4
クイック同期ビットマップ
クイック同期ビットマップは DRBD がリソースごとに使用する内部データ構造で、同期ブロック (両方のノー
ドで同一) または非同期ブロックを追跡します。ビットマップはノード間通信が切断しているときのみ使われます。
クイック同期ビットマップでは、1 ビットが 4KiB チャンクのオンディスクデータを表します。ビットがクリ
アされていれば、対応するブロックが対向ノードと同期しています。つまり、切断以降、ブロックに書き込まれ
ていないということです。逆に、ビットが設定されていればブロックが変更されているため、接続が再確立した
らすぐに再同期を行う必要があります。
スタンドアロンノードでディスクにデータが書き込まれると、クイック同期ビットマップのへの書き込みも始
まります。ディスクへの同期的な I/O は負荷が大きいため、実際にはメモリ上のビットマップのビットが設定さ
れます。アクティビティログ) が期限切れになってブロックがコールドになると、メモリ上のビットマップがディ
スクに書き込まれます。同様に、生き残ったスタンドアロンのノードでリソースが手動でシャットダウンされる
と、DRBD は すべての ビットマップをディスクにフラッシュします。
リモートノードが回復するか接続が再確立すると、DRBD は両方のノードのビットマップ情報を照合して、再
同期が必要な すべてのデータ領域 を決定します。同時に、DRBD は世代識別子と DRBD の状態を調べ、同期
の 方向 を決定します。
同期元ノードが同期対象ブロックを対向ノードに送信し、同期先が変更を確認すると、ビットマップの同期ビッ
トがクリアされます。別のネットワーク障害などで再同期が中断し、その後再開すると、中断した箇所から同期を
続行します。中断中にブロックが変更された場合、もちろんそのブロックが再同期データセットに追加されます。
drbdadm pause-sync と drbdadm resume-sync コマンドを使用して、再同期を手動で一時停止した
り再開することもできます。ただしこれは慎重に行ってください。再同期を中断すると、セカンダリノード
のディスクが必要以上に長く Inconsistent 状態になります。
17.5
peer fencing インタフェース
DRBD は、レプリケーションリンクが遮断したときに、対向ノードを切り離すメカニズムとして定義されたイ
ンタフェースを備えています。Heartbeat に同梱の drbd-peer-outdater ヘルパーはこのインタフェースのリ
ファレンス実装です。ただし、独自の peer fencing ヘルパープログラムも簡単に実装できます。
fencing ヘルパーは次のすべてを満たす場合にのみ呼び出されます。
1. リソース (または common) の handlers セクションで fence-peer ハンドラが定義されている。
2. fencing オプションで、resource-only または resource-and-stonith が設定されている。
3. レプリケーションリンクの中断時間が、DRBD がネットワーク障害を検出するために十分である。
128
17.5 peer fencing インタフェース
終了コード
意味
3
4
対向ノードのディスク状態がすでに Inconsistent になっている。
対向ノードのディスク状態が正常に Outdated に設定された (または
最初から Outdated だった。)
対向ノードへの接続に失敗。対向ノードに到達できなかった。
5
6
影響を受けるリソースがプライマリロールになっていたため、対向ノー
ドを無効にできなかった。
対向ノードがクラスタから正常にフェンシングされた。影響を受けるリ
7
ソースの fencing を resource-and-stonith に設定しておかなけ
れば発生しない。
fence-peer ハンドラとして指定されたプログラムかスクリプトが呼び出されると、DRBD_RESOURCE と
DRBD_PEER 環境変数が利用できるようになります。これらの環境変数には、それぞれ、影響を受ける DRBD リ
ソース名と対向ホストのホスト名が含まれています。
peer fencing ヘルパープログラム (またはスクリプト) は、次のいずれかの終了コードを返します。
1. fence-peer ハンドラの終了コード
129
第
18 章
詳細情報の入手
18.1
商用 DRBD のサポート
DRBD の商用サポート、コンサルティング、トレーニングサービスは、プロジェクトのスポンサ企業 LINBIT
社が提供しています。日本では LINBIT 社との提携にもとづいて株式会社サードウェアが各種サポートを提供
しています。
18.2
公開メーリングリスト
DRBD の一般的な使用法について質問がある場合は、公開メーリングリスト drbd-user@lists.linbit.com にお
問い合せください。このメーリングリストは登録が必要です。http://lists.linbit.com/drbd-user で登録してく
ださい。すべてのアーカイブのリストは http://lists.linbit.com/pipermail/drbd-user にあります。
18.3
公開 IRC チャンネル
公開 IRC サーバ irc.freenode.net の次のチャンネルに、DRBD の開発者も参加しています。
• #drbd,
• #linux-ha,
• #linux-cluster.
IRC を使って、DRBD の改善を提案したり、開発者レベルの議論をするときもあります。
18.4
公開ツイッターアカウント
LINBIT は公開ツイッターアカウント linbit をメンテナンスしています。
DRBD についてツイートする際は、#drbd ハッシュタグをつけてください。
18.5
資料
DRBD の開発者により作成された DRBD 一般や DRBD の特定の機能についての文書が公開されています。
その一部を次に示します。
131
第 18 章
詳細情報の入手
1. Lars Ellenberg.
DRBD v8.0.x and beyond.
2007.
http://www.drbd.org/fileadmin/drbd/
publications/drbd8.linux-conf.eu.2007.pdf
2. Philipp Reisner. DRBD v8 - Replicated Storage with Shared Disk Semantics. 2007. http://www.
drbd.org/fileadmin/drbd/publications/drbd8.pdf
3. Philipp Reisner. Rapid resynchronization for replicated storage. 2006. http://www.drbd.org/
fileadmin/drbd/publications/drbd-activity-logging_v6.pdf
18.6
その他の資料
• Wikipeda には an entry on DRBD があります。
• Linux-HA wiki と
• ClusterLabs に、高可用性クラスタで DRBD を活用するための有益な情報があります。
132
付録
A
新しい変更点
この付録は DRBD 8.4 より前のバージョンからアップグレードしたユーザ向けです。DRBD の構成と挙動へ
のいくつかの重要な変更点に焦点を合わせています。
A.1
ボリューム
ボリュームは DRBD 8.4 の新しい概念です。8.4 より前では、すべてのリソースは 1 つのブロックにのみ関連
付けられていました。そのため DRBD デバイスとリソース間は 1 対 1 の関係でした。8.4 からは各々が 1 つのブ
ロックデバイスに対応するマルチボリュームが、1 つのレプリケーションコネクションを共有することが可能に
なりました。これは順番に 1 つのリソースに対応するものです。
udev シンボリックリンクの変更
DRBD udev 統合スクリプトは、個々のブロックデバイスのノードを示すシンボリックリンクを管理します。
これらは /dev/drbd/by-res と /dev/drbd/by-disk ディレクトリにあります。
DRBD 8.3 以前では、/dev/drbd/by-disk のリンクは 1 つのブロックデバイスに張られていました。
Listing: DRBD 8.3 以前の udev が管理する DRBD シンボリックリンク
lrwxrwxrwx 1 root root 11 2011-05-19 11:46 /dev/drbd/by-res/home ->
../../drbd0
lrwxrwxrwx 1 root root 11 2011-05-19 11:46 /dev/drbd/by-res/data ->
../../drbd1
lrwxrwxrwx 1 root root 11 2011-05-19 11:46 /dev/drbd/by-res/nfs-root ->
../../drbd2
DRBD 8.4 では、1 つのリソースが複数ボリュームに対応できるため、/dev/drbd/by-res/<resource> は
個々のボリュームに張られたシンボリックを含む_ディレクトリ_になりました。
Listing: DRBD 8.4 での udev が管理する DRBD シンボリックリンク
lrwxrwxrwx 1 root
../../drbd0
lrwxrwxrwx 1 root
../../drbd1
lrwxrwxrwx 1 root
../../drbd2
lrwxrwxrwx 1 root
root 11 2011-07-04 09:22 /dev/drbd/by-res/home/0 ->
root 11 2011-07-04 09:22 /dev/drbd/by-res/data/0 ->
root 11 2011-07-04 09:22 /dev/drbd/by-res/nfs-root/0 ->
root 11 2011-07-04 09:22 /dev/drbd/by-res/nfs-root/1 ->
133
付録 A 新しい変更点
../../drbd3
シンボリックリンクが参照するファイルシステムの構成は、DRBD 8.4 に移行する場合には、通常は単純にシ
ンボリックリンクのパスに /0 を追加することで更新されている必要があります。
A.2
構成における構文の変更点
このセクションでは構成における構文の変更点について扱います。これは /etc/drbd.d と /etc/drbd.conf
の DRBD 設定ファイルに影響があります。
drbdadm の構文解析は 8.4 より前の構文も受け付け、現在の構文へ内部で自動的に変換します。前のリリー
スにない新機能の使用を行うのでなければ、現在の構文に合わせて構成を調整する必要はありません。しか
しながら、DRBD 9 では旧フォーマットはサポートされなくなるため、いずれは新しい構文を適用するこ
とを推奨いたします。
論理型構成オプション
drbd.conf は色々な論理型構成オプションをサポートしています。DRBD 8.4 より前の構文では、これら論
理型オプションは次のようでした。
Listing: DRBD 8.4 より前の論理型オプションが付いた構成例
resource test {
disk {
no-md-flushes;
}
}
これは構成上の問題がありました。common 構成セクションに論理型オプションを加えたいとき、その後で個々
のリソースを上書きしていました。
common {
no-md-flushes;
}
resource test {
disk {
# No facility to enable disk flushes previously disabled in
# "common"
}
}
DRBD 8.4 では、すべての論理型オプションは yes か no の値をとります。common からでも個々の resource
セクションからでも、これらオプションが操作しやすくなっています。
1. common セクションでの DRBD 8.4 の論理型オプション付き構成例
common {
md-flushes no;
}
resource test {
disk {
md-flushes yes;
}
134
A.2 構成における構文の変更点
}
syncer セクションはなくなりました
DRBD 8.4 より前では、構成の構文で syncer セクションが使用できましたが、8.4 では使われなくなりまし
た。以前あった syncer オプションは、リソースの net または disk セクションの中に移動しています。
resource test {
syncer {
al-extents 3389;
verify-alg md5;
}
...
}
上記の例で表しているものは、DRBD 8.4 の構文では次のようになります。
Listing: DRBD 8.4 での syncer セクションが置き換えられた構成例
resource test {
disk {
al-extents 3389;
}
net {
verify-alg md5;
}
...
}
protocol オプションは特例でなくなりました
以前の DRBD リリースでは、protocol オプションは不自然にも (また直観に反して)、net セクション内で
はなく、単独で定義される必要がありました。DRBD 8.4 ではこの変則をなくしています。
resource test {
protocol C;
...
net {
...
}
...
}
DRBD 8.4 での同じ構成の構文は次のようになります。
1. net セクション内に protocol オプションのある DRBD 8.4 構成例 +
resource test {
net {
protocol C;
...
}
...
}
135
付録 A 新しい変更点
新しいリソースごとの options セクション
DRBD 8.4 では、resource セクション内でも common セクション内でも定義できる新しい options セクション
を導入しました。以前は不自然にも syncer セクションで定義されていた cpu-mask オプションは、このセクション
に移動しました。同様に 8.4 より前のリリースでは disk セクションで定義されていた on-no-data-accessible
オプションもこのセクションに移動しました。
resource test {
syncer {
cpu-mask ff;
}
disk {
on-no-data-accessible suspend-io;
}
...
}
DRBD 8.4 での同じ構成の構文は次のようになります。
1. options セクションでの DRBD 8.4 の構成例
resource test {
options {
cpu-mask ff;
on-no-data-accessible suspend-io;
}
...
}
A.3
ネットワーク通信のオンライン変更
レプリケーションプロトコルの変更
DRBD 8.4 より前では、リソースがオンラインまたはアクティブの状態では、レプリケーションプロトコルの変
更は不可能でした。リソースの構成ファイル内で protocol オプションを変更し、それから両ノードで drbdadm
disconnect を実行し、最後に drbdadm connect を行わなければなりませんでした。
DRBD 8.4 では、即座にレプリケーションプロトコルの変更が行えます。たとえば、一時的に接続を通常の同
期レプリケーションから非同期レプリケーションのモードに変更することができます。
Listing: 接続が確率された状態でレプリケーションプロトコルを変更する
drbdadm net-options --protocol=A <resource>
シングルプライマリからデュアルプライマリのレプリケーションに変更する
DRBD 8.4 より前では、リソースがオンラインやアクティブの状態ではシングルプライマリからデュアルプラ
イマリに変更したり戻したりする事はできませんでした。リソースの構成ファイル内の allow-two-primaries
オプションを変更し、drbdadm disconnect を実行し、それから drbdadm connect を両ノードで実行する必
要がありました。
DRBD 8.4 ではオンラインで変更が行えます。
136
A.4 drbdadm コマンドの変更点
DRBD のデュアルプライマリモードを使うアプリケーションはクラスタファイルシステムまたは他のロッ
キング機構を使用していることが 必要 です。このために、デュアルプライマリモードが一時的または永続
的であることは区別されません。
リソースがオンライン中にデュアルプライマリに変更する場合は、一時的なデュアルプライマリモードを参照
してください。
A.4
drbdadm コマンドの変更点
pass-through オプションの変更点
DRBD 8.4 以前では、drbdadm で特殊なオプションを drbdsetup に引き渡す場合には、次の例のように難解
な --&#160;--<option> 構文を使わなければなりませんでした。
drbdadm -- --discard-my-data connect <resource>
代わりに、drbdadm はこの引き渡しオプションを通常オプションと同じように使えるようになりました。
drbdadm connect --discard-my-data <resource>
古い構文もまだサポートされますが、使わないことを強くお勧めします。なお、この新しい簡単な構文を使
用する場合には、(--discard-my-data) オプションを、(connect) サブコマンドの 後 で、かつリソー
ス識別子の 前 に指定する必要があります。
--overwrite-data-of-peer は --force オプションに置き換えられました
--overwrite-data-of-peer オプションは DRBD 8.4 ではなくなり、より簡潔な --force に置き換えられ
ました。このため、リソースの同期を開始するために、次のコマンドは使えません。
drbdadm -- --overwrite-data-of-peer primary <resource>
代わりに次のようなコマンドをご使用ください。
drbdadm primary --force <resource>
A.5
デフォルト値の変更点
DRBD 8.4 では、Linux カーネルや利用できるサーバハードウェアの向上に合わせて、drbd.conf のいくつ
かのデフォルト値が更新されました。
同時にアクティブなアクティビティログのエクステント数 (al-extents)
al-extents の以前のデフォルト値の 127 は 1237 に変更になりました。これによりメタデータのディスク書き
込み作業量の現象によるパフォーマンスの向上が可能になりました。この変更によりプライマリノードのクラッ
シュ時の再同期時間が長くなります。これはギガビットイーサネットと高帯域幅のレプリケーションリンクの偏
在が関係しています。
ランレングス符号化 (use-rle)
画像転送のためのランレングス符号化 (RLE) が DRBD 8.4 ではデフォルトで有効になっています。use-rle
137
付録 A 新しい変更点
オプションのデフォルト値は yes です。RLE は、2 つの切断されたノードの接続時に常に起きるクイック同期
ビットマップ中のデータ転送量を大きく減らします。
I/O エラーの処理ストラテジー (on-io-error)
DRBD 8.4 ではデフォルトで I/O スタックの上位レイヤに I/O エラーを伝えない設定です。以前のバージョ
ンでは I/O エラーを伝える設定でしたが、置き換えられました。つまり問題のあるドライブの DRBD ボリュー
ムが自動的に Diskless のディスク状態に遷移し、対向ノードからのデータを提供します。
可変レート同期
可変レート同期は DRBD 8.4 ではデフォルトで有効です。デフォルト設定は次の構成のようになっています。
DRBD 8.4 での可変レート同期のデフォルトオプション
resource test {
disk {
c-plan-ahead 20;
c-fill-target 50k;
c-min-rate 250k;
}
...
構成可能な DRBD デバイス数 (minor-count)
DRBD 8.4 で構成可能な DRBD デバイス数は 1,048,576 (2$^{20 }$) です (前バージョンでは 255)。これは生
産システムでの想定を越える、理論的な限界以上のものです。
138
付録
B
DRBD system manual pages
B.1
DRBD.CONF
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 の付いたすべてのファイルのサフィックスである。
Listing: Example B.1 簡単な .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;
139
付録 B
DRBD system manual pages
meta-disk internal;
}
address
10.1.1.32:7789;
}
}
上の例は r0 という名前の 1 つの DRBD リソースを設定している。ノード間の通信プロトコルは C である。
ホスト alice では 1 つのボリューム含んでいて、/dev/drbd1 をアプリケーション用のデバイスとして使用し、
/dev/sda7 をデータ用の下位デバイスとしている。IP アドレスには 2 ノード間の通信に使うネットワークイン
タフェースの IP アドレスを指定している。DRBD の再同期には 10 メガバイト/秒の帯域幅を使うことができ
る。この sync-rate ステートメントはボリューム 0 に対して有効だが、追加のボリュームにも有効である。こ
の例では各ボリュームに 10MB/ 秒フルで指定している。1 つの drbd.conf に複数のリソースセクションを書く
こともできる。他の設定例についてはこちらを参照: DRBD User’s Guide
FILE FORMAT
本ファイルはセクションとパラメータで構成される。各セクションはキーワードで始まり、任意指定のパラメー
タ、開き中括弧 (「 { 」) で始まる。閉じ中括弧 (「 } 」) でセクションが終わる。中括弧はパラメータを囲むの
にも使われる。
section [name] { parameter value; [...] }
パラメータ名と値の間にホワイトスペースが必要である。パラメータ名の後ろの文字列はパラメータに対する
値と見なされる。ブールパラメータは特別なパラメータで、パラメータ名だけで構成される。パラメータの最後
にセミコロン (「 ; 」) が必要である。
いくつかのパラメータ値はデフォルトの単位を持つが、K、M、または G を明示的に指定することによって
単位を変えられる。これらの単位はコンピュータでおなじみの方法で定義される (K=2^10=1024, M=1024K,
G=1024M )。設定ファイルにコメントを記述できる。コメント行はハッシュ記号 (「 # 」) で始まらなければな
らない。この文字以降行末までの文字がコメントと見なされる。
Sections
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
140
B.1 DRBD.CONF
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 セクションに記述すると、このセクションはこれらの値を継承できる。すべてを継承する場合、
141
付録 B
DRBD system manual pages
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 を参照。指定できるパラメータは次のとおり: 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、read-balancing
net
このセクションは、ネットワークに対する DRBD の取り扱いをチューニングするパラメータで構成される。各
パラメータの詳細は DRBDSETUP を参照。指定できるパラメータは次のとおり : 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、congestionextents、verify-alg、use-rle、csums-alg、socket-check-timeout
startup
こ の セ ク シ ョ ン は 、ネ ッ ト ワ ー ク に 対 す る DRBD の 取 り 扱 い を チ ュ ー ニ ン グ す る パ ラ メ ー タ で
構 成 さ れ る 。各 パ ラ メ ー タ の 詳 細 は DRBDSETUP を 参 照 。指 定 で き る パ ラ メ ー タ は 次 の と お り
: wfc-timeout、degr-wfc-timeout、outdated-wfc-timeout、wait-after-sb、stacked-timeouts、
become-primary-on
options
このセクションはリソースオブジェクトの取扱いをチューニングするパラメータで構成される。各パラメータの
詳細は DRBDSETUP を参照。指定できるパラメータは次のとおり : cpu-mask、on-no-data-accessible
handlers
このセクションでは、特定のイベントへに応答して DRBD によって起動される (実行可能な) ハンド
ラを指定できる。指定できるパラメータは次のとおり: pri-on-incon-degr、pri-lost-after-sb、
pri-lost、fence-peer(for-merlyoudate-peer)、local-io-error、initial-split-brain、split-
142
B.1 DRBD.CONF
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 は推奨しない。
これらの設定がすべてのハンドラに設定されるわけではない。いくつかの値は動的な設定では無効に
なる。
Parameters
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 アドレスを検証しないようにできる。
usage-count val
DRBD の利用者統計 [DRBD’s online usage counter] に参加するには、このオプションを yes に指定する。
指定できる値は yes、no、ask である。
protocol prot-id
DRBD の TCP/IP の通信の際に使われる プロトコル を指定する。prot-id には A、B または C を指定する。
プロトコル A
ローカルディスクとローカル TCP 送信バッファにデータを書き込んだらディスクへの書き込みが完了
したと判断する。
プロトコル B
ローカルディスクとリモートバッファキャッシュにデータを書き込んだらディスクへの書き込みが完了
143
付録 B
DRBD system manual pages
したと判断する。
プロトコル 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、sdp のなかから選択される。(互換性の観点から sci を ssocks
の代わりに指定できる)。IPv4 の場合、これを省略できる。IPV 6 を使う場合は、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 のメタデータスロットを参照する。これは最大 4GB ま
で指定することができるこの方法により複数の DBRD デバイスが同一のメタデータデバイスを共有できる
ようになる。例えば /dev/sde6[0] と /dev/sde6[1] を使用するとき、/dev/sde6 は最低でも 256MB 以上で
なければいけない。ハードサイズの制限のため、メタディスクのインデックスは推奨されない。
on-io-error handler
下位デバイスが I/O エラーを上位に伝えたときに実行する ハンドラ を指定する。handler には pass_on、
call-local-io-error、detach のいずれかを指定できる。
144
B.1 DRBD.CONF
pass_on
ノードはディスクのステータスを inconsistent(不整合) にし、I/O エラーを起こしたブロックに対応す
るビットマップにマークをつける。そして、リモートのノード上で入出力を再度行う。
call-local-io-error
ハンドラスクリプト local-io-error を呼び出して実行する。
detach
低レベルデバイスを切り離して、ディスクレスモードで処理を続行する。
fencing fencing_policy
フェンシングは、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 は、
inux-2.6.36(及び RHEL6 の 2.6.32) 以降での正常動作が確認できないためデフォルトで無効になった。注
意:有識者による指示のもとでのみ使用すること。
手法を選択するにあたっては、測定可能なパフォーマンスデータのみに頼るべきではない。下位デバイスが
揮発性の書き込みキャッシュしか持たない場合 (通常のハードディスクや通常のハードディスクだけで構成さ
れる RAID など)、以下の最初の 2 つのオプションを指定すべきである。下位デバイスにバッテリバックアッ
プ機能付きの書き込みキャッシュがある場合には、3 番目のオプションが利用できる。4 番目のオプション
(すべてを無効にする場合は "none") は、ほとんどの I/O スタックにおいて危険で、ディスクへの書き込み順
序が入れ替わってしまう可能性がある。そうなると、理論的にはデータ破損の原因、または DRBD プロト
コルを乱し、再接続と切断を繰り返すような状態に陥る可能性がある。no-disk-drain を使っては ならない。
残念なことに、デバイスマッパ (LVM) はバリアをサポートしていない。
/proc/drbd の"wo:"の文字の後ろに、下位デバイスに対する現在の設定が b、f、d、n の文字で表示される。
オプションは次のとおり。
barrier
145
付録 B
DRBD system manual pages
下位デバイスがバリア (SCSI では"tagged command queuing"、SATA では"native com-mand queuing"
と呼ばれる) をサポートしている場合、このオプションを選択できる。このオプションを有効にするに
は disk-barrier オプションを yes にする。
flush
下位デバイスがディスクフラッシュ (ベンダーは "force unit access" と呼んでいる) をサポートしてい
る場合、このオプションを選択できる。このオプションは disk-flushes を no に設定する。
drain
最初の書き込みは次の書き込みリクエストを処理する前に完了しなければならない。このオプションは
8.0.9 までの唯一の処理方法であった。
none
‒
-no-disk-drain を指定すると、下位デバイスへの書き込みの依存関係を一切指示しなくなる。こ
れはほとんどの I/O スタックにおいて危険であり、ディスクへの書き込み順序が入れ替わってしまう可
能性がある。そうなると、理論的にはデータ破損の原因、または DRBD プロトコルを乱し、再接続と
切断を繰り返すような状態に陥る可能性がある。no-disk-drain を使ってはならない。
md-flushes
メタデータデバイスへのアクセスにあたってバリアやフラッシュを使用しない。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
DRBD デバイスがデータを格納する下位レベルデバイスが、指定した +disk-timeout 以内 + で I/O リクエ
ストを完了しない場合、DRBD はこれを障害とみなす。下位デバイスは切り離され、デバイスのディスク状
態はディスクレス状態になる。DRBD が 1 台または複数の対向ノードに接続したとき、失敗したリクエスト
はそのうち 1 台に伝えられる。
このオプションはカーネルパニックを引き起こす可能性があり、注意が必要である。リクエストの「中断」あ
るいはディスクの強制切り離しは、完全に下位デバイスをブロックまたはハンギングして、リクエストをまっ
たく処理せずエラーも処理しなくなる。この状況ではハードリセットとフェイルオーバ以外になす術がない。
146
B.1 DRBD.CONF
「中断」すると、基本的にローカルエラーの完了を装い、すみやかにサービスの移行を行うことで安全な切
り替えを行う。それでもなお、影響を受けるノードは "すぐ" に再起動される必要はある。リクエストを完
了することで、上位レイヤーに関連するデータページを再利用させることができる。後にローカルの下位デ
バイスが「復帰」すると、ディスクから元のリクエストページへの DMA のデータは、うまくいくと未使用
のページへランダムなデータを送るが、多くの場合その間に関係のないデータに変形してしまい、様々なダ
メージの原因になる。つまり遅延した正常な完了は、特に読み込みリクエストの場合 panic() の原因にな
る。遅延した「エラー」完了は、その都度に通知は行うが、問題ないと考えてよい。
disk-timeout のデフォルト値は 0 であり、無限のタイムアウトを意味する。タイムアウトは 0.1 秒単位で
指定する。このオプションは DRBD 8.3.12. から利用できる。
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. から有効である。
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
このパラメータで指定した時間内にキープアライブパケットに応答しなければならない。応答パケットが返っ
147
付録 B
DRBD system manual pages
てこない場合、その対向ノードは死んだと判断される。デフォルト値は 500ms で、100ms 単位で指定する。
max-buffers number
受信側、再同期、オンライン照合を行う際に DRBD マイナーデバイスあたりに使用するメモリを制限する。
単位は PAGE_SIZE で、ほとんどのシステムで 4KiB である。設定できる最小値は 32 (=128 KiB) でハー
ドコードされている。これらバッファはディスクからの読み書きの際にデータブロックを保持するために使
用される。輻輳時のデッドロックを回避するために、この設定はハード制限というよりは閾値として使用さ
れる。最大バッファページが使用されると、プールからのそれ以上の割り当てが制限される。受信側の I/O
バックエンドに余裕がない場合には、max-buffers を増やすとよい。
ko-count number
セカンダリノードが 1 回の書き込みリクエストに count 回以上失敗した場合、そのセカンダリノードはクラ
スタから排除される。つまり、プライマリノードが StandAlone になる。デフォルト値は 0 で、この機能は
無効になっている。
注 : ko-count のデフォルト値は誤植で、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 アルゴリズム + を指定する。対向ノードの認証は行うべきである。
チャレンジ-レスポンス方式で対向ノードを認証するのに、HMAC アルゴリズムが使われる。/proc/crypto
に記録されている任意のダイジェストアルゴリズムを指定できる。
shared-secret
対向ノードの認証には共有秘密 が使用され、64 文字までで指定する。cram-hmac-alg を指定しないと対
向ノードの認証は行われない。
148
B.1 DRBD.CONF
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
149
付録 B
DRBD system manual pages
セカンダリ側のデータを捨てる。
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
どちらか一方のノードのデータは安定であるという前提を無視して、プライマリノードへの同期を許可
する。危険なので 使ってはならない。
call-pri-lost
pri-lost ハンドラを呼び出す。このプログラムには、マシンをリブートしてそのマシンをセカンダリ
にするような機能が要求される。
150
B.1 DRBD.CONF
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 で送信できるデータ量を越えてディスクに書きこもうとするアプリケーションの処理速度が低下す
ることを意味する。DRBDProxy を使っている場合、送信キューが満杯になる直前に AHEAD/BEAIND モー
ド に移行するのが望ましい。AHEAD/BEHIND モードでは、DRBD 間の通信は切断しないが、データレ
プリケーションは行われなくなる。AHEAD/BEHIND モードの利点は、たとえ DRBDProxy のバッファが
すべての書き込み要求を受け入れるのに十分でなくても、アプリケーションが遅くならないことである。欠
点は、対向ノードが後れをとっているため、同期状態に戻すために再同期が必要になることである。再同期
中対向ノードのデータは不整合状態のままとなる。congestion_policy では、block と pull-ahead が使用で
きる。デフォルト値は block である。Fill_threshold は 0 から 10GiB までの値を指定できる。デフォルト値
は 0 で、これはチェックが無効になることを意味する。Active_extents_threshold は、al-extents と同じ
制限がある。AHEAD/BEHIND モードは DRBD8.3.10. 以降で利用できる。
wfc-timeout time
接続確立までの待機時間にタイムアウト値を設定する。drbd(8) は、DRBD リソースの接続が確立するま
で待ち続ける。後に起動されるクラスタ管理システムは、通常はリソース内のスプリットブレイン状態まで
はチェックしない。待ち時間を制限したい場合には、このパラメータ値を設定する。デフォルト値は 0 で、
タイムアウトせずに待ち続ける。単位は秒である。
degr-wfc-timeout time
クラスタが縮退した場合には、コネクションタイムアウトを待つ。縮退とは、片方のノードしか動作してい
ない状態を表す。このようなクラスタをリブートした場合には、対向ノードが一定時間内に起動する可能性
が低いため、wfc-timeout ではなく degr-wfc-timeout+ が使われる。デフォルト値は 60 秒で、秒単位
で指定する。+0 を指定すると、タイムアウトしなくなる。
outdated-wfc-timeout time
相手ノードが無効になってから、接続確立までの待機時間にタイムアウト値を設定する。無効になった相手
151
付録 B
DRBD system manual pages
ノードが再起動されているデグレードクラスタ (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 に非現実的な大き
な値を指定しなければならないことがある。socket-check-timeout を指定していない場合、TCP コネクショ
ンが開始したときに安定するのを待つ局面でも、DRBD は ping-timeout を使ってしまう。このような場合、
socket-check-timeout に DRBD と DRBD Proxy 間の round trip time(RTT) を設定するとよい。デフォ
ルトの単位は 10 分の 1 秒である。デフォルト値は 0 で socket-check-timeout 値の代わりに ping-timeout 値
を使用する。8.4.5 から導入された。
152
B.1 DRBD.CONF
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
153
付録 B
DRBD system manual pages
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
154
B.1 DRBD.CONF
このパラメータに指定したハンドラは、ノードが現在プライマリであるにもかかわらず、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 ステートメン
トはトップレベルでのみ使用でき、セクション内では使用できない。
データ整合性に関する注意点
DRBD がミラーしたデータの整合性を保証する方法は 2 つあり、これらはそれぞれ別々のものである。オン
ライン照合と、network セクションの data-integrity-alg である。どちらのメカニズムの場合でも、データの転
送中に DRBD の上位プログラムがディスクに書き込みを行った場合、不整合ではないのに不整合と判断される
ことがある。それはスワップの発生、グローバル同期中の付加、ワークロードの打ち切りや書き換えであるか
155
付録 B
DRBD system manual pages
もしれず、必ずしもデータ整合性の問題をもたらさない。通常イニシエータがデータ転送を行う際には、デー
タブロックがディスク上のデータ構造の一部でない事を認識しているか、すぐに正確なデータで再実行される。
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
Philipp Reisner: philipp.reisner@linbit.com、Lars Ellenberg: lars.ellenberg@linbit.com
REPORTING BUGS
バグについては右記まで <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,
DRBDMETA, DRBDADM, DRBD User’s Guide [1] , DRBD web site [3]
NOTES
1. DRBD User’s Guide http://www.drbd.org/users-guide/
2. DRBD’s online usage counter http://usage.drbd.org
3. DRBD web site http://www.drbd.org/
B.2
DRBDADM
NAME
drbdadm ̶ DRBD の高レベル管理ツール
156
B.2 DRBDADM
SYNOPSIS
DESCRIPTION
Drbdadm は DRBD プログラム群の中で高レベルの管理ツールである。Drbdadm は drbdsetup と drbdmeta
の上位レベルのインタフェースである。これは、ifconfig の ifup/ifdown コマンドに対する関係と同様である。
Drbdadm は設定ファイルを読み込んで、drbdsetup や drbdmeta を呼び出してコマンドを実行する。
drbdadm は全リソース、リソース中のボリュームに対して操作が行える。サブコマンドには次のものがある。
attach、detach、primary、secondary、invalidate、invalidate-remote、outdate、resize、verify、pause-sync、
resume-sync、role、csytate、dstate、create-md、show-gi、get-gi、dump-md、wipe-md。これらは全リソー
スとボリュームに対して機能する。
リソースレベルのみのコマンドには次のものである。connect、disconnect、up、down、wait-connect、dump。
OPTIONS
-d, --dry-run
実行する drbdsetup コマンドを標準出力に書き出すが、実際にコマンドは実行しない。
-c, --config-file file
drbdadm が 使 う 設 定 フ ァ イ ル を 指 定 す る 。こ の パ ラ メ ー タ を 省 略 す る と 、/etc/drbd-84.conf、
/etc/drbd-83.conf、/etc/drbd-08.conf、/etc/drbd.conf が参照される。
-t, --config-to-test file
drbdadm にチェックさせる設定ファイルを指定する。このオプションは、dump コマンドまたは sh-nop コ
マンドと共に使用する場合のみ有効である。
-s, --drbdsetup file
drbdsetup プログラムのフルパスを指定する。省略すると、自身のコマンド配置場所配下と、$PATH が参
照される。
-m, --drbdmeta file
drbdmeta プログラムのフルパスを指定する。省略すると、自身のコマンド配置場所配下と、$PATH が参
照される。
-S, --stacked
積み重ねた上位リソースに対する操作を指示する場合に指定する。
-P, --peer
どの対向ノードと接続するかを指定する。リソースの定義に 3 台以上のホストを指定した場合にのみ必要で
ある。
-- backend-options
二重ハイフンの後に続くオプションはすべて backend-options として認識される。これらはバックエンドコ
マンドに渡される。つまり drbdsetup、drbdmeta、drbd-proxy-ctl などに渡される。
157
付録 B
DRBD system manual pages
COMMANDS
attach
RBD リソースに対応する低レベルのローカルブロックデバイスを接続する。
detach
DRBD リソースデバイスから下位ストレージデバイスを切り離す。
connect
リソースデバイスに対するネットワーク設定を有効にする。対応する接続先がすでに設定されていれば、2
台の DRBD デバイスは相互に接続される。リソース定義中に 3 台以上のホストを指定してある場合、接続
先ホストを指定するために -peer も指定する必要がある。
disconnect
リソースに対するネットワーク設定を無効にする。デバイスは当然ながらスタンドアローン状態になる。
syncer
デバイスの再同期に関するパラメータを読み込む。
up
attach と connect の両方を実行するショートカット。
down
disconnect と detach の両方を実行するショートカット。
primary
リソースのデバイスをプライマリ状態に昇格する。DRBD が管理するデバイスにファイルシステムを作成
したりそれをマウントする前に、必ずこのコマンドを実行する必要がある。
secondary
デバイスをセカンダリ状態に切り替える。接続された DRBD デバイスペアのどちらか一方しかプライマリ
状態になれないので、このコマンドが必要である (設定ファイル中に allow-two-primaries が明示的に指定
されている場合を除く)。
invalidate
ローカル下位デバイスが不整合になったと DRBD に判断させる。したがって、両デバイスが同期状態にな
るよう、DRBD はすべてのブロックを他方のノードからコピーする。このとき、レプリケーションリンクを
確立させておく必要があり、さもなくば disconnected Secondary の状態になる。
invalidate-remote
invalidate コマンドに似ているが、対向ノードの下位デバイスが非同期状態になったとみなす。したがって、
ローカルノードのデータが他ノードにコピーされる。このとき、レプリケーションリンクを確率させておく
158
B.2 DRBDADM
必要があり、そうでないと disconnected Primary の状態になる。
resize
DRBD にディスクサイズ関連の状態を再評価させ、必要ならデバイスのサイズを変更する。例えば両ノード
で下位デバイスのサイズを拡張した場合には、どちらか一方のノードでこのコマンドを実行した後で、DRBD
は新しいサイズを受け入れる。新しいストレージ領域は同期される必要があるため、最低でも 1 つのプライ
マリノードが存在する場合にのみ、このコマンドは機能する。
-size オプションは DRBD デバイスで使用できるサイズのオンライン縮小に使用される。ファイルシステム
がこの操作によって破損しないことはユーザ責任において確認する。
-assume-peer-has-space オプションは、現在対向ノードに接続されていないデバイスのサイズ変更ができ
る。対向ノードのディスクサイズを同様に変更しないと、以降接続が失敗するので注意すること。
-assume-clean オプションは、既存のデバイスのサイズを変更し、新しい領域の同期を回避できる。空のス
トレージをデバイスに追加する場合に有用である。
例:
# drbdadm -- --assume-clean resize r0
-al-stripes と -al-stripe-size-kB オプションはオンラインでアクティビティログのレイアウトを変更す
る。内部メタデータの場合には、同時に、下位デバイスのユーザーに見えるサイズ (-size を使用して) の縮小、ま
たは拡大が必要である。
check-resize
内部メタデータの移動のために drbdmeta を呼び出す。DRBD の停止中に下位デバイスのサイズが変更さ
れた場合、次回の attach コマンドが成功するように、メタデータをデバイスの最後に移動する必要がある。
create-md
メタデータ領域を初期化する。DRBD リソースを初めて利用する場合、オンラインにする前にこのコマン
ドを実行する必要がある。問題が起きた場合には DRBDSETUP を参照。
get-gi
データ世代識別子の情報を簡潔なテキスト情報として表示する。
show-gi
データ世代識別子の情報を、説明テキストとともにテキスト情報として表示する。
dump-md
メタデータの全内容をテキスト形式でダンプする。ダンプにはビットマップとアクティビティログも含ま
れる。
outdate
メタデータに outdated フラグをたてる。
adjust
159
付録 B
DRBD system manual pages
設定ファイルの設定値にしたがってデバイスの設定状態を調整する。実際に実行する前に、あらかじめ dry-run
モードを実行して、得られた出力を吟味すべきである。
wait-connect
他ノードのデバイスと接続するまで待機する。
role
自機および対向ノードのデバイスの現在の役割を"自機/対向ノード"の形式で表示する。例 Primary/Secondary
state
廃止された"role"の別名。前項を参照。
cstate
両ノードのデバイスの接続状態を表示する。
dump
設定ファイルを解析して標準出力に出力する。設定ファイルの構文上の修正を行うときに有用である。
outdate
ノードのデータ状態を outdated(無効) にする。通常は、他ノードの fence-peer ハンドラによってセットさ
れる。
verify
オンライン照合を開始する。両ノードのデータが比較され、不整合がないか検査される。進行状況は/proc/drbd
に表示される。非同期ブロックが見つかった場合でも、再同期は自動的には行われない。再同期するには、
検査の終了後に disconnect してから connect する。DRBD.CONF のデータ整合性に関する説明も参照の
こと。
pause-sync
ローカルメタデータの一時停止フラグをセットして、進行中の再同期を一時停止する。再開させるには、ロー
カルと他ノードの両方の一時停止フラグをクリアする必要がある。下位デバイスの RAID を再構成している
場合などに、一時的に DRBD の再同期を停止できる。
resume-sync
自機の一時停止フラグをクリアする。.
new-current-uuid
新しいカレント UUID を生成し、他のすべての UUID をローテートする。初期同期時間を短縮するために
このコマンドを利用できる。詳細については DRBDSETUP を参照。
dstate
下位デバイスの同期状況を表示する (local/peer)。
160
B.3 DRBDSETUP
hidden-commands
このマニュアルに記載されていない全部のコマンドを表示する。
VERSION
このドキュメントは DRBD バージョン 8.4.0 向けに改訂されている。
AUTHOR
Philipp Reisner: philipp.reisner@linbit.com、Lars Ellenberg: lars.ellenberg@linbit.com
REPORTING BUGS
バグについては右記まで <drbd-user@lists.linbit.com>.
COPYRIGHT
Copyright 2001-2011 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.CONF, drbd(8), drbddisk(8), DRBDSETUP, DRBDMETA and the DRBD project web site [1]
==== NOTES 1. DRBD project web site http://www.drbd.org/
B.3
DRBDSETUP
NAME
drbdsetup ̶ DRBD を設定するツール
SYNOPSIS
drbdsetup new-resource resource [--cpu-mask {val}] [--on-no-data-accessible {io-error |
suspend-io}]
drbdsetup new-minor resource minor volume
drbdsetup del-resource resource
drbdsetup del-minor minor
drbdsetup attach minor lower_dev meta_data_dev meta_data_index [--size {val}]
[--max-bio-bvecs {val}] [--on-io-error {pass_on | call-local-io-error | detach}] [--fencing
{dont-care | resource-only | resource-and-stonith}] [--disk-barrier] [--disk-flushes]
[--disk-drain] [--md-flushes] [--resync-rate {val}] [--resync-after {val}] [--al-extents
{val}] [--al-updates] [--c-plan-ahead {val}] [--c-delay-target {val}] [--c-fill-target {val}]
[--c-max-rate {val}] [--c-min-rate {val}] [--disk-timeout {val}] [--read-balancing
{prefer-local | prefer-remote | round-robin | least-pending | when-congested-remote |
32K-striping | 64K-striping | 128K-striping | 256K-striping | 512K-striping | 1M-striping}]
drbdsetup connect resource local_addr remote_addr [--tentative] [--discard-my-data]
[--protocol {A | B | C}] [--timeout {val}] [--max-epoch-size {val}] [--max-buffers {val}]
[--unplug-watermark {val}] [--connect-int {val}] [--ping-int {val}] [--sndbuf-size {val}]
[--rcvbuf-size {val}] [--ko-count {val}] [--allow-two-primaries] [--cram-hmac-alg {val}]
[--shared-secret {val}] [--after-sb-0pri {disconnect | discard-younger-primary |
discard-older-primary | discard-zero-changes | discard-least-changes | discard-local |
discard-remote}] [--after-sb-1pri {disconnect | consensus | discard-secondary |
161
付録 B
DRBD system manual pages
call-pri-lost-after-sb | violently-as0p}] [--after-sb-2pri {disconnect |
call-pri-lost-after-sb | violently-as0p}] [--always-asbp] [--rr-conflict {disconnect |
call-pri-lost | violently}] [--ping-timeout {val}] [--data-integrity-alg {val}] [--tcp-cork]
[--on-congestion {block | pull-ahead | disconnect}] [--congestion-fill {val}] [--congestionextents {val}] [--csums-alg {val}] [--csums-after-crash-only] [--verify-alg {val}]
[--use-rle] [--socket-check-timeout {val}]
drbdsetup disk-options minor [--on-io-error {pass_on | call-local-io-error | detach}]
[--fencing {dont-care | resource-only | resource-and-stonith}] [--disk-barrier]
[--disk-flushes] [--disk-drain] [--md-flushes] [--resync-rate {val}] [--resync-after {val}]
[--al-extents {val}] [--al-updates] [--c-plan-ahead {val}] [--c-delay-target {val}]
[--c-fill-target {val}] [--c-max-rate {val}] [--c-min-rate {val}] [--disk-timeout {val}]
[--read-balancing {prefer-local | prefer-remote | round-robin | least-pending |
when-congested-remote | 32K-striping | 64K-striping | 128K-striping | 256K-striping |
512K-striping | 1M-striping}]
drbdsetup net-options local_addr remote_addr [--protocol {A | B | C}] [--timeout {val}]
[--max-epoch-size {val}] [--max-buffers {val}] [--unplug-watermark {val}] [--connect-int
{val}] [--ping-int {val}] [--sndbuf-size {val}] [--rcvbuf-size {val}] [--ko-count {val}]
[--allow-two-primaries] [--cram-hmac-alg {val}] [--shared-secret {val}] [--after-sb-0pri
{disconnect | discard-younger-primary | discard-older-primary | discard-zero-changes |
discard-least-changes | discard-local | discard-remote}] [--after-sb-1pri {disconnect |
consensus | discard-secondary | call-pri-lost-after-sb | violently-as0p}] [--after-sb-2pri
{disconnect | call-pri-lost-after-sb | violently-as0p}] [--always-asbp] [--rr-conflict
{disconnect | call-pri-lost | violently}] [--ping-timeout {val}] [--data-integrity-alg {val}]
[--tcp-cork] [--on-congestion {block | pull-ahead | disconnect}] [--congestion-fill {val}]
[--congestion- extents {val}] [--csums-alg {val}] [--csums-after-crash-only] [--verify-alg
{val}] [--use-rle] [--socket-check-timeout {val}]
drbdsetup resource-options resource [--cpu-mask {val}] [--on-no-data-accessible {io-error |
suspend-io}]
drbdsetup disconnect local_addr remote_addr [--force]
drbdsetup detach minor [--force]
drbdsetup primary minor [--force]
drbdsetup secondary minor
drbdsetup down resource
drbdsetup verify minor [--start {val}] [--stop {val}]
drbdsetup invalidate minor
drbdsetup invalidate-remote minor
drbdsetup wait-connect minor [--wfc-timeout {val}] [--degr-wfc-timeout {val}]
[--outdated-wfc-timeout {val}] [--wait-after-sb {val}]
drbdsetup wait-sync minor [--wfc-timeout {val}] [--degr-wfc-timeout {val}]
[--outdated-wfc-timeout {val}] [--wait-after-sb {val}]
drbdsetup role minor
drbdsetup cstate minor
drbdsetup dstate minor
drbdsetup resize minor [--size {val}] [--assume-peer-has-space] [--assume-clean]
[--al-stripes {val}] [--al-stripe-size-kB {val}]
drbdsetup check-resize minor
drbdsetup pause-sync minor
drbdsetup resume-sync minor
drbdsetup outdate minor
drbdsetup show-gi minor
drbdsetup get-gi minor
drbdsetup show {resource | minor | all}
drbdsetup suspend-io minor
drbdsetup resume-io minor
drbdsetup events {resource | minor | all}
drbdsetup new-current-uuid minor [--clear-bitmap]
DESCRIPTION
drbdsetup は、DRBD デバイスと下位レベルブロックデバイスを結びつける、DRBD デバイス間で下位レベ
ルデバイス同士ミラーリングを設定する、現在実行中の DRBD デバイスの設定を検査する、などの目的で使用
する。
162
B.3 DRBDSETUP
NOTE
drbdsetup は DRBD プログラム群の中で低レベルのツールである。デバイスドライバを操作するために、
drbddisk や drbd スクリプトなどの中で使用される。
COMMANDS
サブコマンドの中には、独自の引数やオプションを持つものがある。すべての値はデフォルトの単位があるが、
K、M、G といった通常の方法でも定義できる (K=2^10=1024、M=1024K、G=1024M)。
共通オプション
すべての drbdsetup サブコマンドに次のオプションを指定することができる。
--create-device
指定した DRBD デバイスに対応するデバイスファイルがない場合、自動的に作成するするよう指定する。
new-resource
リソースは DRBD 構成の最初の対象である。リソースはいかなるボリュームやマイナーデバイスが作成さ
れるより前に new-resource コマンドで作成されなければならない。コネクションは名前で参照される。
new-minor
minor は複製されたブロックデバイスと同じ意味で使われ、ブロックデバイスとして /dev ディレクトリで
表示されている。これは DRBD が複製するブロックデバイスへのアプリケーションのインターフェースで
ある。drbdsetup のコマンドラインで、これらのブロックデバイスはマイナー番号によってアドレス指定さ
れる。複製されたブロックデバイスの組は 2 マシン間で異なったマイナー番号を持つ場合もあるが、共通の
ボリューム番号で関連付けされている。ボリューム番号は各々の接続におけるローカルなものである。マイ
ナー番号は一つのノードにおけるグローバルなものである。
del-resource
リソースのオブジェクトを破棄する。リソースに値がない場合のみ可能。
del-minor
マイナーはディスクが外されている場合のみ破棄できる。
attach、disk-options
Attach はデバイスと下位ブロックデバイスを接続する。-d (または -disk-size) は下位ブロックデバイス
をできるだけ使いたくない場合にのみ使用する。-d を使わない場合、デバイスは対向ノードに接続されると
すぐに使用できる状態になる (net コマンドを参照)。
disk-options コマンドを使うと、接続されている間、そのマイナーのオプション変更ができる。
オプションは以下のとおり。
--disk-size size
DRBD は利用できるデータ領域を自動的に決定する機能を持つ。これまで対向ノードに接続したこと
のないデバイスを使用する場合に、DRBD デバイスのサイズをドライバに渡すためにこのオプションを
使用する。デフォルトの単位はセクタ (1s=512 バイト) である。size パラメータを drbd.conf で使用す
163
付録 B
DRBD system manual pages
る場合には、明示的に単位を追加する事が推奨される。drbdadm と drbdsetup はデフォルトの単位で、
しばしば食い違いになることがある。
--on-io-error err_handler
下位デバイスのドライバがエラーを伝えた場合に DRBD はディスクを不整合とマークする。そしてヘ
ルパープログラムを呼び出すか、デバイスを下位ストレージから切り離して以後の I/O を対向ノードに
委ねる。err_handlers に指定できる値は、pass_on、call-local-io-error、detach である。
--fencing fencing_policy
fencing は、2 つのノードがともにプライマリになること (スプリットブレイン) を防止し、どちらかを
切り離す防御手段のことである。
次のフェンシングポリシーを指定できる。
dont-care
デフォルトの設定値で、フェンシングのためのアクションをなにも実行しない。
resource-only
ノードが切り離されたプライマリ状態になると、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 を復旧させることができる。
--disk-barrier、--disk-flushes、--disk-drain
DRBD は下位デバイスに対する複数のディスク書き込みの間の依存関係を指定するための 4 種類のオ
プションを用意している。そのうち、下位デバイスがサポートしていてユーザが無効に設定していない
最初のオプションが使用される。デフォルトでは flush が使用される。
drbd-8.4.2 から disk-barrier は、inux-2.6.36 (及び RHEL6 の 2.6.32) 以降での正常動作が確認できな
いためデフォルトで無効になった。注意 有識者による指示のもとでのみ使用すること。
手法を選択するにあたっては、測定可能なパフォーマンスデータのみに頼るべきではない。下位デバイ
スが揮発性の書き込みキャッシュしか持たない場合 (通常のハードディスクや通常のハードディスクだ
けで構成される RAID など)、以下の最初の 2 つのオプションを指定すべきである。下位デバイスにバッ
テリバックアップ機能付きの書き込みキャッシュがある場合には、3 番目のオプションが利用できる。
4 番目のオプション (すべてを無効にする場合は "none") は、ほとんどの I/O スタックにおいて危険
で、ディスクへの書き込み順序が入れ替わってしまう可能性がある。そうなると、理論的にはデータ破
損の原因、または DRBD プロトコルを乱し、再接続と切断を繰り返すような状態に陥る可能性がある。
164
B.3 DRBDSETUP
no-disk-drain を使ってはならない。残念なことに、デバイスマッパ (LVM) はバリアをサポートしてい
ない。/proc/drbd 出力の "wo:" の後ろに下位デバイスに対する現在の設定が b、f、d、n という文字
で表示される。
オプションは次のとおり。
barrier
下位デバイスがバリア (SCSI では"tagged command queuing"、SATA では"native command
queuing"と呼ばれる) をサポートしている場合、このオプションを選択できる。このオプション
を有効にするには disk-barrier オプションを yes にする。
flush
下位デバイスがディスクフラッシュ (ベンダーは"force unit access"と呼んでいる) をサポートして
いる場合、このオプションを選択できる。このオプションは disk-flushes を no に設定する。
drain
最初の書き込みは次の書き込みリクエストを処理する前に完了しなければならない。8.0.9 まではこ
のオプションが唯一の処理方法であった。
none
-no-disk-drain を指定すると、下位デバイスへの書き込みの依存関係を一切指示しなくなる。これ
はほとんどの I/O スタックにおいて危険であり、ディスクへの書き込み順序が入れ替わってしまう
可能性がある。そうなると、理論的にはデータ破損の原因、または DRBD プロトコルを乱し、再
接続と切断を繰り返すような状態に陥る可能性がある。-no-disk-drain を使ってはならない。
--md-flushes
メタデータデバイスへのアクセスにあたってバリアやフラッシュを使用しない。-disk-flushes の説明を
参照。
--max-bio-bvecs
ある特別な環境において、デバイスマッパースタックが DRBD に BIOs を渡すときに、DRBD の
merge_bvec() 関数によって設定された制約条件に反して 2 つ以上の bvec で構成される BIO を渡して
しまうことがある。たとえば、物理ディスク→ DRBD → LVM → Xen →誤ったパーティション (63)
→ DomU FS といった場合である。このときカーネルログには、"bio wouldneed to, but cannot, be
split:"と記録される。
最も良い回避方法は、VM の内部でパーティションを適切に配置する (たとえば、セクタ 1024 から開始す
る) ことである。これは、ストレージ領域を 480KiB 消費する。奇数 (典型的には 63) からパーティションを
開始する Linux パーティショニングツールが残っているため、仮想マシン上の Linux のパーティションの
配置が誤ってしまうことがある。第2の解決方法は、BIO あたりの最大 DRBD bvecs(=max-bio-bvecs)
を 1 にすることである。しかし、パフォーマンスは低下する。
max-bio-bvecs のデフォルト値は 0 で、これはユーザが設定した制約条件が存在しないことを意味する。
--resync-rate rate
165
付録 B
DRBD system manual pages
DRBD の上位レイヤの円滑な実行のために、バックグラウンドの同期作業が利用する帯域幅を制限でき
る。デフォルト値は 250KiB/秒。
--resync-after minor
minor に指定したマイナー番号を持つデバイスが接続されると、このデバイスの再同期を開始する。接
続されるまでの間は SyncPause 状態になる。
--al-extents extents
DRBD はホットエリア (アクティブセット) を自動的に検出できる。このパラメータを指定すると、ホッ
トエリアの大きさを制御できる。各エクステントは、下位デバイスの 4M の領域になる。予定外の事情
によってプライマリノードがクラスタから切り離されると、そのときのホットエリアのデータは、次回
接続したときの再同期の対象になる。このデータ構造は、メタデータ領域に書き込まれる。したがって、
ホットエリアの状態更新は、メタデータデバイスへの書き込みを引き起こす。エクステント値を大きくす
ると、再同期所要時間が長くなるが、メタデータの更新頻度を減らすことができる。extents のデフォル
ト値は 1237 である (最小値: 7、最大値: 65534)。追加の制限と必要な準備については、DRBD.CONF
と DRBDMETA を参照。
--al-updates {yes | no}
DRBD のアクティビティログ処理の書き込みにより、プライマリノードのクラッシュ後に、up-to-date
に戻すに足る部分的な再同期 (ビットマップベース) が可能になる。al-updates を no に設定すると通常
の運用パフォーマンスが向上するかもしれないが、クラッシュ時にプライマリが再接続した際にはフル
同期となる。デフォルト値は yes 。
--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(100ms) で、0.1 秒単位で指定する。max_rate
のデフォルトは 10240(100MiB/s) で KiB/s 単位で指定する。
--c-min-rate min_rate
再同期の際、ディスク I/O 速度を監視すると、下位レベルデバイスが再同期していないことがわかる。
下位レベルデバイスがビジーで、再同期速度が min_rate を超えている場合、非同期の処理を調整する。
min_rate のデフォルト値は 4M で、k 単位で指定する。調整したくない場合は 0 を設定する。常に調
整する場合は 1 を設定する。
166
B.3 DRBDSETUP
-t, --disk-timeout disk_timeout
DRBD デバイスがデータを格納する下位レベルデバイスが、指定した disk-timeout 内で I/O リクエス
トを完了しなかった場合、DRBD はこれを障害とみなす。下位デバイスは切り離され、デバイスのディ
スク状態はディスクレス状態になる。DRBD が 1 台または複数の対向ノードに接続したとき、失敗し
たリクエストはそのうちの 1 台に伝えられる。このオプションはカーネルパニックを引き起こす可能性
があり、注意が必要 である。リクエストの「中断」あるいはディスクの強制切り離しは、完全に下位
デバイスをブロックまたはハングして、リクエストをまったく処理せずエラーも処理しなくなる。この
状況ではハードリセットとフェイルオーバ以外になす術がない。「中断」すると、基本的にローカルエ
ラーの完了を装い、すみやかにサービスの移行を行うことで安全な切り替えを行う。それでもなお、影
響を受けるノードは"すぐ"に再起動される必要がある。リクエストを完了することで、上位レイヤーに
関連するデータページを再利用させることができる。後にローカルの下位デバイスが「復帰」すると、
ディスクから元のリクエストページへの DMA のデータは、うまくいくと未使用のページへランダムな
データを送るが、多くの場合その間に関係のないデータに変形してしまい、様々なダメージの原因にな
る。つまり遅延した正常な完了は、特に読み込みリクエストの場合 panic() の原因になる。遅延した
「エラー」完了は、その都度に通知は行うが、問題ないと考えてよい。disk-timeout のデフォルト値は
0 であり、無限のタイムアウトを意味する。タイムアウトは 0.1 秒単位で指定する。このオプションは
DRBD 8.3.12. から利用できる。
--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. か
ら有効である。
connect、net-options
Connect は device を af:local_addr:port の内向きのコネクションを Listen させ、また af:remote_addr:port
へ接続させる。port が省略されると、デフォルトで 7788 が使用される。af が省略されると ipv4 が使用され
る。他の対応するアドレスファミリは ipv6、ssocks、sdp がある。ssocks は Dolphin Interconnect Solutions
の「super sockets」、sdp は Sockets Direct Protocol(Infiniband) を指す。net-options コマンドはコネク
ションの確立中にオプションの変更が行える。
--protocol protocol
TCP/IP 通信の際に使用されるプロトコルを指定する。protocol には A、B または C を指定する。
プロトコル A
ローカルディスクとローカル TCP 送信バッファにデータが到達したら、ディスクへの書き込みが
完了したと判断する。
プロトコル B
ローカルディスクとリモートバッファキャッシュにデータが到達したら、ディスクへの書き込みが
完了したと判断する。
プロトコル C
167
付録 B
DRBD system manual pages
ローカルディスクとリモートディスクの両方にデータが到達したら、ディスクへの書き込みが完了
したと判断する。
--connect-int time
対向ノードにただちに接続できない場合、DRBD は接続を繰り返し試行する。このパラメータは試行間
隔を指定する。デフォルト値は 10 で、単位は秒。
--ping-int time
DRBD デバイス間の TCP/IP 接続があり、対向ノードが time 秒の間に何も通信が行われなかった場
合、DRBD は死活確認のためキープアライブパケットを生成する。デフォルト値は 10 で、単位は秒。
--timeout val
対向ノードからの応答パケットが 1/10 秒 (0.1 秒) を val 倍した時間以内に返ってこない場合、対向ノー
ドが死んだと判断して、TCP/IP コネクションを切断する。デフォルト値は 60 で、これは 6 秒に相当
する。すなわち、このパラメータの単位は 0.1 秒。
--sndbuf-size size
ソケット送信バッファは、セカンダリノードに送信するパケットを格納するために使われる。この中の
パケットは、ネットワーク的にはセカンダリ側から受信確認を受け取っていない。プロトコル A を使う
場合は、両ノード間の同期を高めるために、このバッファサイズを増やす必要が生じる可能性がある。
しかし、プライマリノードがフェイルしたときに失うデータが増えることも考慮しておく必要がある。
8.0.13 から 8.2.7 では、size に 0 を指定すると、カーネルの自動調整に任せることになる。デフォルト
の size は 0。
--rcvbuf-size size
ネットワークから受信したパケットは、最初にソケットの受信バッファに保存される。DRBD はこれを
利用する。8.3.1 以前は、ソケット受信バッファのサイズはソケット送信バッファと同じサイズに固定さ
れていた。8.3.2 からこれらを別々に設定できるようになっている。size に 0 を指定するとカーネルが
自動的に設定する。デフォルトの size は 0 である。
--ko-count count
セカンダリノードが書き込みリクエストを timeout 内で count 回以上失敗した場合、そのセカンダリ
ノードはクラスタから排除され、プライマリノードは StandAlone モードに遷移する。デフォルト値は
バージョンによって異なる (8.3 では 0、8.4 では 7)。設定値が 0 の場合、本機能が無効になることを意
味する。
--max-epoch-size val
このオプションを指定すると、バリアとバリアの間の書き込みリクエスト数の最大値を制限できる。
-max-buffers と同じ値か、取りうる最大値を指定するのが望ましい。10 より小さい値は、パフォーマ
ンス低下をもたらす。デフォルト値は 2048 である。
--max-buffers val
168
B.3 DRBDSETUP
DRBD 受信スレッドに割り当てるバッファページの最大値を指定する。-max-epoch-size と同じ値を指
定するのが望ましい。小さい値はパフォーマンス低下をもたらすデフォルト値は 2048 で、最小は 32 で
ある。リニア書き込みや一方がアイドル状態での再同期の際、受け取り側の I/O バックエンドに余裕が
ある場合にはこの値を増やすのがよい。DRBD.CONF を参照。
--unplug-watermark val
この設定は、最近の明示的にスタックプラギングを使用するカーネルには効果がない (Linux kernel 2.6.39
には移植されている)。セカンダリノード上に書き込まれていない書き込みリクエスト数がこの値を上回
ると、下位デバイスに対して書き込みリクエストを送る。ストレージによっては小さい値でも良好な結
果が得られるが、多くのデバイスでは max-buffers と同じ値を指定するときに最良の結果が得られる。
しかしまったく効果が得られないものもある。デフォルト値は 128 で、指定できる最小値は 16、最大値
は 131072 である。
--allow-two-primaries
このオプションを指定すると、両ノードにプライマリを割り当てられる。このオプションは分散共有ファ
イルシステムを使うときのみ指定する。現在 DRBD がサポートするファイルシステムは OCFS2 と GFS
である。これら以外のファイルシステムを使うときにこのオプションを指定すると、データの破損とノー
ドのダウンを引き起こす。
--cram-hmac-alg alg
対向ノードの認証を行いたい場合、HMAC アルゴリズムを指定する。対向ノードの認証は行うべきである。
チャレンジ-レスポンス方式で対向ノードを認証するのに、HMAC アルゴリズムが使われる。/proc/crypto
に記録されている任意のダイジェストアルゴリズムを指定できる。
--shared-secret secret
対向ノードの認証に使う 64 文字までの共有秘密
を指定する。64 文字まで指定可能。
--after-sb-0pri asb-0p-policy
指定できるポリシーは以下の通り:
disconnect
自動再同期を行わず接続を切断する。
discard-younger-primary
スプリットブレイン発生 前 にプライマリだったノードからの再同期を自動的に実行する。
discard-older-primary
スプリットブレイン発生 時 にプライマリになったノードからの再同期を自動的に実行する。
discard-zero-changes
スプリットブレイン発生後どちらか一方のノードに書き込みがまったく行われなかったことが明白
な場合、書き込みが行われたノードから行われなかったノードに対する再同期が実行される。どち
169
付録 B
DRBD system manual pages
らも書き込まれなかった場合は、DRBD はランダムな判断によって 0 ブロックの再同期を実行す
る。両ノードに書き込みが行われた場合、このポリシーはノードの接続を切断する。
discard-least-changes
スプリットブレイン発生後、より多くのブロックを書き込んだノードから他方に対する再同期を実
行する。
discard-node-NODENAME
指定した名前のノードに対する再同期を実行する。
--after-sb-1pri asb-1p-policy
指定できるポリシーは以下の通り:
disconnect
自動再同期を行わず接続を切断する。
consensus
after-sb-0pri アルゴリズムの結果が現在のセカンダリノードのデータを壊すことになる場合、セカ
ンダリノードのデータを廃棄する。そうではない場合は接続を切断する。
discard-secondary
セカンダリ側のデータを捨てる。
call-pri-lost-after-sb
after-sb-0pri アルゴリズムの判断を常に採用する。セカンダリ側のデータが正しいと判断された場
合には、現在のプライマリ側で pri-lost-after-sb ハンドラが呼び出される。
violently-as0p
after-sb-0pri アルゴリズムの判断を常に採用する。現在のセカンダリ側が正しいデータを保持して
いるという結論になった場合でも、プライマリ側のデータの変更箇所を受け入れる。
--after-sb-2pri asb-2p-policy
指定できるポリシーは以下の通り:
disconnect
自動再同期を行わず接続を切断する。
call-pri-lost-after-sb
after-sb-0pri アルゴリズムの判断を常に採用する。セカンダリ側のデータが正しいと判断された場
合には、現在のプライマリ側で pri-lost-after-sb ハンドラが呼び出される。
violently-as0p
after-sb-0pri アルゴリズムの判断を常に採用する。現在のセカンダリ側が正しいデータを保持して
170
B.3 DRBDSETUP
いるという結論になった場合でも、プライマリ側のデータの変更箇所を受け入れる。
--always-asbp
3 番目のノードが存在しないことが現在の UUID 値から明らかな場合、通常のスプリットブレイン発生
後の修復ポリシーだけが適用される。このオプションを指定すると、両ノードのデータに関連性がある
と認められる場合のみ、通常のスプリットブレイン発生後のポリシーが適用される。UUID の分析によ
り 3 番目のノードの存在が疑われる場合や、なんらかの別の原因によって間違った UUID セットで判断
してしまった場合には、フル同期が行われることがある。
--rr-conflict role-resync-conflict-policy
同期先ノードがプライマリ状態のときに、いつ再同期を実行すべきかの判断方法を制御する。設定で
きる値は、disconnect、call-pri-lost、violently である。disconnect は接続を切断する。call-pri-lost は
pri-lost ハンドラを呼び出す。このハンドラは、ノードの状態をセカンダリに切り替えるか、あるいはノー
ドをクラスタから切り離す処理を実行するべきである。デフォルト値は disconnect である。violently
を指定すると、プリマリノードを強制的に同期先 (SyncTarget) にできる。このオプションを指定する
と、即座に同期元 (SyncSource) のデータに書き換えられる。このオプションは、何をしているのかを
理解した上で 使用するように。
--data-integrity-alg hash_alg
ネットワーク経由で受け渡されるデータの整合性を担保するために、DRBD はハッシュ値を比較する機
能を備えている。通常は、TCP/IP パケット自体のヘッダに含まれる 16 ビットチェックサムで保証さ
れる。オプション値には、カーネルがサポートする任意のダイジェストアルゴリズムを指定できる。一
般的なカーネルの場合、少なくとも md5、sha1、crc32c のどれかが利用できる。デフォルトでは、この
機能は無効である。DRBD.CONF のデータ整合性に関する説明も参照のこと。
--no-tcp-cork
DRBD は、TCP ソケットの TCP_CORK オプションを使って、いつ追加データを受け取るか、ある
いは送信キューのデータをいつフラッシュするかのヒントを得ている。この方法が悪影響を及ぼすネッ
トワークスタックが少なくとも存在する。このオプションを指定すると、TCP_CORK ソケットオプ
ションのセットやリセットが無効になる。
--ping-timeout ping_timeout
キープアライブパケットに対して対向ノードが応答しなければならない猶予時間を設定する。応答パケッ
トが返ってこない場合、その対向ノードは死んだと判断される。デフォルト値は 5(500ms) で、100ms
単位で指定する。
--discard-my-data
スプリットブレイン状態から復旧するときに、このオプションを手作業で指定する。自動的な復旧ポリ
シーを設定していない場合には、DRBD は接続を拒否する。このオプションを実行すると、そのノード
は接続後ただちに同期先になる。
--tentative
171
付録 B
DRBD system manual pages
再同期を実行させない場合などにおいて、再同期ハンドシェーク後に DRBD 接続プロセスを終了させ
る。DRBD がどの再同期を実行しているかについては、カーネルログで確認することができる。
--on-congestion congestion_policy 、--congestion-fill fill_threshold 、--congestion-extents
active_extents_threshold
デフォルトでは、TCP 送信キューが一杯になると、DRBD は書き込みをブロックする。このことは
DRBD が TCP で送信できるデータ量を越えてディスクに書きこもうとするアプリケーションの処
理速度が低下することを意味する。DRBDProxy を使っている場合、送信キューが満杯になる直前に
AHEAD/BEAIND モードに移行するのが望ましい。AHEAD/BEHIND モードでは、DRBD 間の通信
は切断しないが、データレプリケーションは行われなくなる。AHEAD/BEHIND モードの利点は、たと
え DRBDProxy のバッファがすべての書き込み要求を受け入れるのに十分でなくても、アプリケーション
が遅くならないことである。欠点は、対向ノードが後れをとっているため、同期状態に戻すために再同期
が必要になることである。再同期中対向ノードのデータは不整合状態のままとなる。congestion_policy
では、block と pull-ahead が使用できる。デフォルト値は block である。fill_threshold は 0 から 10GiB
までの値を指定できる。デフォルト値は 0 で、これはチェックが無効になることを意味する。active_
extents_threshold は、al-extents と同じ制限がある。AHEAD/BEHIND モードは DRBD8.3.10. 以降
で利用できる。
--verify-alg hash-alg
verify サブコマンドでディスク内容をオンライン照合する際、DRBD はビット単位の比較ではなく、ブ
ロックごとのハッシュ値を計算し、対向ノードのハッシュ値と比較する。照合に利用するハッシュアル
ゴリズムは、このパラメータで指定する。オプション値には、カーネルがサポートする任意のダイジェ
ストアルゴリズムを指定できる。一般的なカーネルの場合、少なくとも md5、sha1、crc32c のどれか
が利用できる。デフォルトでは、この機能は無効である。オンライン照合を有効にするには、このパラ
メータを明示的に設定する必要がある。DRBD.CONF のデータ整合性に関する説明も参照のこと。
--csums-alg hash-alg
csums-alg が指定されていない場合、再同期プロセスはすべてのマークされたデータブロックをコピー元
からコピー先に転送する。このオプションを指定すると、マークされたデータブロックのハッシュ値を
最初に送り、ハッシュ値が一致しないブロックについてのみデータを転送する。帯域幅が小さい回線を
使うとき、このオプションは有用である。クラッシュしたプライマリノードが復帰したとき、アクティ
ビティログに記録されたすべてのブロックが再同期の対象となる。しかし大部分のブロックは同期が取
れている。このため、csums-alg を指定することによって、CPU の使用量と引き換えに必要な転送量を
減らせる。
--use-rle
再同期開始時のハンドシェークの過程で各ノードのビットマップが交換され、ビット単位の OR 計算が
行われる。これによって、どのブロックがダーティ (不一致) であるかについて、それぞれのノードは共
通の認識を持つ。大容量デバイスではビットマップも大きくなり、バンド幅が小さいネットワークではそ
の交換に時間を要する。大容量デバイスではビットマップも大きくなり、帯域幅が小さいネットワーク
ではその交換に時間を要する。典型的なビットマップは、すべてがセットされていない (クリーン)、あ
るいはセットされている (ダーティ) いくつかのエリアに分かれている。このため、単純ではあるがラン
172
B.3 DRBDSETUP
レングス符号化を採用することにより、ビットマップ交換のためのネットワークトラフィックを顕著に
減らすことができる。過去のバージョンとの互換性のため、また高速ネットワークでは転送時間改善効
果が少なく CPU 使用量が増えるため、デフォルトではこの機能は無効である。8.3.2 以降で指定できる。
--socket-check-timeout
DRBD Proxy を使っていて大量のバッファを確保する必要がある環境では ping-timeout に非現実的な
大きな値を指定しなければならないことがある。socket-check-timeout を指定していない場合、TCP コ
ネクションが開始したときに安定するのを待つ局面でも、DRBD は ping-timeout を使ってしまう。こ
のような場合、socket-check-timeout に DRBD と DRBD Proxy 間の round triptime(RTT) を設定す
るとよい。デフォルトの単位は 10 分の 1 秒である。デフォルト値は 0 で socket-check-timeout 値の代
わりに ping-timeout 値を使用する。8.4.5 から導入された。
resource-options
実行中にリソースのオプションを変更する。
--cpu-mask cpu-mask
DRBD カーネルスレッドに対する CPU アフィニティマスクを指定する。cpu-mask のデフォルト値は
0 で、DRBD のカーネルスレッドは利用可能なすべての CPU にまたがって動作する事を表す。この値
は 16 進表現で指定する必要がある。値が大きすぎると切り捨てられる。
--on-no-data-accessible ond-policy
この設定は、ディスクレスモードが発生した際の操作を指定する。設定できるポリシーは io-error と
suspend-io である。ond-policy に suspend-io を設定すると、最後に接続していたデータストレージ
から、もしくは、drbdadm resume-io res コマンドにより、I/O を再開することができる。後者はも
ちろん I/O エラーを発生させる。デフォルトは io-error である。この設定は、DRBD8.3.9 から有効
である。
primary
デバイスをプライマリロールに切り替える。するとアプリケーション (この場合はファイルシステムなど) は
デバイス を読み書きモードでオープンできるようになる。プライマリロールのデバイス に書き込まれたデー
タはセカンダリロールのデバイスにミラーされる。通常の実行状態では、DRBD デバイスペアの両方を同
時にプライマリに切り替えることはできない。-allow-two-primaries オプションを使用すると、DRBD の既
定の仕様を変更して両ノードをプライマリにできる。
--overwrite-data-of-peer
--force のエイリアス。
--force
ローカルディスクの複製物が最新 (UpToDate) でない場合は、プライマリになれない。つまり、データ
が一致しなかったり、古かったりする場合である。このオプションを指定すると、状況に関係なくプラ
イマリに切り替えられる。このオプションは、+ 何をしているのかを理解した上で + 使うように。
secondary
173
付録 B
DRBD system manual pages
デバイス をセカンダリロールに切り替える。何らかのアプリケーション (またはファイルシステム) が書き
込みモードでデバイスをオープンしている間は、この操作は失敗する。DRBD デバイスペアの両方がともに
セカンダリ状態になることは問題なく可能である。
verify
オンライン状態でデバイスを照合する。オンライン照合は、ローカルノードの全ブロックを対向ノードの対
応するブロックと比較することである。照合の進行状況は、/proc/drbd を通じて確認できる。ローカルディ
スクと対向ホストで内容が異なるブロックは、DRBD のディスク上ビットマップに不整合としてマークされ
る。これらは自動的な再同期が行われない。再同期を行うには、いったんリソースの接続を切って再接続す
ればよい。すでにオンライン照合が進行中の場合、(当該ノードが照合を行い) このコマンドは成功する。こ
の場合、start-sector (以下参照) は無視され、stop-sector (以下参照) が採用される。これは照合を終了する
ため、あるいは現在進行中の照合の範囲を更新 / 短縮 / 拡張するために使用される。このコマンドは デバ
イス が接続されているデバイスペアのうちの一つでない場合は失敗する。DRBD.CONF のデータ整合性に
関する説明も参照のこと。
--start start-sector
バージョン 8.3.2 以降でこのオプションが利用できる。接続が切れて復旧したとき、オンライン照合は
直前の最後の位置から再開する。このオプションを指定すると、任意の位置から照合を開始できる。以
前に stop-sector に達した事があり、明示的に start-sector を指定しない場合には、照合は以前の停止
セクタから再開される。デフォルトの単位はセクタである。単位を明示的に指定することもできる。開
始セクタは 8 セクタの倍数 (4kB) に切り捨てられる。
-S, --stop stop-sector
バージョン 8.3.14 以降では、オンライン照合はデバイスの最後に達する前に終了することができる。デフォ
ルトの単位はセクタである。単位を明示的に指定することもできる。照合が進行中に追加の drbdsetup
verify コマンドを同じノードで実行することで、stop-sector を更新する事ができる。これは照合を終
了するため、あるいは現在進行中の照合の範囲を更新/短縮/拡張するために使用される。
invalidate
接続された DRBD デバイスペアのローカル側を SyncTarget 状態に切り替える。これにより、対向ホスト
側のすべてのデータブロックがローカルディスクにコピーされる。デバイスが対向ホスト側のデバイスと接
続していなかったり、切断されたセカンダリの場合、コマンドは失敗する。
invalidate-remote
接続された DRBD デバイスペアのローカルデバイス側を SyncSource 状態に切り替える。これにより、ロー
カルディスクのすべてのデータブロックが対向ペアにコピーされる。切断されたプライマリデバイス側では、
すべてのビットが非同期のビットマップに設定される。これによってオンディスクのアクティビティログの
更新が一時停止する。アクティビティログの更新が再開すると、必要に応じて自動的再開される。
wait-connect
デバイス が対向デバイスと通信可能になるまで待機する。
--wfc-timeout wfc_timeout 、--degr-wfc-timeout degr_wfc_timeout 、--outdated-wfc-timeout
174
B.3 DRBDSETUP
outdated_wfc_timeout 、--wait-after-sb
デバイス が timeout 秒以内に対向ペアと通信できないと、このコマンドは失敗する。ノードが再起動
する前に対向ノードが動作していた場合、wfc_timeout パラメータの値が使われる。ノードが再起動す
る前に対向ノードがダウンしていた場合には、degr_wfc_timeout パラメータの値が使われる。ノード
が再起動する前に対向ノードが無効にされていた場合には outdated_wfc_timeout パラメータが使われ
る。これらすべてのタイムアウト値のデフォルトは 0 で、接続されるまで永久に待機することを表す。
単位は秒である。スプリットブレイン状態が起きたためにデバイスが接続された後 StandaAlone 状態
になってしまった場合、このコマンドは失敗する。-wait-after-sb を指定すると、デフォルトの動作を変
更できる。
wait-sync
デバイス の同期が終わるまで待機する。このオプションは wait-connect コマンドと同じである。
disconnect
net コマンドで設定したデバイスの情報を削除する。その結果、デバイスは切断状態になり、その後はネッ
トワーク経由の情報を受け取らない。
detach
disk コマンドで設定したデバイスの情報を消去する。その結果、デバイスは下位ストレージデバイスから
切り離される。
-f, --force
通常の切り離しは、ディスク状態がディスクレスになってから返答が行われる。そのため、フリーズし
ている下位ブロックデバイスの切り離しは終了しない。一方で、強制切り離しは即座に返答がくる。こ
れでフリーズした下位ブロックデバイスを切り離すことができる。ディスクは全 I/O リクエストが下位
のブロックデバイスで完了するまで failed としてマークされることに注意。
down
デバイスの全ての設定情報を消去する。また、未設定の状態に戻す。
role
デバイスとその対向デバイスの現在のロール (役割) を表示する。表示形式はローカル/他ノードである。
state
"role" の別名である。
cstate
現在のデバイスの接続状態を表示する。
dstate
現在の下位デバイスの状態を表示する。表示形式はローカル/他ノードである。
175
付録 B
DRBD system manual pages
resize
下位 デバイス のサイズを再検査する。実際にオンライン拡張するには、両デバイスで下位デバイスを拡張
してから、そのうちの 1 台で resize コマンドを実行する。--size オプションは DRBD デバイスで使用でき
るサイズのオンライン縮小に使用される。ファイルシステムがこの操作によって破損しないことはユーザ責
任において確認する。--assume-peer-has-space オプションは、現在対向ノードに接続されていないデバイ
スのサイズ変更ができる。対向ノードのディスクサイズを同様に変更しないと、以降接続が失敗するので注
意。--assume-clean オプションを使用すると DRBD は新しいストレージの再同期をスキップする。新しい
ストレージが、別の方法で初期化されていることが確認できている場合のみ、これを設定する。--al-stripes
と --al-stripe-size-kB オプションはオンラインでアクティビティログのレイアウトを変更する。内部メタ
データの場合には、同時に、下位デバイスのユーザーに見えるサイズ (--size を使用して) の縮小、または拡
大が必要である。
check-resize
DRBD が下位デバイスのオフラインリサイズを検知できるようにするため、このコマンドは下位デバイスの
現在のサイズを記録するために使用される。サイズは、/var/lib/drbd/下に drbd-minor-??.lkbd という
名前で記録される。このコマンドは drbdsetup device resize が実行された後で drbdadm resize res
からコールされる。
pause-sync
ローカルメタデータの一時停止フラグをセットして、進行中の再同期を一時停止する。再開させるには、ロー
カルと他ノードの両方の一時停止フラグをクリアする必要がある。下位レベルデバイスの RAID を再構成し
ているときなど、DRBD の再同期を一時停止するのが望ましい場合がある。
resume-sync
自機の一時停止フラグをクリアする。
outdate
自ノードの下位レベルデバイスの内容が「無効」であるとマークする。無効ノードはプライマリになれない。
このコマンドは通常 fencing や対向ノードの fence-peer ハンドラ と組み合わせて使用される。
show-gi
デバイスのデータ世代識別子 (data generation identifiers) の内容を説明テキストとともに表示する。
get-gi
デバイスのデータ世代識別子 (data generation identifiers) の内容を表示する。
show
リソースの全ての有効な設定情報を表示する。利用可能なオプション:
--show-defaults
すべての設定パラメータを表示する。設定ファイルに未設定のパラメータも初期値の設定で表示する。
このオプションをつけないと、初期値のパラメータは確認できない。
176
B.3 DRBDSETUP
suspend-io
このコマンドの明確な使用法はないが、コマンドセットの完全性のために用意されている。
resume-io
fencing ポリシーが resource-and-stonith に設定されており、fence-peer ハンドラ の実行に失敗した場
合、このコマンドによってフリーズされた I/O 操作を再開できる。
events
DRBD のすべての状態変化とヘルパープログラムの呼び出し経緯を表示する。このコマンドは、DRBD の
状態変化を他のプログラムにパイプで渡したいときに利用できる。
--all-devices
すべての DRBD デバイスの状態を表示する。
--unfiltered
このオプションはデバッグ用である。すべてのネットリンクレイやの受信メッセージの内容を表示する。
new-current-uuid
現在 UUID を生成して、他のすべての UUID をローテートする。このコマンドには 2 通りの利用シーンが
考えられる。まず、初期同期を省略する際に利用する。また、1 台で設定を行った後遠隔サイトに運搬する
ことにより帯域幅を節約するためにも利用できる。利用可能なオプション:
--clear-bitmap
• パターン 1
現在 UUID を生成すると同時に同期ビットマップをクリアする。このオプションは、ゼロから
新規に構築する際に初期同期を省略するために使用する。この方法は、作ったばかりのメタデー
タに対して効果がある。
必要なステップは以下のとおり。
1. 両ノードでメタデータを初期化してデバイスを設定する。
drbdadm create-md --force res
2. それぞれのサイズを知るために初期ハンドシェークが必要となる。
drbdadm up res
3. Secondary/Secondary Inconsistent/Inconsistent の状態で接続される。新しい現在
UUID を作りダーティなビットマップをクリアする。
drbdadm new-current-uuid --clear-bitmap res
4. Secondary/Secondary UpToDate/UpToDate の状態で接続される。片方をプライマリに切
り替えてファイルシステムを作成する。
drbdadm primary res
mkfs -t fs-type $(drbdadm sh-dev res)
• パターン 2
177
付録 B
DRBD system manual pages
この方法の明らかな欠点は、別の方法でディスク内容を同一にしない限り、複製物全体に古いゴ
ミのデータが残ることである。このため、オンライン照合は多数の非同期ブロックを見出してし
まう。この方法は、すでにデータのあるディスクに適用してはならない。最初は動作しているよ
うに見えても、ノードの切り替えを行うとデータが壊れてしまい二度と使えなくなる。そのため、
mkfs を省略してはならない (またはそれに相当する操作)。このコマンドは、最初のノードを本
稼働させた後でディスク自体を 2 番目のノードに移すという手法により、クラスタの初期化時間
を短縮する目的にも適用できる。この方法は、切断されたデバイスに対してのみ有効である。デ
バイスのロールはプライマリでもセカンダリでもよい。
必要なステップは以下のとおり。
1. drbdsetup new-current-uuid --clear-bitmap minor
2. 現在のアクティブなサーバのディスクをコピーする。たとえば RAID1 コントローラ配下の
ディスクを 1 本抜く、dd でコピーするなど。実際のデータ領域とメタデータの両方をコピー
する必要がある。
3. drbdsetup new-current-uuid minor このディスクをセカンダリのノードに挿入してクラスタ
に参加させる。ステップ 1 での drbdsetup の実行以降に変更した箇所の再同期が行われる。
EXAMPLES
詳しくは DRBD ユーザーズガイド を参照。
VERSION
このドキュメントは DRBD バージョン 8.3.2 向けに書かれている。
AUTHOR
Philipp Reisner: philipp.reisner@linbit.com、Lars Ellenberg: lars.ellenberg@linbit.com
REPORTING BUGS
バグについては右記まで 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.CONF, drbd(8), drbddisk(8), DRBDADM, DRBD User’s Guide [1] , DRBD web site [2]
NOTES
1. DRBD User’s Guide http://www.drbd.org/users-guide/
2. DRBD web site http://www.drbd.org/
178
B.4 DRBDMETA
B.4
DRBDMETA
NAME
drbdmeta - DRBD のメタデータ管理ツール
SYNOPSIS
drbdmeta [--force] [--ignore-sanity-checks] {device} {v06 minor | v07 meta_dev index | v08
meta_dev index} {command} [cmd args...]
DESCRIPTION
drbdmeta は、DRBD メタデータを作成、内容表示、あるいは変更する。通常はフロントエンドの drbdadm(8)
コマンドを使うため、このコマンドを直接使用する必要はない。このコマンドは、DRBD リソースを無効にして
ある場合、もしくは少なくとも下位レベルストレージから切り離してある場合のみ動作する。最初の引数は、リ
ソースに結び付けたデバイス名である。第 2 引数はメタデータのバージョンで、現在の主要な全バージョン (0.6、
0.7 および 8) を指定できる。
OPTIONS
--force
drbdmeta からのすべての質問に yes と回答するようにする。
--ignore-sanity-checks
サニティチェックをすると drbdmeta が終了することがある。メタデータを作成することにより、ファイル
システムイメージが破壊された場合などである。このオプションを使うことにより、drbdmeta がこれらの
チェックを無視するようになる。
COMMANDS
create-md --peer-max-bio-size val --al-stripes val --al-stripe-size-kB val
メタデータ領域を新しく作成する。DRBD リソースを初めて利用する場合、オンラインにする前にこのコ
マンドを実行する必要がある。すでに古いバージョンのメタデータが存在する場合、drbdmeta は指定した
バージョンの形式に変換するかどうかを尋ねる。最初に対向ノードに接続する前にリソースを使用する場
合、-peer-max-bio-size オプションを使用すると DRBD の性能が向上する。対向ノードの DRBD のバー
ジョンによって、これらの値を使う。8.3.7 → 4k、8.3.8 → 32k、8.3.9 → 128k、8.4.0 → 1M。6433 以上の
アクティビティログのエクステントを使用したい場合、またはストライプド RAID 上で使用する場合には、
ストライプ数 (-al-stripes、デフォルトは 1) とストライプのサイズ (-al-stripe-size-kB、デフォルトは 32) を
指定することが可能。
単に大きなオンディスクのリングバッファを使用する場合には、ストライプ数を 1 にし、サイズを次のよう
に拡大する。:
179
付録 B
DRBD system manual pages
drbdmeta 0 v08 /dev/vg23/lv42 internal create-md ‒ al-stripe-size 1M
ボトルネックの単一の「スピンドル」になるのを避けるため、ストライプ数を増やし、オンディスクのアク
ティビティログ処理のインターリーブ対応の構成する。"stripe-size"で指定するものは、いわゆる「チャンク
サイズ」または「粒度」あるいは「ストライプユニット」である。つまり、次の「スピンドル」への最短のス
テップとなる。
drbdmeta 0 v08 /dev/vg23/lv42 internal create-md ‒ al-stripes 7 ‒ al-stripe-size 64k
get-gi
データ世代識別子 (data generation identifiers) の情報を簡潔なテキスト情報として表示する。バージョン
0.6 および 0.7 形式のメタデータには世代カウンタがあるが、バージョン 8 では UUID が表示される。
show-gi
データ世代識別子 (data generation identifiers) の情報を、説明テキストとともにテキスト情報として表示
する。
dump-md
メタデータの全内容をテキスト形式でダンプする。ダンプにはビットマップとアクティビティログも含ま
れる。
outdate
メタデータに outdated フラグをセットする。他ノードが自ノードと通信できない状態でプライマリ状態に
なりたい場合、他ノードからのリモート実行でこのコマンドが実行される。ただし、スタックされたノード
にはできない。
dstate
下位レベルストレージの状態を表示する。drbdmeta はローカルメタデータのみにアクセスするため、出力
にははつねに /DUnknown が表示される。
check-resize
下 位 デ バ イ ス の デ バ イ ス サ イ ズ を 調 べ 、最 新 の デ バ イ ス サ イ ズ を /var/lib/drbd/ 下 の フ ァ イ ル
drbd-minor-??.lkbd に記録する。下位デバイスのサイズが変更されている場合、または古い場所にメタ
データを検出した場合、メタデータを正しい場所であるブロックデバイスの最後に移動させる。
エキスパート向けコマンド
drbdmeta を使うと、メタデータの内容を変更できる。以下のコマンドは、コマンド自身の使用法表示から意
図的に削除してある。これは、何をしているのか明確に理解した上で実行しないと 危険なため である。データ
世代識別子に間違った値をセットすると、古いデータで最新データを上書きしてしまうなどのリスクが生じる。
set-gi gi
180
B.4 DRBDMETA
データ世代識別子に値をセットする。Gi にはバージョン 0.6 および 0.7 では世代カウンタを、バージョン 8.x
では UUID を指定する。get-gi で表示された値と同じ値を指定すること。
restore-md dump_file
dump_file を読み込んで、その内容をメタデータに書き込む。
VERSION
このドキュメントは DRBD バージョン 8.3.2 向けに書かれている。
AUTHOR
Philipp Reisner: philipp.reisner@linbit.com、Lars Ellenberg: lars.ellenberg@linbit.com
REPORTING BUGS
バグについては右記まで 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
DRBDADM
181
索 引
●記号・数字●
/proc/drbd ............................................................. 39
●
A ●
Activity Log ......................................................... 127
●
B ●
become-primary-on ............................................... 152
bonding ドライバ ................................................... 111
●
C ●
CentOS .................................................................. 93
cluster.conf(Red Hat Cluster 構成ファイル) ............. 82
Connected(接続状態) ............................................. 74
●
D ●
Debian GNU/Linux ......................................... 93, 117
disk failure ............................................................. 65
disk-drain ............................................................. 145
disk-flushes ........................................................... 145
dopd ...................................................................... 73
drbd-overview ......................................................... 39
drbd.conf.........................................52, 91, 94, 98, 139
address.............................................................. 144
after-resync-target.............................................. 155
after-sb-0pri....................................................... 149
after-sb-1pri....................................................... 149
after-sb-2pri....................................................... 150
al-extents .......................................................... 153
al-updates ......................................................... 153
allow-two-primaries ............................................ 148
always-asbp ....................................................... 150
before-resync-target ........................................... 155
c-delay-target .................................................... 153
c-fill-target ........................................................ 153
c-max-rate ......................................................... 153
c-min-rate ......................................................... 154
c-plan-ahead ...................................................... 153
extents .............................................................. 151
congestion-fill .................................................... 151
connect-int ........................................................ 147
cpu-mask........................................................... 154
cram-hmac-alg ................................................... 148
csums-alg .......................................................... 153
data-integrity-alg ............................................... 151
degr-wfc-timeout................................................ 151
delay_target...................................................... 153
device................................................................ 144
dialog-refresh ..................................................... 143
disable-ip-verification ......................................... 143
disk............................................................ 142, 144
disk-barrier........................................................ 145
disk-timeout ...................................................... 146
fence-peer .......................................................... 155
fill_target.......................................................... 153
handlers ............................................................ 142
initial-split-brain ................................................ 155
ko-count ............................................................ 148
local-io-error ...................................................... 155
max-bio-bvecs .................................................... 146
max-buffers ....................................................... 148
max-epoch-size .................................................. 148
max_rate .......................................................... 153
md-flushes ......................................................... 146
meta-disk .......................................................... 144
minor-count ....................................................... 143
net .................................................................... 142
on-congestion..................................................... 151
on-io-error ......................................................... 144
on-no-data-accessible.......................................... 154
options .............................................................. 142
ping-int ............................................................. 147
ping-timeout...................................................... 147
plan_time ......................................................... 153
pri-lost .............................................................. 154
pri-lost-after-sb .................................................. 154
pri-on-incon-degr ............................................... 154
protocol............................................................. 143
rcvbuf-size ......................................................... 147
read-balancing ................................................... 147
resync-after ....................................................... 153
resync-rate ........................................................ 152
183
索引
rr-conflict .......................................................... 150
shared-secret...................................................... 148
sndbuf-size ........................................................ 147
socket-check-timeout .......................................... 152
split-brain ......................................................... 155
stacked-timeouts ................................................ 152
startup .............................................................. 142
tcp-cork............................................................. 151
timeout ............................................................. 147
unplug-watermark .............................................. 148
usage-count ....................................................... 143
use-rle ............................................................... 152
verify-alg ........................................................... 153
wait-after-sb ...................................................... 152
wfc-timeout ....................................................... 151
drbdadm ..................................... 41, 43, 65, 66, 91, 92
adjust ............................................................... 159
attach ............................................................... 158
check-resize........................................................ 159
connect ............................................................. 158
create-md .......................................................... 159
cstate ................................................................ 160
detach ............................................................... 158
disconnect ......................................................... 158
down ................................................................. 158
dstate................................................................ 160
dump ................................................................ 160
dump-md .......................................................... 159
get-gi ................................................................ 159
hidden-commands .............................................. 161
invalidate .......................................................... 158
invalidate-remote ............................................... 158
new-current-uuid................................................ 160
outdate ...................................................... 159, 160
pause-sync ......................................................... 160
primary ............................................................. 158
resize................................................................. 159
resume-sync....................................................... 160
role ................................................................... 160
secondary .......................................................... 158
show-gi.............................................................. 159
state ................................................................. 160
syncer ............................................................... 158
up ..................................................................... 158
verify ................................................................ 160
wait-connect ...................................................... 160
drbdmeta
check-resize........................................................ 180
dstate................................................................ 180
dump-md .......................................................... 180
get-gi ................................................................ 180
outdate ............................................................. 180
restore-md ......................................................... 181
set-gi................................................................. 180
show-gi.............................................................. 180
184
drbdsetup
attach ............................................................... 163
check-resize........................................................ 176
connect ............................................................. 167
cstate ................................................................ 175
del-minor........................................................... 163
del-resource ....................................................... 163
detach ............................................................... 175
disconnect ......................................................... 175
disk-options ....................................................... 163
down ................................................................. 175
dstate................................................................ 175
events ............................................................... 177
get-gi ................................................................ 176
invalidate .......................................................... 174
invalidate-remote ............................................... 174
net-options ........................................................ 167
new-current-uuid................................................ 177
new-minor ......................................................... 163
new-resource...................................................... 163
outdate ............................................................. 176
pause-sync ......................................................... 176
primary ............................................................. 173
resize................................................................. 176
resource-options ................................................. 173
resume-io........................................................... 177
resume-sync....................................................... 176
role ................................................................... 175
secondary .......................................................... 173
show ................................................................. 176
show-gi.............................................................. 176
state ................................................................. 175
verify ................................................................ 174
wait-connect ...................................................... 174
wait-sync........................................................... 175
drive failure ............................................................ 65
●
G ●
GFS ..................................................................93, 95
Global File System.................................................. 93
●
H ●
ha.cf(heartbeat 設定ファイル) ................................ 73
Heartbeat ............................................................. 106
●
I
●
I/O エラー .............................................................. 52
●
J
●
Jumbo frames ....................................................... 116
●
L
●
Logical Volume Management ................................... 85
lvcreate (LVM コマンド) .......................................... 91
lvcreate (LVM コマンド) ............................... 86, 89, 91
索引
LVM ...............................85, 86, 88, 89, 90, 91, 92, 122
ディスクレス (ディスク状態) ...................................... 65
ディスクレスモード .................................................. 65
●
O ●
OCFS2 ................................................................... 97
Oracle Cluster File System ...................................... 97
Outdated (ディスク状態) .......................................... 74
デュアルプライマリモード .................................. 48, 104
同期 ....................................................................... 50
●
な ●
ノード障害 .........................................................66, 67
●
P ●
Pacemaker.............................................................. 71
pvcreate (LVM コマンド)............................... 88, 90, 91
●
は ●
バッテリバックアップ式ライトキャッシュ .................. 115
ビットマップ ......................................................... 128
●
R ●
Red Hat Cluster ................................................81, 82
Red Hat Cluster Suite ............................................. 93
resource..................................40, 41, 43, 44, 53, 54, 55
フィルタ表現 (LVM)............................................88, 90
物理ボリューム (LVM)................................... 85, 88, 90
ボリュームグループ (LVM)........................................ 85
●
●
S
●
split brain .........................................................67, 68
splitbrain.............................................................. 126
StandAlone (接続状態) ............................................. 67
ま ●
待ち時間 ............................................................... 115
メタデータ ..................................................... 121, 122
●
ら ●
レプリケーション用トラフィックの整合性チェック ........ 53
●
T ●
論理ボリューム (LVM)................................... 85, 86, 90
throughput ........................................................... 111
●
U ●
UpToDate(ディスク状態) ....................................... 74
●
V ●
vgchange (LVM コマンド) ........................................ 92
vgcreate (LVM コマンド)............................... 89, 90, 91
vgscan (LVM コマンド) ............................................ 90
vgscan(LVM コマンド) ............................................. 88
● W ●
WFConnection (接続状態)...................................67, 74
●
X ●
Xen........................................................ 103, 104, 106
● あ
●
アクティビティログ ......................................... 126, 127
オンライン照合 ........................................................ 49
● か
●
クイック同期ビットマップ ....................................... 128
● さ
●
スナップショット (LVM)........................................... 86
スプリットブレイン ................................................ 123
世代識別子 ............................................................ 123
接続状態 ................................................. 40, 41, 67, 74
● た
●
チェックサムベース同期 ............................................ 51
ディスク状態 ..................................... 40, 41, 42, 65, 74
185
DRBD ユーザーズガイド バージョン 8.4 版
2015 年 6 月 26 日 初版発行
著者
日本語訳
発行所
LINBIT Information Technologies GmbH
株式会社サードウェア
株式会社サードウェア
〒130-0026 東京都墨田区両国 2-16-5 あつまビル 5F
電話:03-4530-8670 FAX:03-6240-2420
電子メール: info@3ware.co.jp
本書のテキストと図版は Creative Commons Attribution - Share Alike 3.0 Unported ライセンス (CC BY-SA) にもとづいて
配布されます。