DRBDユーザーズガイド バージョン8.4版

はじめにお読みください

本書は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/ をご利用ください。

本書に対する改善提案や誤りの指摘は DRBD関連メーリングリスト へお寄せください。

本書は次の構成になっています。

  • 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 の以前のリリースと比較した DRBD 8.4 の変更点の概要です。

DRBDトレーニングやサポートサービスにご興味のある方は [email protected] にお問い合せください。

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などのファイルシステムに対してアクティブ-アクティブクラスタ機能を追加することもできません。

drbd in kernel
図 1. LinuxのI/OスタックでのDRBDの位置

1.2. ユーザ空間の管理ツール

DRBDにはカーネルモジュールと通信を行う管理ツールがいくつか用意されています。これらのツールを使って、DRBDリソースを設定して管理できます。

drbdadm

DRBDプログラム群における高レベル管理ツールです。このコマンドは、DRBDの制御に必要なすべてのパラメータを /etc/drbd.conf から読み込み、 drbdsetup および drbdmeta のフロントエンドとして動作します。 drbdadm には -d オプションで起動する dry-run モードがあり、実際にコマンドを実行することなく、 drbdsetupdrbdmeta のどちらが drbdadm を呼び出すのかを表示します。

drbdsetup

カーネルにロードされたDRBDモジュールを設定します。 drbdsetup ではすべてのパラメータをコマンドラインで指定する必要があります。 drbdadmdrbdsetup が分離していると、柔軟性が高くなります。ほとんどのユーザにとって、 drbdsetup を使うことはほとんどないでしょう。

drbdmeta

DRBDメタデータの作成、ダンプ、リストアなどを行うコマンドです。 drbdsetup と同様、ほとんどのユーザにとって、 drbdmeta を使うことはほとんどないでしょう。

1.3. リソース

DRBDでは、レプリケートするデータセットに関するさまざまな属性を総称して、リソースと呼びます。リソースは、以下の要素で構成されます。

リソース名

個々のリソースを区別するために、ホワイトスペース以外のUS-ASCII文字で表される任意の名前を与えることができます。

ボリューム

どのリソースも、共通のレプリケーションストリームを共有する複数の ボリューム の1つからなる、レプリケーショングループです。DRBDは、リソース内のすべてのボリューム間で書き込みの忠実性が保証されます。ボリュームは 0 から番号付けされ、1つのリソースにおいて、最大で65,535ボリュームまで可能です。ボリュームにはレプリケートされたデータセットが含まれ、DRBD内部で使用するメタデータのセットも含まれます。

drbdadm コマンドでは、リソース内のボリュームを、リソース名とボリューム名を<resource>/<volume>のように記述して指定します。

DRBDデバイス

DRBDが管理する仮想的なブロックデバイスです。DRBDが管理する仮想的なブロックデバイスで、147のメジャー番号を持ち、minor番号は0から順次割り振られます。各DRBDデバイスは、リソース内の1つのボリュームに該当します。関連付けられたブロックデバイスは通常 /dev/drbdX の形式になり、 X はデバイスのminor番号です。DRBDは、ブロックデバイス名をユーザが定義することもできます。その場合は、ブロックデバイス名を drbd_ で始まるようにしてください。

初期のバージョンのDRBDは、NBDのデバイスメジャー番号43を勝手に使っていました。47という番号は、DRBDデバイスメジャー番号として、http://www.lanana.org/docs/device-list/[LANANA-registered]に正式に登録されています。
コネクション

コネクションは、レプリケートされるデータセットを共有する、2つのホスト間の通信リンクです。現時点では、各リソースは2つのホストとこれらのホスト間の1つの接続にのみ関与します。ほとんどの場合、 resourceconnection という用語は同じ意味で使われます。

drbdadm では、コネクションはリソース名で指定されます。

1.4. リソースのロール(役割)

DRBDのすべてのリソースは、プライマリまたはセカンダリのどちらかのロール(役割)を持っています。

「プライマリ」と「セカンダリ」という用語は適当に選んだものではないことを理解してください。DRBD開発者は意図的に「アクティブ」と「パッシブ」という用語を避けました。プライマリとセカンダリは、ストレージの可用性に関する概念です。一方アクティブとパッシブはアプリケーションの可用性に関わる概念です。ハイアベイラビリティクラスタ環境では、一般的にアクティブノードのDRBDはプライマリになりますが、これが例外のないルールだということではありません。
  • プライマリロールのDRBDデバイスでは、データの読み込みと書き込みが制約なく行えます。この状態のストレージに対して、ファイルシステムを作成したりマウントでき、ブロックデバイスに対する下位デバイスI/OやダイレクトI/Oすら可能です。

  • セカンダリロールのDRBDデバイスは、対向するノードでのすべてのデータの更新を受け取りますが、自ノードのアプリケーションからのアクセスは、読み込みと書き込みの両方とも一切受け付けません。読み込みすら受け付けない理由は、キャッシュの透過性を保証するためです。もしもセカンダリリソースが自ノードからのアクセスを受け付けると、この保証ができなくなります。

リソースのロールは、もちろん手動で切り替えできる他に、クラスタ管理アプリケーションの何らかのアルゴリズムによって自動で切り替えられます。セカンダリからプライマリへの切り替えを昇格と呼びます。一方プライマリからセダンダリの切り替えは降格と呼びます。

2. DRBDの機能

本章ではDRBDの有用な機能とその背景にある情報も紹介します。ほとんどのユーザにとって非常に重要な機能もありますが、特定の利用目的に対して重要な機能もあります。これらの機能を使うために必要な設定方法については、「一般的な管理作業」および「トラブルシューティングとエラーからの回復」を参照してください。

2.1. シングルプライマリモード

シングルプライマリモードでは、個々のリソースは、任意の時点でクラスタメンバのどれか1台のみプライマリになれます。どれか1台のクラスタノードのみがデータを更新できることが保証されるため、従来の一般的なファイルシステム(ext3、ext4、XFSなど)を操作するのに最適な処理モードと言えます。

一般的なハイアベイラビリティクラスタ(フェイルオーバタイプ)を実現する場合、DRBDをシングルプライマリモードで設定してください。

2.2. デュアルプライマリモード

デュアルプライマリモードでは、すべてのリソースが任意の時点で両方のノード上でプライマリロールになれます。両方のノードから同一のデータに同時にアクセスできるため、分散ロックマネージャを持つ共有クラスタファイルシステムの利用がこのモードに必須です。利用できるファイルシステムにはGFSおよびOCFS2があります。

2つのノード経由でのデータへの同時アクセスが必要なクラスタシステムの負荷分散をはかりたい場合、デュアルプライマリモードが適しています。このモードはデフォルトでは無効になっており、DRBD設定ファイルで明示的に有効にする必要があります。

特定のリソースに対して有効にする方法については、デュアルプライマリモードを有効にするを参照してください。

2.3. レプリケーションのモード

DRBDは3種類のレプリケーションモードをサポートしています。

Protocol A

非同期レプリケーションプロトコル。プライマリノードでのディスクへの書き込みは、自機のディスクに書き込んだ上でレプリケーションパケットを自機のTCP送信バッファに送った時点で、完了したと判断されます。システムクラッシュなどの強制的なフェイルオーバが起こると、データを紛失する可能性があります。クラッシュが原因となったフェイルオーバが起こった場合、待機系ノードのデータは整合性があると判断されますが、クラッシュ直前のアップデート内容が反映されない可能性があります。プロトコル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が販売するハードウェアの上でのみ利用できます。

2.5. 効率的なデータ同期

同期ならびに再同期は、レプリケーションとは区別されます。レプリケーションは、プライマリノードでのデータの書き込みに伴って実施されますが、同期はこれとは無関係です。同期はデバイス全体の状態に関わる機能です。

プライマリノードのダウン、セカンダリノードのダウン、レプリケーション用ネットワークのリンク中断など、さまざまな理由によりレプリケーションが一時中断した場合、同期が必要になります。DRBDの同期は、もともとの書き込み順序ではなくリニアに書き込むロジックを採用しているため、効率的です。

  • 何度も書き込みが行われたブロックの場合でも、同期は1回の書き込みですみます。このため、同期は高速です。

  • ディスク上のブロックレイアウトを考慮して、わずかなシークですむよう、同期は最適化されています。

  • 同期実行中は、スタンバイノードの一部のデータブロックの内容は古く、残りは最新の状態に更新されています。この状態のデータは inconsistent (不一致)と呼びます。

DRBDでは、同期はバックグラウンドで実行されるので、アクティブノードのサービスは同期によって中断されることはありません。

データに不一致箇所が残っているノードは、多くの場合サービスに利用できません。このため、不一致である時間を可能な限り短縮することが求められます。そのため、DRBDは同期直前のLVMスナップショットを自動で作成するLVM統合機能を実装しています。これは同期中であっても対向ノードと consistent (一致する)一致するコピーを保証します。この機能の詳細についてはDRBD同期中の自動LVMスナップショットの使用を参照してください。

2.5.1. 可変レート同期

可変レート同期(デフォルト)の場合、DRBDは同期のネットワーク上で利用可能な帯域幅を検出し、それと、フォアグランドのアプリケーションI/Oからの入力とを比較する、完全自動制御ループに基づいて、最適な同期レートを選択します。

可変レート同期に関する設定の詳細については、可変同期速度設定を参照してください。

2.5.2. 固定レート同期

固定レート同期の場合、同期ホストに対して送信される1秒あたりのデータ量(同期速度)には設定可能な静的な上限があります。この上限に基づき、同期に必要な時間は、次の簡単な式で予測できます。

equation
図 2. 同期時間

tsync は同期所要時間の予測値です。 D は同期が必要なデータ量で、リンクが途絶えていた間にアプリケーションによって更新されたデータ量です。 R は設定ファイルに指定した同期速度です。ただし実際の同期速度はネットワークやI/Oサブシステムの性能による制約を受けます。

固定レート同期に関する設定の詳細については同期速度の設定を参照してください。

2.5.3. チェックサムベース同期

DRBDの同期アルゴリズムは、データダイジェスト(チェックサム)を使うことによりさらに効率化されています。チェックサムベースの同期を行うことで、より効率的に同期対象ブロックの書き換えが行われます。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は、失敗したブロックに関するパケットの再送を求めます。この機能を使うことで、データの損失を起こす可能性がある次のようなさまざまな状況への備えが強化され、DRBDによるレプリーションが保護されます。

  • 送信側ノードのメインメモリとネットワークインタフェースの間で生じたビット単位エラー(ビット反転)。この種のエラーは、多くのシステムにおいてTCPレベルのチェックサムでは検出できません。

  • 受信側ノードのネットワークインタフェースとメインメモリの間で生じたビット反転。TCPチェックサムが役に立たないのは前項と同じです。

  • 何らかのリソース競合やネットワークインタフェースまたはそのドライバのバグなどによって生じたデータの損傷。

  • ノード間のネットワークコンポーネントが再編成されるときなどに生じるビット反転やデータ損傷。このエラーの可能性は、ノード間をネットワークケーブルで直結しなかった場合に考慮する必要があります。

レプリケーショントラフィックの整合性チェックを有効にする方法については、レプリケーショントラフィックの整合性チェックを設定をご参照ください。

2.9. スプリットブレインの通知と自動修復

クラスタノード間のすべての通信が一時的に中断され、クラスタ管理ソフトウェアまたは人為的な操作ミスによって両方のノードがプライマリになった場合に、スプリットブレインの状態に陥ります。それぞれのノードでデータの書き換えが行われることが可能になってしまうため、この状態はきわめて危険です。つまり、2つの分岐したデータセットが作られてしまう軽視できない状況に陥る可能性が高くなります。

クラスタのスプリットブレインは、Heartbeatなどが管理するホスト間の通信がすべて途絶えたときに生じます。これとDRBDのスプリットブレインは区別して考える必要があります。このため、本書では次のような記載方法を使うことにします。

  • スプリットブレインは、DRBDのスプリットブレインと表記します。

  • クラスタノード間のすべての通信の断絶のことをクラスタ断絶と表記します。これはクラスタのスプリットブレインのことです。

スプリットブレインに陥ったことを検出すると、DRBDは電子メールまたは他の方法によって管理者に自動的に通知できます。この機能を有効にする方法についてはスプリットブレインの通知を参照してください。

スプリットブレインへの望ましい対処方法は、手動回復を実施した後、根本原因を取り除くことです。しかし、ときにはこのプロセスを自動化する方がいい場合もあります。自動化のために、DRBDは以下のいくつかのアルゴリズムを提供します。

  • 「若い」プライマリ側の変更を切り捨てる方法 ネットワークの接続が回復してスプリットブレインを検出すると、DRBDは最後にプライマリに切り替わったノードのデータを切り捨てます。

  • 「若い」プライマリ側の変更を切り捨てる方法 DRBDは最初にプライマリに切り替わったノードの変更を切り捨てます。

  • 変更が少ないプライマリ側の変更を切り捨てる方法 DRBDは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はそのまま上位レイヤに伝えます。したがって、そのようなエラーへの対応(ファイルシステムをリードオンリーでマウントしなおすなど)は上位レイヤに任されます。このモードはサービスの継続性を損ねることがあるので、多くの場合推奨できない設定だといえます。

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レプリケーションリンクから独立した通信経路を使用するクラスタ管理フレームワーク用になされていますが、 しかしこのAPIは汎用的なので、他のクラスタ管理アプリケーションでも容易に本機能を利用できます。

レプリケーションリンクが復活すると、無効に設定されたリソースの無効フラグは自動的にクリアされます。そしてバックグラウンド同期が実行されます。

誤って無効データを使ってしまうことを防止するための設定例については、DRBD無効化デーモン(dopd)を参照してください。

2.13. 3ノードレプリケーション

この機能はDRBDバージョン8.3.0以上で使用可能です。

3ノードレプリケーションとは、2ノードクラスタに3番目のノードを追加してDRBDでレプリケーションするものです。この方法は、バックアップやディザスタリカバリのために使われます。この構成においては、DRBD Proxyによる遠距離レプリケーションの内容も関係しています。

3ノードレプリケーション既存のDRBDリソースの上にもうひとつのDRBDリソースを積み重ねることによって実現されます。次の図を参照してください。

drbd resource stacking
図 3. DRBDリソースの積み重ね

下位リソースのレプリケーションには同期モード(DRBDプロトコルC)を使いますが、上位リソースは非同期レプリケーション(DRBDプロトコルA)で動作させます。

3ノードレプリケーションは、常時実行することも、オンデマンドで実行することもできます。常時レプリケーションでは、クラスタ側のデータが更新されると、ただちに3番目のノードにもレプリケートされます。オンデマンドレプリケーションでは、クラスタシステムとバックアップサイトの通信はふだんは停止しておき、cronなどによって定期的に夜間などに同期をはかります。

2.14. DRBD Proxyによる遠距離レプリケーション

この機能はDRBD 8.2.7以降で利用可能です。

DRBDのprotocol Aは非同期モードです。しかし、ソケットの出力バッファが一杯になると( drbd.conf マニュアルページの sndbuf-size を参照ください。)、アプリケーションからの書き込みはブロックされてしまいます。帯域幅が狭いネットワークを通じて書き込みデータが対向ノードに送られるまで、そのデータを書き込んだアプリケーションは待たなければなりません。

平均的な書き込み帯域幅は、利用可能なネットワークの帯域幅によって制約されます。ソケットの出力バッファに収まるデータ量までのバースト的な書き込みは、問題なく処理されます。

オプション製品のDRBD Proxyのバッファリング機構を使って、この制約を緩和できます。DRBDプライマリノードからの書き込みデータは、DRBD Proxyのバッファに格納されます。DRBD Proxyのバッファサイズは、アドレス可能空間や搭載メモリの範囲内で自由に設定できます。

データ圧縮を行うように設定することも可能です。圧縮と展開は、応答時間をわずかに増やしてしまいます。しかしネットワークの帯域幅が制約要因になっているのなら、転送時間の短縮効果は、圧縮と展開によるオーバヘッドを打ち消します。

圧縮展開機能は複数CPUによるSMPシステムを想定して実装され、複数CPUコアをうまく活用できます。

多くの場合、ブロックI/Oデータの圧縮率は高く、帯域幅の利用効率は向上します。このため、DRBD Proxyを使うことによって、DRBDプロトコルBまたはCを使うことも現実的なものとなります。

DRBD Proxyの設定についてはUsing DRBD Proxyを参照ください。

DRBD ProxyはオープンソースライセンスによらないDRBDプロダクトファミリの製品になります。評価や購入については [email protected] へご連絡ください。

2.15. トラック輸送によるレプリケーション

トラック輸送(またはディスク輸送)によるレプリケーションは、ストレージメディアを遠隔サイトに物理的に輸送することによるレプリケーションです。以下の制約がある場合に、この方法はとくに有効です。

  • レプリケート対象データ領域がかなり大きい(数百GB以上)

  • レプリケートするデータの期待される変更レートは巨大ではない

  • 利用可能なサイト間のネットワーク帯域幅が限られている

このような状況にある場合、トラック輸送を使わなければ、きわめて長期間(数日から数週間またはそれ以上)の初期同期が必要になってしまいます。トラック輸送でデータを遠隔サイトに輸送する場合、初期同期時間を劇的に短縮できます。詳細はトラックベースのレプリケーションの使用をご覧ください。

2.16. 動的対向ノード

この記述方法はDRBDバージョン8.3.2以上で使用できます。

DRBDのやや特殊な使用方法となる設定値として、動的対向ノードがあります。動的対向ノードを設定すると、DRBDのペア同士は特定の名前のホストに接続せず、いくつかのホスト間を動的に選択して接続するする能力を持ちます。この設定において、DRBDは相手ノードをホスト名ではなくIPアドレスで識別します。

動的対向ノードの設定については2セットのSANベースPacemakerクラスタ間をDRBDでレプリケートを参照ください。

DRBDのコンパイル、インストールおよび設定

3. コンパイル済みDRBDバイナリパッケージのインストール

3.1. LINBIT社が提供するパッケージ

DRBDプロジェクトのスポンサー企業であるLINBIT社は、商用サポート対象のお客様向けにDRBDバイナリパッケージを提供しています。これらパッケージは http://www.linbit.com/support/ から入手可能であり、「公式DRBDビルド」です。

これらのビルドは次のディストリビューションで入手できます。

  • Red Hat Enterprise Linux (RHEL)バージョン5、6、7

  • SUSE Linux Enterprise Server (SLES)バージョン11SP4、12

  • Debian GNU/Linux, 8 (jessie)、9 (stretch)

  • Ubuntu Server Edition LTS 14.04 (Trusty Tahr)、16.04 (Xenial Xerus)、LTS 18.04 (Bionic Beaver)

LINBIT社では、新規のDRBDソースのリリースと並行してバイナリビルドをリリースしています。

RPMベースのシステム(SLES、RHEL)へのパッケージのインストールはパッケージ名とともに rpm -i (新規インストールの場合)または rpm -U (アップグレードの場合)コマンドを呼び出すことで簡単に行えます。

Debianベースのシステム(Debian GNU/Linux、Ubuntu)では、 drbd8-utilsdrbd8-module パッケージを dpkg -i または gdebi コマンドでインストールします(該当する場合)。

3.2. ディストリビューションベンダが提供するパッケージ

コンパイル済みバイナリパッケージを含め、いくつかのディストリビューションでDRBDが配布されています。これらのパッケージに対するサポートは、それぞれのディストリビュータが提供します。リリースサイクルは、DRBDソースのリリースより遅れる場合があります。

3.2.1. 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パッケージセレクションに同梱されています。

コマンドラインを使用してインストールする場合は、次のコマンドを実行します。

yast -i drbd

または

zypper install drbd

3.2.2. 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

3.2.3. CentOS

CentOSのリリース5からDRBD 8が含まれています。

DRBDは yum コマンドでインストールできます( extras リポジトリ (または EPEL / ELRepo) が有効になっている事が必要な事に注意してください)。

yum install drbd kmod-drbd

3.2.4. Ubuntu Linux

UbuntuにDRBDをインストールするには次のコマンドを実行します。

apt-get update
apt-get install drbd8-utils

古いUbuntuのバージョンでは、 drbd8-module も明示的にインストールする必要があります。新しいバージョンではデフォルトのカーネルにすでにアップストリームのDRBDバージョンが含まれています。

3.3. ソースからパッケージをコンパイル

github のgit tagsで生成されたリリースは、特定の時刻のgitリポジトリのスナップショットであり、マニュアルページ、 configure スクリプト、他の生成ファイル不足などで使用したくないかもしれません。tarballからビルドする場合は、 https://www.linbit.com/en/drbd-community/drbd-download/ を使用してください。

すべてのプロジェクトには、標準のビルドスクリプト( Makefileconfigure )が含まれています。ディストリビューションごとに特定の情報を維持することは手間がかかり、歴史的にこれらの情報はすぐに古くになっています。標準的な方法でソフトウェアをビルドする方法がわからない場合は、LINBITが提供するパッケージの使用を検討してください。

4. DRBDの設定

4.1. 下位レベルストレージの準備

DRBDをインストールしたら、両方のクラスタノードにほぼ同じ容量の記憶領域を用意する必要があります。これがDRBDリソースの下位レベルデバイスになります。システムの任意のブロックデバイスを下位レベルデバイスとして使用できます。たとえば、次のようなものがあります。

  • ハードドライブのパーティション(または物理ハードドライブ全体)

  • ソフトウェアRAIDデバイス

  • LVM論理ボリュームまたはLinuxデバイスマッパインフラストラクチャによって構成されるその他のブロックデバイス

  • システム内のその他のブロックデバイス。

リソースを積み重ねることもできます。つまり、DRBDデバイスを他のDRBDデバイスの下位レベルのデバイスとして利用することができます。リソースの積み重ねにはいくつかの注意点があります。詳しくは3ノード構成の作成を参照ください。

ループデバイスをDRBDの下位レベルデバイスとして使用することもできますが、デッドロックの問題があるためお勧めできません。

DRBDリソースを作成する前に、そのストレージ領域を空にしておく必要はありません。DRBDを使用して、非冗長のシングルサーバシステムから、2ノードのクラスタシステムを作成することは一般的なユースケースですが、いくつか重要な注意点があります。(その場合には)DRBDメタデータを参照ください)

本ガイドの説明は、次のようなとてもシンプルな構成を前提としています。

  • 両ホストには使用可能な(現在未使用の) /dev/sda7 というパーティションがある。

  • 内部メタデータを使用する。

4.2. ネットワーク構成の準備

必須要件ではありませんが、DRBDによるレプリケーションの実行には、専用接続を使用することをお勧めします。この書き込みには、ギガビットイーサネットどうしをケーブルで直結した接続が最適です。DRBDをスイッチを介して使用する場合には、冗長コンポーネントと bonding ドライバ( active-backup モードで)の使用を推奨します。

一般に、ルータを介して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.3110.1.1.32 )

  • どちらのホストでも他のサービスがTCPポート7788〜7799を使用していない。

  • ローカルファイアウォール設定は、これらのポートを介したホスト間のインバウンドとアウトバウンドの両方のTCP接続を許可する。

4.3. リソースの設定

DRBDのすべての機能は、設定ファイル /etc/drbd.conf で制御されます。通常、この設定ファイルは、次のような内容となっています。

include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";

通例、 /etc/drbd.d/global_common.conf にはDRBD設定の、globalcommonのセクションが含まれます。また、 .res ファイルには各リソースセクションが含まれます。

drbd.confinclude ステートメントを使用せずにすべての設定を記載することも可能です。しかし、設定の見やすさの観点からは、複数のファイルに分割することをお勧めします。

いずれにしても drbd.conf や、その他の設定ファイルは、すべてのクラスタノードで正確に同じである必要があります。

DRBDのソースtarファイルの scripts サブディレクトリに、サンプル設定ファイルがあります。バイナリインストールパッケージの場合、サンプル設定ファイルは直接 /etc にインストールされるか、 /usr/share/doc/packages/drbd などのパッケージ固有の文書ディレクトリにインストールされます。

このセクションは、DRBDの使用を開始するため、必ず理解しておく必要のある設定ファイルの項目についての説明です。設定ファイルの構文と内容の詳細については、 drbd.conf のマニュアルページを参照してください。

4.3.1. 設定例

本ガイドでの説明は、前章で挙げた例をもとした最小限の構成を前提としています。

Listing 1. シンプルなDRBD構成例( /etc/drbd.d/global_common.conf )
global {
  usage-count yes;
}
common {
  net {
    protocol C;
  }
}
Listing 2. シンプルなDRBDリソースの構成例( /etc/drbd.d/r0.res )
resource r0 {
  on alice {
    device    /dev/drbd1;
    disk      /dev/sda7;
    address   10.1.1.31:7789;
    meta-disk internal;
  }
  on bob {
    device    /dev/drbd1;
    disk      /dev/sda7;
    address   10.1.1.32:7789;
    meta-disk internal;
  }
}

この例では、DRBDが次のように構成されます。

  • DRBDの使用状況の統計をオプトインとして含める(usage-count を参照).

  • 完全に同期したレプリケーションを使用するようにリソースを設定する(Protocol C)

  • クラスタには2つのノード ‘alice’ と ‘bob’ がある。

  • 任意の名前 r0 を持つリソースがあり /dev/sda7 下位レベルデバイスとして使用する。このリソースは、内部メタデータによって設定されている。

  • リソースはネットワーク接続にTCPポート7789を使用し、それぞれIPアドレス10.1.1.31と10.1.1.32にバインドされる。

暗黙的に、上記の設定はリソースの1つのボリュームを作成し、ゼロ( 0 )番号が付与されます。1つのリソースに複数のボリュームを設定する場合には、次のようにします。

Listing 3. 複数ボリュームのDRBDリソース構成例( /etc/drbd.d/r0.res )
resource r0 {
  volume 0 {
    device    /dev/drbd1;
    disk      /dev/sda7;
    meta-disk internal;
  }
  volume 1 {
    device    /dev/drbd2;
    disk      /dev/sda8;
    meta-disk internal;
  }
  on alice {
    address   10.1.1.31:7789;
  }
  on bob {
    address   10.1.1.32:7789;
  }
}
ボリュームは既存のデバイスの動作中にも追加できます。新しいDRBDボリュームを既存のボリュームグループへ追加するを参照ください。

4.3.2. 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[http://usage.drbd.org]をご参照ください。

4.3.3. common セクション

このセクションで、各リソースに継承される設定を簡単に定義できます。通常この設定は /etc/drbd.d/global_common.conf に記述します。ここで定義するオプションは、リソースごとに定義することもできます。

common セクションは必須ではありませんが、複数のリソースを使用する場合は、記述することを強くお勧めします。これにより、オプションを繰り返し使用することによって設定が複雑になることを回避できます。

上記の例では、 net{ protocol C;}common セクションで指定されているため、設定されているすべてのリソース( r0 含む)がこのオプションを継承します。ただし、明示的に別の protocol オプションが指定されている場合は除きます。使用可能なその他の同期プロトコルについては、レプリケーションのモードを参照してください。

4.3.4. 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;
  }
  on bob {
    address   10.1.1.32:7789;
  }
}

4.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 [email protected], 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がディスクリソースとネットワークリソースに正しく割り当てられ、稼働できるようになりました。次に、どちらのノードをデバイスの初期同期のソースとして使用するか指定する必要があります。

4.5. デバイスの初期同期

DRBDを完全に機能させるには、さらに次の2つの手順が必要です。

同期元を選択する

新しく初期化した空のディスクを使用する場合は、任意のディスクを同期元にできます。いずれかのノードにすでに重要なデータが格納されている場合は、十分注意して必ずそのノードを同期元として選択してください。デバイスの初期同期の方向が誤っていると、データを失うおそれがあります。慎重に行ってください。

初期フル同期を開始する

この手順は、最初のリソース設定の際に、同期ソースとして選択した1つのノードに対してのみ実行します。次のコマンドで実行します。

# drbdadm primary --force <resource>

このコマンドを指定すると、初期フル同期が開始します。 /proc/drbd で同期の進行状況を監視できます。デバイスのサイズによっては、同期に時間がかかる場合があります。

この時点で、初期同期が完了していなくてもDRBDデバイスは完全に稼働します。(ただし、パフォーマンスはいくらか低いです。)次に、デバイスのファイルシステムを作成します。これを下位ブロックデバイスとして使用し、マウントして、アクセス可能なブロックデバイスでさまざまな操作を実行することができます。

リソースに対して一般的な管理タスクを行う場合は、一般的な管理作業に進んでください。

4.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メタデータも必ず復元するかコピーしてください。そうでない場合、ディスクの移動を正しく行うことができません。

  • リモートノードで次のコマンドを実行します。

# drbdadm up <resource>

2つのホストを接続しても、デバイスのフル同期は開始されません。代わりに、 drbdadm --clear-bitmap new-current-uuid の呼び出し以降に変更されたブロックのみを対象とする自動同期が開始します。

以降、データの変更が全くない場合でも、アクティビティログの領域が含まれるため、それの同期が短時間行われます。これはチェックサムベースの同期を使用することで緩和されます。

この手順は、リソースが通常のDRBDリソースの場合でもスタックリソースの場合でも使用できます。スタックリソースの場合は、 -S または --stacked オプションを drbdadm に追加します。

DRBDの使い方

5. 一般的な管理作業

この章では、日常的な運用において必要な一般的な管理作業について説明します。トラブルシューティング作業については取り上げません。これについては、トラブルシューティングとエラーからの回復を参照してください。

5.1. DRBDの状態のチェック

5.1.1. 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%

5.1.2. drbdadm によるステータス情報

一番シンプルなものとして、1つのリソースのステータスを表示します。

# drbdadm status home
home role:Secondary
  disk:UpToDate
  peer role:Secondary
    replication:Established peer-disk:UpToDate

ここでは、リソース home がローカル、対抗ノードにあり、UpToDate, Secondary 状態であることを示します。よって、2つのノードはストレージデバイス上で同じデータを持ち、どちらもそのデバイスを使用していません。

より多くの情報を得るには drbdsetup--verbose , --statistics 引数のどちらか、あるいは両方を指定します:

# drbdsetup status home --verbose --statistics
home role:Secondary suspended:no
    write-ordering:flush
  volume:0 minor:0 disk:UpToDate
      size:5033792 read:0 written:0 al-writes:0 bm-writes:0 upper-pending:0
      lower-pending:0 al-suspended:no blocked:no
  peer connection:Connected role:Secondary congested:no
    volume:0 replication:Established peer-disk:UpToDate
        resync-suspended:no
        received:0 sent:0 out-of-sync:0 pending:0 unacked:0

この例では、ローカルノードについては多少異なりますが、このリソースで使用しているノードすべてを数行ごとにブロックで表示しています。以下で詳細を説明します。

各ブロックの最初の行はロール (リソースのロール を参照) を表示します。

次に重要な行は volume で始まる行で通常0から番号付けされますが、構成により他の番号付けも可能です。この行は、 replication 項に 接続状態と disk 項 (ディスク状態 を参照) にリモートの ディスク状態を表示します。さらに received, sent, out-of-sync などの統計情報が続きます。詳細は パフォーマンス指標 を参照してください。

ローカルノードの場合、この例では、最初の行にリソース名 home が表示されます。最初のブロックは常にローカルノードを記述するので、 Connection やアドレス情報はありません。

詳細は drbd.conf マニュアルページを参照してください。

この例の他の6行は、構成されている各DRBDデバイスについて繰り返されるブロックで、先頭にデバイスのマイナー番号が付いています。この場合、 0 はデバイス /dev/drbd0 に対応します。

リソース固有の出力には、リソースについてのさまざまな情報が表示されます。

Replication protocolはリソースが使用します。 ABC のいずれかです。詳細はレプリケーションのモードを参照ください。

5.1.3. drbdsetup events2 によるワンショットもしくはリアルタイムの監視

これは drbd-utils バージョン 8.9.3, kernel module 8.4.6 以降で利用可能です。

これは、監視のような自動ツールでの使用に適したもので、DRBD から情報を取得する低レベルのメカニズムです。

最も単純な呼び出しでは、現在のステータスのみを表示し、出力は次のようになります(ただし、端末で実行するとカラー属性を含みます)。

Listing 4. ‘drbdsetup’ の出力例(読みやすくするために改行してある)
# drbdsetup events2 --now r0
exists resource name:r0 role:Secondary suspended:no
exists connection name:r0 peer-node-id:1 conn-name:remote-host connection:Connected role:Secondary
exists device name:r0 volume:0 minor:7 disk:UpToDate
exists device name:r0 volume:1 minor:8 disk:UpToDate
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:0
	replication:Established peer-disk:UpToDate resync-suspended:no
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:1
	replication:Established peer-disk:UpToDate resync-suspended:no
exists -

–now 引数なしではプロセスは実行し続け、このように連続的に更新し続けます:

# drbdsetup events2 r0
...
change connection name:r0 peer-node-id:1 conn-name:remote-host connection:StandAlone
change connection name:r0 peer-node-id:1 conn-name:remote-host connection:Unconnected
change connection name:r0 peer-node-id:1 conn-name:remote-host connection:Connecting

監視目的のために ”–statistics” 引数を指定すると、パフォーマンスカウンタや他の事象を生成できます。

Listing 5. ‘drbdsetup’ 冗長出力(読みやすくするために改行してある
# drbdsetup events2 --statistics --now r0
exists resource name:r0 role:Secondary suspended:no write-ordering:drain
exists connection name:r0 peer-node-id:1 conn-name:remote-host connection:Connected role:Secondary congested:no
exists device name:r0 volume:0 minor:7 disk:UpToDate size:6291228 read:6397188 written:131844
	al-writes:34 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
exists device name:r0 volume:1 minor:8 disk:UpToDate size:104854364 read:5910680 written:6634548
	al-writes:417 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:0 replication:Established
	peer-disk:UpToDate resync-suspended:no received:0 sent:131844 out-of-sync:0 pending:0 unacked:0
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:1 replication:Established
	peer-disk:UpToDate resync-suspended:no received:0 sent:6634548 out-of-sync:0 pending:0 unacked:0
exists -

--timestamp 引数もあります。

5.1.4. /proc/drbd でのステータス情報

”/proc/drbd” は非推奨です。8.4 シリーズでは削除されませんが、drbdadm によるステータス情報 や監視目的の drbdsetup events2 によるワンショットもしくはリアルタイムの監視 などの他の手段に切り替えることをお勧めします。

/proc/drbd は現在設定されているすべてのDRBDリソースに関するリアルタイムのステータス情報を表示する仮想ファイルです。次のようにして、ファイルの内容を確認できます。

$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 09b6d528b3b3de50462cd7831c0a3791abc665c3 build by [email protected], 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 のデバイス固有の出力には、リソースについてのさまざまな情報が表示されます。

cs (connection state)

ネットワーク接続の状態。接続状態の種類や詳細については接続状態を参照ください。

ro (roles)

ノードのロール最初にローカルノードのロールが表示され、スラッシュの後に対向ノードのロールが表示されます。リソースロールの詳細は、リソースのロールを参照してください。

ds (disk states)

ハードディスクの状態スラッシュの前にローカルノードの状態、スラッシュの後に対向ノードのハードディスクの状態が表示されます。さまざまなディスク状態についてはディスク状態をご参照ください。

レプリケーションプロトコル

Replication protocolはリソースが使用します。 ABC のいずれかです。詳細はレプリケーションのモードを参照ください。

I/Oフラグ

リソースのI/O状態を反映する6種のフラグです。これらフラグの詳細はI/O状態フラグを参照ください。

パフォーマンス指標

リソースの利用とパフォーマンスを反映したカウンタです。詳細はパフォーマンス指標を参照ください。

5.1.5. 接続状態

リソースの接続状態を確認するには、 /proc/drbd を監視するか、 drbdadm cstate コマンドを実行します。

# drbdadm cstate <resource>
Connected

リソースの接続状態には次のようなものがあります。

StandAlone

ネットワーク構成は使用できません。リソースがまだ接続されていない、管理上の理由で切断されている(`drbdadm disconnect`を使用)、認証の失敗またはスプリットブレインにより接続が解除された、のいずれかが考えられます。

Disconnecting

切断中の一時的な状態です。次の状態は StandAlone です。

Unconnected

接続を試行する前の一時的な状態です。次に考えられる状態は、 WFConnection および WFReportParams です。

Timeout

対向ノードとの通信のタイムアウト後の一時的な状態です。次の状態は Unconnected です。

BrokenPipe

対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。

NetworkFailure

対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。

ProtocolError

対向ノードとの接続が失われた後の一時的な状態です。次の状態は Unconnected です。

TearDown

一時的な状態です。対向ノードが接続を閉じています。次の状態は Unconnected です。

WFConnection

対向ノードノードがネットワーク上で可視になるまでノードが待機します。

WFReportParams

TCP (伝送制御プロトコル)接続が確立され、ノードが対向ノードからの最初のネットワークパケットを待っています。

Connected

DRBDの接続が確立され、データミラー化がアクティブになっています。これが正常な状態です。

StartingSyncS

管理者により開始されたフル同期が始まっています。次に考えられる状態は SyncSource または PausedSyncS です。

StartingSyncT

管理者により開始されたフル同期が始まっています。次の状態は WFSyncUUID です。

WFBitMapS

部分同期が始まっています。次に考えられる状態は SyncSource または PausedSyncS です。

WFBitMapT

部分同期が始まっています。次に考えられる状態は WFSyncUUID です。

WFSyncUUID

同期が開始されるところです。次に考えられる状態は SyncTarget または PausedSyncT です。

SyncSource

現在、ローカルノードを同期元にして同期を実行中です。

SyncTarget

現在、ローカルノードを同期先にして同期を実行中です。

PausedSyncS

ローカルノードが進行中の同期の同期元ですが、現在は同期が一時停止しています。原因として、別の同期プロセスの完了との依存関係、または drbdadm pause-sync を使用して手動で同期が中断されたことが考えられます。

PausedSyncT

ローカルノードが進行中の同期の同期先ですが、現在は同期が一時停止しています。原因として、別の同期プロセスの完了との依存関係、または drbdadm pause-sync を使用して手動で同期が中断されたことが考えられます。

VerifyS

現在、ローカルノードを照合元にして、オンラインデバイスの照合を実行中です。

VerifyT

現在、ローカルノードを照合先にして、オンラインデバイスの照合を実行中です。

5.1.6. リソースのロール

リソースのロールは、 /proc/drbd を監視するか、 drbdadm role コマンドを発行することのいずれかによって確認できます。

# drbdadm role <resource>
Primary/Secondary

左側はローカルリソースのロール、右側はリモートリソースのロールです。

リソースロールには次のようなものがあります。

Primary

現在、リソースはプライマリロールで読み書き加能です。2つのノードの一方だけがこのロールになることができます。ただし、デュアルプライマリモードが有効な場合は例外です。

Secondary

現在、リソースがセカンダリロールです。対向ノードから正常に更新を受け取ることができますが(切断モード以外の場合)、このリソースに対して読み書きは実行できません。1つまたは両ノードがこのロールになることができます。

Unknown

現在、リソースのロールが不明です。ローカルリソースロールがこの状態になることはありません。これは、切断モードの場合にのみ、対向ノードのリソースロールだけに表示されます。

5.1.7. ディスク状態

リソースのディスクの状態は、 /proc/drbd を監視することにより、または drbdadm dstate コマンドを発行することのいずれかによって確認できます。

# drbdadm dstate <resource>
UpToDate/UpToDate

左側はローカルディスクの状態、右側はリモートディスクの状態です。

ローカルディスクとリモートディスクの状態には、次のようなものがあります。

Diskless

DRBDドライバにローカルブロックデバイスが割り当てられていません。原因として、リソースが下位デバイスに接続されなかった、 drbdadm detach を使用して手動でリソースを切り離した、または下位レベルのI/Oエラーにより自動的に切り離されたことが考えられます。

Attaching

メタデータ読み取り中の一時的な状態です。

Failed

ローカルブロックデバイスがI/O障害を報告した後の一時的な状態です。次の状態は Diskless です。

Negotiating

すでに接続しているDRBDデバイスで接続が実行された場合の一時的状態です。

Inconsistent

データが一致しません。新規リソースを作成した直後に(初期フル同期の前に)両方のノードがこの状態になります。また、同期中には片方のノード(同期先)がこの状態になります。

Outdated

リソースデータは一致していますが、無効です。

DUnknown

ネットワーク接続を使用できない場合に、対向ノードディスクにこの状態が使用されます。

Consistent

接続していない状態でノードのデータが一致しています。接続が確立すると、データが UpToDateOutdated か判断されます。

UpToDate

データが一致していて最新の状態です。これが正常な状態です。

5.1.8. 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 になります。通常は - です。

5.1.9. パフォーマンス指標

/proc/drbd の2行目の各リソースの情報は次のカウンタを含んでいます。

ns (ネットワーク送信)

ネットワーク接続を介して対向ノードに送信された正味データの量(単位はKibyte)。

nr (ネットワーク受信)

ネットワーク接続を介して対向ノードが受信した正味データの量(単位はKibyte)。

dw (ディスク書き込み)

ローカルハードディスクに書き込まれた正味データ(単位はKibyte)。

dr (ディスク読み取り)

ローカルハードディスクから読み取った正味データ(単位はKibyte)。

al (アクティビティログ)

メタデータのアクティビティログ領域の更新の数。

bm (ビットマップ)

メタデータのビットマップ領域の更新の数。

lo (ローカルカウント)

DRBDが発行したローカルI/Oサブシステムに対するオープン要求の数。

pe (保留)

対向ノードに送信されたが、対向ノードから応答がない要求の数。

ua (未確認)

ネットワーク接続を介して対向ノードが受信したが、応答がない要求の数。

ap (アプリケーション保留)

DRBDに転送されたが、DRBDが応答していないブロックI/O要求の数。

ep (エポック)

エポックオブジェクトの数。通常は1。 barrier または none 書き込み順序付けメソッドを使用する場合は、I/O負荷により増加する可能性があります。

wo (書き込み順序付け)

現在使用されている書き込み順序付けメソッド。 b (バリア)、 f (フラッシュ)、 d (ドレイン)または n (なし)。

oos (非同期)

現在、同期していないストレージの量(単位はKibibyte)。

5.2. リソースの有効化と無効化

5.2.1. リソースの有効化

クラスタ構成に応じたクラスタ管理アプリケーションの操作によって、通常、すべての構成されている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 で構成されているすべてのリソースを一度に有効にできます。

5.2.2. リソースを無効にする

特定のリソースを一時的に無効にするには、次のコマンドを実行します。

# drbdadm down <resource>

ここでも、リソース名の代わりにキーワード all を使用して、1回で /etc/drbd.conf に記述されたすべてのリソースを一時的に無効にできます。

5.3. リソースの設定の動的な変更

動作中のリソースのパラメータを変更できます。次の手順を行います。

  • /etc/drbd.conf のリソース構成を変更します。

  • 両方のノードで /etc/drbd.conf ファイルを同期します。

  • 両ノードで drbdadm adjust <resource> コマンドを実行します。

drbdadm adjustdrbdsetup を通じて実行中のリソースを調整します。保留中の drbdsetup 呼び出しを確認するには、 drbdadm-d (予行演習)オプションをつけて実行します。

/etc/drbd.confcommon セクションを変更して一度にすべてのリソースに反映させたいときは、 drbdadm adjust all を実行します。

5.4. リソースの昇格と降格

手動でリソースロールをセカンダリからプライマリに切り替える(昇格)、またはその逆に切り替える(降格)には、次のコマンドを実行します。

# drbdadm primary <resource>
# drbdadm secondary <resource>

DRBDがシングルプライマリモード (DRBDのデフォルト)で、接続状態Connected の場合、任意のタイミングでどちらか1つのノード上でのみリソースはプライマリロールになれます。したがって、 <resource> が対向ノードがプライマリロールになっているときに drbdadm primary <resource> を実行すると、エラーが発生します。

リソースがデュアルプライマリモードに対応するように設定されている場合は、両方のノードをプライマリロールに切り替えることができます。

5.5. 基本的な手動フェイルオーバ

Pacemakerを使わず、パッシブ/アクティブ構成でフェイルオーバを手動で制御するには次のようにします。

現在のプライマリノードでDRBDデバイスを使用するすべてのアプリケーションとサービスを停止し、リソースをセカンダリに降格します。

# umount /dev/drbd/by-res/<resource>
# drbdadm secondary <resource>

プライマリにしたいノードでリソースを昇格してデバイスをマウントします。

# drbdadm primary <resource>
# mount /dev/drbd/by-res/<resource> <mountpoint>

5.6. DRBDをアップグレードする

DRBDのアップグレードは非常にシンプルな手順です。このセクションでは8.3.xから8.4.xへのアップグレードを扱いますが、この手順は他のアップグレードでも使えます。

5.6.1. リポジトリをアップデートする

8.3から8.4の間で多くの変更があったため、それぞれ別個のリポジトリを作りました。両ノードでリポジトリのアップデートを行います。

RHEL/CentOSシステム

/etc/yum.repos.d/linbit.repos.d/linbit.repoファイルに次の変更を反映するよう編集します。

[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  0x282B6E23
# gpg --export -a 282B6E23 | apt-key add -

最後にDebianに認識させるためapt-get updateを実行します。

apt-get update

5.6.2. パッケージをアップグレードする

最初に、リソースが同期している事を確認してください。’cat /proc/drbd’がUpToDate/UpToDateを出力しています。

bob# cat /proc/drbd

version: 8.3.12 (api:88/proto:86-96)
GIT-hash: e2a8ef4656be026bbae540305fcb998a5991090f build by [email protected], 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でパッケージをアップデートします。

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 [email protected], 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 # umount /dev/drbd/by-res/r0
alice # /etc/init.d/drbd stop
bob # drbdadm primary r0
bob # 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となり、起動できるようになります。

  • 手動

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 [email protected], 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

5.6.3. 構成の移行

DRBD 8.4は8.3の構成と後方互換性がありますが、いくつかの構文は変更になっています。すべての変更点の一覧は構成における構文の変更点を参照してください。’drbdadm dump all’コマンドを使うことで、古い構成をとても簡単に移すことができます。新しいリソース構成ファイルに続いて新しいグローバル構成も両方とも出力します。この出力を使って変更を適宜行ってください。

5.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に戻すことでも、http://www.drbd.jp/users-guide/p-build-install-configure.html[8.3ユーザーズガイド]の手順でも行えます。

構成を8.4フォーマットに移行した場合には8.3フォーマットに戻すのを忘れないでください。戻すのに必要なオプションについては構成における構文の変更点を参照ください。

8.3が再インストールされたら、 drbdadm または /etc/init.d/drbd start のどちらからでも手動で起動できます。

5.8. デュアルプライマリモードを有効にする

デュアルプライマリモードではリソースが両ノードで同時にプライマリになることができます。これは永続的にも一時的なものとしても加能です。

デュアルプライマリモードではリソースが同期レプリケート(プロトコルC)で設定されていることが必要です。そのためレイテンシに過敏となり、WAN環境には適していません。

さらに、両リソースが常にプライマリとなるので、どのようなノード間のネットワーク不通でもスプリットブレインが発生します。

5.8.1. 永続的なデュアルプライマリモード

デュアルプライマリモードを有効にするため、リソース設定の net セクションで、 allow-two-primaries オプションを yes に指定します。

resource <resource>
  net {
    protocol C;
    allow-two-primaries yes;
  }
  disk {
    fencing resource-and-stonith;
  }
  handlers {
    fence-peer "...";
    unfence-peer "...";
  }
  ...
}

そして、両ノード間で設定を同期することを忘れないでください。両ノードで`drbdadm adjust <resource>`を実行してください。

これで drbdadm primary <resource> で、両ノードを同時にプライマリのロールにすることができます。

適切なフェンシングポリシーを常に実装してください。フェンシングなしで ‘allow-two-primaries’ を使用することは、フェンシングなしでシングルプライマリを使用するよりも悪い考えです。

5.8.2. 一時的なデュアルプライマリモード

通常はシングルプライマリで稼動しているリソースを、一時的にデュアルプライマリモードを有効にするには次のコマンドを実行してください。

# drbdadm net-options --protocol=C --allow-two-primaries <resource>

一時的なデュアルプライマリモードを終えるには、上記と同じコマンドを実行します。ただし、 --allow-two-primaries=no としてください(また、適切であれば希望するレプリケーションプロトコルにも)。

5.8.3. システム起動時の自動昇格

リソースがデュアルプライマリモードをサポートするように設定されている場合は、システム(またはDRBD)の起動時にリソースを自動的にプライマリロールに切り替わるように設定することをお勧めします。

resource <resource>
  startup {
    become-primary-on both;
  }
  ...
}

スタートアップ時に、 /etc/init.d/drbd システムinitスクリプトはこのオプションを読み込み、これに沿ってリソースを昇格します。

become-primary-on の方法は避けるべきです。可能であれば、常にクラスタマネージャを使用することをお勧めします。たとえば、Pacemaker管理のDRBD設定を参照してください。Pacemaker (または他のクラスタマネージャ) 設定では、リソース昇格と降格は常にクラスタ管理システムで操作されるべきです。

5.9. オンラインデバイス照合の使用

5.9.1. オンライン照合を有効にする

オンラインデバイス照合はデフォルトでは有効になっていません。有効にする場合は、 /etc/drbd.conf のリソース構成に次の行を追加します。

resource <resource>
  net {
    verify-alg <algorithm>;
  }
  ...
}

<algorithm> は、システムのカーネル構成内のカーネルcrypto APIでサポートされる任意のメッセージダイジェストアルゴリズムです。通常は sha1md5crc32c から選択します。

既存のリソースに対してこの変更を行う場合は、 drbd.conf を対向ノードと同期し、両方のノードで drbdadm adjust <resource> を実行します。

5.9.2. オンライン照合の実行

オンライン照合を有効にしたら、次のコマンドでオンライン照合を開始します。

# drbdadm verify <resource>

コマンドを実行すると、DRBDが <resource> に対してオンライン照合を実行します。同期していないブロックを検出した場合は、ブロックに非同期のマークを付け、カーネルログにメッセージを書き込みます。このときにデバイスを使用しているアプリケーションは中断なく動作し続けます。また、リソースロールの切り替えも行うことができます。

照合中に同期していないブロックが検出された場合は、照合の完了後に、次のコマンド使用して再同期できます。

# drbdadm disconnect <resource>
# drbdadm connect <resource>

5.9.3. 自動オンライン照合

通常は、オンラインデバイス照合を自動的に実行するほうが便利です。自動化は簡単です。一方のノードに /etc/cron.d/drbd-verify という名前で、次のような内容のファイルを作成します。

42 0 * * 0    root    /sbin/drbdadm verify <resource>

これにより、毎週日曜日の午前0時42分に、 cron がデバイス照合を呼び出します。

オンライン照合をすべてのリソースで有効にした場合(たとえば /etc/drbd.confcommon セクションに verify-alg <algorithm> を追加するなど)には、次のようにできます。

42 0 * * 0    root    /sbin/drbdadm verify all

5.10. 同期速度の設定

バックグラウンド同期中は同期先のデータとの一貫性が一時的に失われるため、同期をできるだけ早く完了したいと考えるでしょう。ただし、すべての帯域幅がバックグラウンド同期に占有されてしまうと、フォアグラウンドレプリケーションに使用できなくなり、アプリケーションのパフォーマンス低下につながります。これは避ける必要があります。同期用の帯域幅はハードウェアに合わせて設定する必要があります。

同期速度をセカンダリノードの最大書き込みスループットを上回る速度に設定しても意味がありません。デバイス同期の速度をどれほど高速に設定しても、セカンダリノードがそのI/Oサブシステムの能力より高速に書き込みを行うことは不可能です。

また、同じ理由で、同期速度をレプリケーションネットワークの帯域幅の能力を上回る速度に設定しても意味がありません。

5.10.1. 可変同期速度設定

DRBD 8.4以降、デフォルトは可変レート同期に切り替わりました。このモードでは、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)です。

5.10.2. 永続的な同期速度の設定

テスト目的のために、動的再同期コントローラを無効にし、DRBDを固定の再同期速度に設定することが役立つかもしれません。これは唯一の上限になりますが、ボトルネック(またはアプリケーションIO)がある場合、この速度は達成されません。

リソースがバックグラウンド再同期に使用する最大帯域幅はリソースの resync-rate オプションで指定します。これはリソース設定ファイルの /etc/drbd.confdisk セクションに含まれている必要があります。

resource <resource>
  disk {
    resync-rate 40M;
    ...
  }
  ...
}

毎秒の速度はビット単位ではなくバイトで設定します。デフォルトの単位はキビバイトなので 40964MiB と解釈されます。

経験則では、この数値として使用可能なレプリケーション帯域幅の30%程度が適切です。180MB/sの書き込みスループットを維持できるI/Oサブシステム、および110MB/sのネットワークスループットを維持できるギガビットイーサネットネットワークの場合は、ネットワークが律速要因になります。速度は次のように計算できます。
sync rate example1
図 4. syncer 速度の例(有効帯域幅が110MB/sの場合)

この結果、 rate オプションの推奨値は 33M になります。

一方、最大スループットが80MB/sのI/Oサブシステム、およびギガビットイーサネット接続を使用する場合は、I/Oサブシステムが律速要因になります。速度は次のように計算できます。

sync rate example2
図 5. cyncer 速度の例(有効帯域幅が80MB/sの場合)

この場合、 rate オプションの推奨値は 24M になります。

5.10.3. 一時的な同期速度の設定

一時的に同期速度を調整したい場合もあるでしょう。たとえば、いずれかのクラスタノードの定期保守を行ったときに、バックグラウンド再同期を高速に実行したい場合などです。また、アプリケーションの書き込み操作が非常に多いときに、バックグラウンド再同期の速度を落して、既存の帯域幅の多くをレプリケーションのために確保したい場合もあります。

たとえば、ギガビットイーサネットリンクのほとんどの帯域幅を再同期に割り当てるには、次のコマンドを実行します:

# drbdadm disk-options --c-plan-ahead=0 --resync-rate=110M <resource>

このコマンドは SyncTarget ノードで実行します。

この一時的な設定を元に戻して、 /etc/drbd.conf で設定された同期速度を再び有効にするには、次のコマンドを実行します。

# drbdadm adjust <resource>

5.11. チェックサムベース同期の設定

チェックサムベース同期はデフォルトでは有効になっていません。有効にする場合は、 /etc/drbd.conf のリソース構成に次の行を追加します。

resource <resource>
  net {
    csums-alg <algorithm>;
  }
  ...
}

<algorithm> は、システムのカーネル構成内のカーネルcrypto APIでサポートされる任意のメッセージダイジェストアルゴリズムです。通常は sha1md5crc32c から選択します。

既存のリソースに対してこの変更を行う場合は、 drbd.conf を対向ノードと同期し、両方のノードで drbdadm adjust <resource> を実行します。

5.12. 輻輳ポリシーと中断したレプリケーションの構成

レプリケーション帯域幅が大きく変動する環境(WANレプリケーション設定に典型的)の場合、レプリケーションリンクは時に輻輳します。デフォルト設定では、これはプライマリノードのI/Oのブロックを引き起こし、これは望ましくない場合があります。

その代わりに、進行中の同期を suspend (中断)に設定し、プライマリのデータセットをセカンダリから pull ahead (引き離す)にします。このモードではDRBDはレプリケーションチャネルを開いたままにし、切断モードにはしません。しかし十分な帯域幅が利用できるようになるまで実際にはレプリケートを行いません。

次の例は、DRBD Proxy構成のためのものです。

resource <resource> {
  net {
    on-congestion pull-ahead;
    congestion-fill 2G;
    congestion-extents 2000;
    ...
  }
  ...
}

通常は congestion-fillcongestion-extentspull-ahead オプションと合わせて設定するのがよい方法でしょう。

congestion-fill の値は以下の値の90%にするとよいでしょう。

  • DRBD Proxy越しの同期の場合の、DRBD Proxyのバッファメモリの割り当て、または

  • DRBD Proxy構成でない環境でのTCPネットワークの送信バッファ

congestion-extents の値は、影響するリソースの al-extents に設定した値の90%がよいでしょう。

5.13. I/Oエラー処理方針の設定

DRBDが下位レベルI/Oエラーを処理する際の方針は、 /etc/drbd.confdisk セクションの on-io-error オプションで指定します。

resource <resource> {
  disk {
    on-io-error <strategy>;
    ...
  }
  ...
}

すべてのリソースのグローバルI/Oエラー処理方針を定義したい場合は、これを common セクションで設定します。

<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> の実行

5.14. レプリケーショントラフィックの整合性チェックを設定

レプリケーショントラフィックの整合性チェックはデフォルトでは有効になっていません。有効にする場合は、 /etc/drbd.conf のリソース構成に次の行を追加します。

resource <resource>
  net {
    data-integrity-alg <algorithm>;
  }
  ...
}

<algorithm> は、システムのカーネル構成内のカーネルcrypto APIでサポートされる任意のメッセージダイジェストアルゴリズムです。通常は sha1md5crc32c から選択します。

既存のリソースに対してこの変更を行う場合は、 drbd.conf を対向ノードと同期し、両方のノードで drbdadm adjust <resource> を実行します。

5.15. リソースのサイズ変更

5.15.1. オンラインで拡張する

動作中(オンライン)に下位ブロックデバイスを拡張できる場合は、これらのデバイスをベースとするDRBDデバイスについても動作中にサイズを拡張することができます。その際に、次の2つの条件を満たす必要があります。

  1. 影響を受けるリソースの下位デバイスが、LVMやEVMSなどの論理ボリューム管理サブシステムによって管理されている。

  2. 現在、リソースの接続状態が Connected になっている。

両方のノードの下位ブロックデバイスを拡張したら、一方のノードだけがプライマリ状態であることを確認してください。プライマリノードで次のように入力します。

# drbdadm resize <resource>

新しいセクションの同期がトリガーされます。同期はプライマリノードからセカンダリノードへ実行されます。

追加する領域がクリーンな場合には、追加領域の同期を—​assume-cleanオプションでスキップできます。

# drbdadm -- --assume-clean resize <resource>

5.15.2. オフラインで拡張する

外部メタデータを使っている場合、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>
  • 両方のノード上で修正のメタデータをインポートします:

# 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デバイスを活用するために、ファイルシステムを拡張します。

5.15.3. オンラインで縮小する

オンラインでの縮小は外部メタデータ使用の場合のみサポートしています。

DRBDデバイスを縮小する前に、DRBDの上位層(通常はファイルシステム)を縮小しなければいけません。ファイルシステムが実際に使用している容量を、DRBDが知ることはできないため、データが失われないように注意する必要があります。

ファイルシステムをオンラインで縮小できるかどうかは、使用しているファイルシステムによって異なります。ほとんどのファイルシステムはオンラインでの縮小をサポートしません。XFSは縮小そのものをサポートしません。

オンラインでDRBDを縮小するには、その上位に常駐するファイルシステムを縮小した後に、次のコマンドを実行します。

# drbdadm -- --size=<new-size> resize <resource>

<new-size> には通常の乗数サフィックス(K、M、Gなど)を使用できます。DRBDを縮小したら、DRBDに含まれるブロックデバイスも縮小できます(デバイスが縮小をサポートする場合)。

5.15.4. オフラインで縮小する

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>
  • 両方のノード上で修正のメタデータをインポートします:

# 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>

5.16. 下位デバイスのフラッシュを無効にする

バッテリバックアップ書き込みキャッシュ(BBWC)を備えたデバイスでDRBDを実行している場合にのみ、デバイスのフラッシュを無効にできます。ほとんどのストレージコントローラは、バッテリが消耗すると書き込みキャッシュを自動的に無効にし、バッテリが完全になくなると即時書き込み(ライトスルー)モードに切り替える機能を備えています。このような機能を有効にすることを強くお勧めします。

BBWC機能を使用していない、またはバッテリが消耗した状態でBBWCを使用しているときに、DRBDのフラッシュを無効にすると、データが失われるおそれがあります。したがって、これはお勧めできません。

DRBDは下位デバイスのフラッシュを、レプリケートされたデータセットとDRBD独自のメタデータについて、個別に有効と無効を切り替える機能を備えています。この2つのオプションはデフォルトで有効になっています。このオプションのいずれか(または両方)を無効にしたい場合は、DRBD設定ファイル /etc/drbd.confdisk セクションで設定できます。

レプリケートされたデータセットのディスクフラッシュを無効にするには、構成に次の行を記述します。

resource <resource>
  disk {
    disk-flushes no;
    ...
  }
  ...
}

DRBDのメタデータのディスクフラッシュを無効にするには、次の行を記述します。

resource <resource>
  disk {
    md-flushes no;
    ...
  }
  ...
}

リソースの構成を修正し、また、もちろん両ノードの /etc/drbd.conf を同期したら、両ノードで次のコマンドを実行して、これらの設定を有効にします。

# drbdadm adjust <resource>

5.17. スプリットブレイン時の動作の設定

5.17.1. スプリットブレインの通知

スプリットブレインが検出されると、DRBD はつねに split-brain ハンドラを呼び出します(設定されていれば)。このハンドラを設定するには、リソース構成に次の項目を追加します。

resource <resource>
  handlers {
    split-brain <handler>;
    ...
  }
  ...
}

<handler> はシステムに存在する任意の実行可能ファイルです。

DRBDディストリビューションでは /usr/lib/drbd/notify-split-brain.sh という名前のスプリットブレイン対策用のハンドラスクリプトを提供しています。これは指定したアドレスに電子メールで通知を送信するだけのシンプルなものです。 [email protected] (このアドレス宛のメールは実際のシステム管理者に転送されると仮定)にメッセージを送信するようにハンドラを設定するには、 split-brain handler を次のように記述します。

resource <resource>
  handlers {
    split-brain "/usr/lib/drbd/notify-split-brain.sh root";
    ...
  }
  ...
}

実行中のリソースで上記の変更を行い(ノード間で設定ファイルを同期すれば)、後はハンドラを有効にするための他の操作は必要ありません。次にスプリットブレインが発生すると、DRBDが新しく設定したハンドラを呼び出します。

5.17.2. スプリットブレインからの自動復旧ポリシー

スプリットブレイン(またはその他のシナリオ)に起因するデータ相違問題を自動的に解決するようにDRBDを構成することは、潜在的な 自動データ損失 を構成することを意味します。このことを理解し、そうでない場合は、そのような構成をとらないでください。
むしろフェンシング・ポリシー、統合したクラスタ・マネージャー、および冗長なクラスター・マネージャーの通信リンクを調べて、まずはデータの相違をできるだけ回避するようにしてください。

スプリットブレインからの自動復旧ポリシーには、状況に応じた複数のオプションが用意されています。DRBDは、スプリットブレインを検出したときのプライマリロールのノードの数にもとづいてスプリットブレイン回復手続きを適用します。そのために、DRBDはリソース設定ファイルの net セクションの次のキーワードを読み取ります。

after-sb-0pri

スプリットブレインが検出されたときに両ノードともセカンダリロールの場合に適用されるポリシーを定義します。次のキーワードを指定できます。

  • disconnect : 自動復旧は実行されません。 split-brain ハンドラスクリプト(設定されている場合)を呼び出し、コネクションを切断して切断モードで続行します。

  • discard-younger-primary : 最後にプライマリロールだったホストに加えられた変更内容を破棄してロールバックします。

  • discard-least-changes : 変更が少なかったほうのホストの変更内容を破棄してロールバックします。

  • discard-zero-changes : 変更がなかったホストがある場合は、他方に加えられたすべての変更内容を適用して続行します。

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 : 現在のセカンダリロールのホストを、スプリットブレインの犠牲ノードにします。

after-sb-2pri.

スプリットブレインが検出されたときに両ノードともプライマリロールである場合に適用されるポリシーを定義します。このオプションは after-sb-1pri と同じキーワードを受け入れます。ただし、 discard-secondaryconsensus は除きます。

上記の3つのオプションで、DRBDは追加のキーワードも認識しますが、これらはめったに使用されないためここでは省略します。ここで取り上げた以外のスプリットブレイン復旧キーワードについては、 drbd.conf マニュアルページを参照してください。

たとえば、デュアルプライマリモードでGFSまたはOCFS2ファイルシステムのブロックデバイスとして機能するリソースの場合、次のように復旧ポリシーを定義できます。

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;
    ...
  }
  ...
}

5.18. 3ノード構成の作成

3ノード構成では、1つのDRBDデバイスを別のデバイスの上にスタック(積み重ね)します。

5.18.1. デバイススタックの検討事項

3ノード構成では次のような事項に注意する必要があります。

  • スタックデバイスがアクティブなデバイスです。1つのDRBDデバイス /dev/drbd0 が構成され、その上位にスタックデバイス /dev/drbd10 があるとします。この場合は、 /dev/drbd10 がマウントされて使用されるデバイスになります。

  • 下位のDRBDデバイスおよびスタックDRBDデバイス(上位DRBDデバイス)の両方にそれぞれメタデータが存在します。上位DRBDデバイスには、必ず内部メタデータを使用してください。このため、3ノード構成時の使用可能なディスク領域は、2ノード構成に比べてわずかに小さくなります。

  • スタックされた上位デバイスを実行するには、下位のデバイスがプライマリロールになっている必要があります。

  • バックアップノードにデータを同期するには、アクティブなノードのスタックデバイスがプライマリモードで動作している必要があります。

5.18.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;
    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     /dev/drbd10;
    disk       /dev/hda6;
    address    192.168.42.2:7788; # Public IP of the backup node
    meta-disk  internal;
  }
}

他の drbd.conf 設定ファイルと同様に、この設定ファイルもクラスタのすべてのノード(この場合は3つ)に配布する必要があります。非スタックリソース構成にはない次のキーワードにご注意ください。

stacked-on-top-of

この情報により、DRBDに含まれるリソースがスタックリソースであることをDRBDに知らせます。これは、非スタックリソース構成ににある2つの on セクションのいずれかと置き換えます。下位レベルリソースには stacked-on-top-of を使用しないでください。

スタックリソースにProtocol Aを使用することは必須ではありません。アプリケーションに応じて任意のDRBDのレプリケーションプロトコルを選択できます。

5.18.3. スタックリソースを有効にする

スタックリソースを有効にするには、まず、下位レベルリソースを有効にしてどちらか一方をプライマリに昇格します。

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リソースを使用するを参照してください。

5.19. Using DRBD Proxy

5.19.1. DRBD Proxy配備に関する検討事項

DRBD Proxyプロセスは、DRBDが設定されているマシン上に直接配置するか、個別の専用サーバに配置することができます。DRBD Proxyインスタンスは、複数のノードの複数のDRBDデバイスのプロキシとして機能することができます。

DRBD ProxyはDRBDに対して完全に透過的です。通常は大量のデータパケットがDRBD Proxyを含む転送経路に溜まるため、アクティビティログがかなり大きくなります。これは、プライマリノードのクラッシュ後の長い再同期の実行を引き起こす可能性があるので、それはDRBDの csums-alg 設定を有効にすることをお勧めします。

5.19.2. インストール

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の動作も設定します。

5.19.3. ライセンスファイル

DRBD Proxyの実行には、ライセンスファイルが必要です。DRBD Proxyを実行したいマシンにライセンスファイルを設定してください。このファイルは drbd-proxy.license と呼ばれ、対象マシンの /etc ディレクトリにコピーされ、また drbdpxy ユーザ/グループに所有されている必要があります。

# cp drbd-proxy.license /etc/

5.19.4. 設定

DRBD ProxyはDRBDのメイン設定ファイルで設定します。設定は、追加のオプションセクション proxy とホストセクション内の proxy on セクションで行います。

DRBDノードで直接実行されるプロキシのDRBD Proxyの設定例を次に示します。

resource r0 {
        net {
          protocol A;
        }
        device     minor 0;
        disk       /dev/sdb1;
        meta-disk  /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アドレスはプロキシ間の通信に使用します。

5.19.5. 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.

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).

5.19.6. DRBD Proxyプラグインについて

DRBD proxy 3.0以降のプロキシではWANコネクション用のプラグインを使用できます。 現在使用できるプラグインは zliblzma です。

zlib プラグインはGZIPアルゴリズムを圧縮に使っています。CPU使用量が低いのが利点です。

lzma プラグインはliblzma2ライブラリを使います。数百MiBの辞書を使って、小さな変更であっても非常に効率的な繰り返しデータの差分符号化を行います。 lzma はより多くCPUとメモリを必要としますが、 zlib よりも高い圧縮率になります。 lzma プラグインはライセンスで有効化されてる必要があります。

CPU (速度、スレッド数)、メモリ、インプットと有効なアウトプット帯域幅に応じたプラグインの推奨構成については、サイオステクノロジーに相談してください。

proxy セクションの古い compression on は使用されておらず、次期リリースではなくなる予定です。 現在は zlib level 9 で扱っています。

5.19.7. WANサイドの帯域幅制限を使用する

DRBD Proxyの実験的なbwlimitオプションは壊れています。DRBD上のアプリケーションがIOをブロックする可能性があるため、使用しないでください。これはいずれ削除されます。

代わりにLinuxカーネルのトラフィック制御フレームワークを使用して、WAN側でプロキシが消費する帯域幅を制限します。

次の例では、対抗ノードのインターフェイス名、送信元ポート、およびIPアドレスを置き換えて使用します。

# tc qdisc add dev eth0 root handle 1: htb default 1
# tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
# tc class add