SA.03.3 データレプリケーションと災害対策 (重要度: 3)
ブロックレベルレプリケーションについて理解し, DRBD を用いてデータを冗長化する
同期/メモリ同期/非同期レプリケーション
ブロックレベルレプリケーションは、ストレージシステムのデータを複製するための一般的な手法です。以下では、ブロックレベルレプリケーションの3つの異なる手法である同期レプリケーション、メモリ同期レプリケーション、非同期レプリケーションについて説明します。
- 同期レプリケーション:
同期レプリケーションでは、データの書き込み操作が完了する前に、プライマリストレージ上のデータをセカンダリストレージに書き込む必要があります。データの変更がプライマリ側とセカンダリ側の両方に反映されるため、プライマリとセカンダリのデータは常に同期しています。この手法はデータの信頼性とデータ完全性を高めることができますが、書き込み操作が遅くなる可能性があります。 - メモリ同期レプリケーション:
メモリ同期レプリケーションでは、データの書き込み操作が実際のストレージデバイスに完了する前に、メモリ内のバッファでデータが保持されます。セカンダリストレージはプライマリストレージと同期し、プライマリで行われた変更を一定の頻度でセカンダリに反映します。この手法は同期レプリケーションよりも速い書き込み操作が可能ですが、データの信頼性は低い場合があります。 - 非同期レプリケーション:
非同期レプリケーションでは、データの書き込み操作がプライマリストレージに完了した後で、セカンダリストレージにデータを複製します。プライマリとセカンダリのデータは、一定の遅延が発生する可能性があり、完全に同期していないことがあります。この手法は書き込み操作の遅延を最小限に抑え、高いパフォーマンスを提供しますが、データの信頼性には制限があります。
これらの手法は、特定の使用ケースや要件に応じて選択されます。同期レプリケーションはデータの整合性が重要な場合に使用され、メモリ同期レプリケーションと非同期レプリケーションは高いパフォーマンスが必要な場合に使用されることが一般的です。
マルチノードレプリケーション
マルチノードレプリケーションは、複数のノードにデータを複製することで、データの可用性と冗長性を確保する手法です。以下にマルチノードレプリケーションの特徴と利点を説明します。
- 可用性の向上:マルチノードレプリケーションでは、複数のノードにデータが複製されるため、単一のノードの障害が発生しても、他のノードがデータを提供することができます。これにより、システムの可用性が向上し、ダウンタイムやデータの喪失を最小限に抑えることができます。
- 冗長性の確保:複数のノードにデータが複製されるため、データの冗長性が確保されます。データの一部が破損したり、喪失した場合でも、他のノードでデータを復元することができます。これはデータの信頼性と耐久性を高めます。
- ロードバランシング:マルチノードレプリケーションでは、複数のノードにデータが分散されるため、負荷を均等に分散することができます。データへのアクセスが複数のノードに分散されるため、システム全体のパフォーマンスが向上します。
- 拡張性の向上:マルチノードレプリケーションでは、新しいノードを追加してシステムを拡張することができます。データの量やトラフィックが増加した場合でも、新しいノードを導入することで容易にスケーリングできます。
ただし、マルチノードレプリケーションにはいくつかの課題も存在します。データの一貫性を確保するために、複数のノードへのデータ同期やトランザクションの処理が必要となります。また、ネットワークの遅延や障害が発生すると、データの同期やパフォーマンスに影響を与える可能性があります。
基本的な設定と管理
DRBD(Distributed Replicated Block Device)は、Linuxシステム上でブロックデバイスをレプリケートするためのソフトウェアです。以下にDRBDの基本的な設定と管理方法を説明します。
drbdadm: drbdadmコマンドは、DRBDの管理と設定を行うためのユーティリティです。ドライブのアップグレード、レプリケーションの制御、同期の管理など、さまざまな操作を行うことができます。
– drbdadm create-md [リソース名]: 指定したリソース名のメタデータを作成します。リソースが既に存在している場合は、メタデータを再作成することもできます。
– drbdadm up [リソース名]: 指定したリソース名のDRBDリソースを有効化します。
– drbdadm down [リソース名]: 指定したリソース名のDRBDリソースを無効化します。
– drbdadm primary [リソース名]: 指定したリソース名をプライマリノードとして設定します。プライマリノードは書き込み処理を行います。
– drbdadm secondary [リソース名]: 指定したリソース名をセカンダリノードとして設定します。セカンダリノードは読み込み専用です。
drbdsetup: drbdsetupコマンドは、DRBDリソースの設定を行うためのユーティリティです。このコマンドを使用して、リソースのサイズ、ポリシー、バックエンドデバイスなどを定義できます。
– drbdsetup [リソース名] disk [デバイス]: 指定したリソースのバックエンドとして使用するデバイスを設定します。
– drbdsetup [リソース名] syncer [オプション]: リソースの同期に関する設定を行います。例えば、同期速度や同時同期数などを指定できます。
– drbdsetup [リソース名] net [オプション]: リソースのネットワーク関連の設定を行います。例えば、接続パフォーマンスなどを指定できます。
– drbdsetup [リソース名] meta-disk [デバイス]: 指定したリソースのメタデータディスクとして使用するデバイスを設定します。
drbdmeta: drbdmetaコマンドは、DRBDメタデータの管理を行うためのユーティリティです。このコマンドは、DRBDディスクのメタデータ(ウィロータグ、アクセス許可など)の作成と操作を行うのに使用します。
– drbdmeta [リソース名] v08 /dev/drbdN internal create-md: DRBD v8形式のメタデータを作成します。
– drbdmeta [リソース名] v08 /dev/drbdN internal initrd: メタデータレシートを書き込みます。
– drbdmeta [リソース名] v08 /dev/drbdN internal write-uuid: メタデータ上のUUIDを更新します。
– drbdmeta [リソース名] v08 /dev/drbdN internal command: 内部コマンドを実行します。詳細な動作はマニュアルを参照してください。
/etc/drbd.conf: drbd.confファイルは、DRBDリソースの設定を含む設定ファイルです。このファイルを編集することで、DRBDリソースの同期方法、サイズ、ポリシー、バックエンドデバイスなどを指定できます。
/etc/drbd.conf ファイルは drbdadm コマンドから読み込まれる。
本ファイルの形式は、クラスタを構成する 2 つのノード間でそのままコピーしても問題がないよう
にデザインされている。設定を管理しやすくするため、設定ファイルをそのままコピーすることを強
く推奨する。/etc/drbd.conf ファイルは、クラスタを構成する 2 つのノードで同じ内容でなければ
ならない。/etc/drbd.conf への変更はただちに反映されるものではない。
通例、メイン設定ファイルは 2 つのインクルードステートメントが含まれている。1 つ目は
/etc/drbd.d/global_common.conf であり、2 つ目は .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;
meta-disk internal;
}
address 10.1.1.32:7789;
}
}
上の例は r0 という名前の 1 つの DRBD リソースを設定している。ノード間の通信プロトコルは C
である。ホスト alice では 1 つのボリューム含んでいて、 /dev/drbd1 をアプリケーション用のデ
バイスとして使用し、/dev/sda7 をデータ用の下位デバイスとしている。IP アドレスには 2 ノード
間の通信に使うネットワークインタフェースの IP アドレスを指定している。DRBD の再同期には 10
メガバイト/秒の帯域幅を使うことができる。この resync-rate ステートメントはボリューム 0 に
対して有効だが、追加のボリュームにも有効である。この例では各ボリュームに 10MB/秒フルで指定
している。
1つの drbd.conf に複数のリソースセクションを書くこともできる。他の設定例については DRBD
User's Guide[1] を参照
#参考:https://manpages.ubuntu.com/manpages/focal/ja/man5/drbd.conf.5.html
基本的なDRBDの設定手順は以下の通りです:
- DRBDのインストール(必要に応じてパッケージをインストール)
- /etc/drbd.confファイルを編集して、DRBDリソースを定義します。リソースのサイズ、プロトコル、アクセス許可、ポリシーなどを指定します。
- drbdadmコマンドを使用して、DRBDリソースを作成および管理します。例えば、drbdadm create-callというコマンドを使用します。
- drbdsetupコマンドを使用して、DRBDリソースのパラメータ(サイズ、ポリシーなど)を設定します。
一度設定が完了すると、DRBDは定義された設定に基づいて自動的に動作します。DRBDはブロックレベルでレプリケーションを行うため、データの同期や完全性に注意が必要です。また、ディスクの容量やネットワークの帯域幅に合わせて、DRBDの設定を適切に調整する必要があります。
以上がDRBDの基本的な設定と管理方法についての説明です。具体的な詳細や設定に関しては、ドキュメントやマニュアルを参照してください。
ネットワーク分断の対策
ブロックレベルのレプリケーションでは、ネットワーク分断が発生した場合に起こるデータの不整合問題を防ぐためのいくつかの対策があります。以下にいくつかの例を挙げます。
- レプリカの監視と自動フェイルオーバー:
- レプリケーションノード間のネットワーク接続を常に監視するツールを使用します。例えば、ハートビートやステータスチェックなどの仕組みを設定し、ノードの可用性を確認します。
- ネットワーク分断が検出された場合、自動的にフェイルオーバーをトリガーし、切り替えるように設定します。
- クォラムとマイナリティスプリットの避け方:
- 一部のDRBD設定では、クォラムと呼ばれる仕組みがあります。クォラムは、システム内のレプリケーションされたノードの数を認識するための仕組みであり、少数派のノードが操作を停止することを強制する働きがあります。
- マイナリティスプリット(Minority Split)は、ネットワーク分断が発生した際に、少数派ノードが自動的に脱退する現象です。DRBDの設定でマイナリティスプリットを回避するように調整することが重要です。
- ネットワーク停止時のデータ整合性:
- ネットワーク停止時に、データの整合性を保持するための手段を提供している製品もあります。例えば、データの破損やデータ不整合を検出し、問題の発生した箇所を特定し自動修復を行う機能などです。
これらの対策を組み合わせることで、ネットワーク分断時にデータの不整合や損失を最小限に抑えることができます。ただし、設定やツールの選択には慎重さが必要であり、環境や要件に応じて適切な対策を選択することが重要です。
主要なミドルウェアのレプリケーション機能
PostgreSQLは、高可用性とデータ保護を目的としてストリーミングレプリケーションとロジカルレプリケーションという2つの異なるレプリケーション方式を提供しています。
- ストリーミングレプリケーション:
- ストリーミングレプリケーションは、物理的なブロック単位でのデータの複製を行います。マスターノードで発生したデータ変更は、連続的なWALログ(Write-Ahead Logging)に記録され、スタンバイノードへ非同期的にリアルタイムに転送されます。
- ストリーミングレプリケーションは、耐障害性とスケーラビリティを備えており、フェイルオーバーや読み取り負荷の分散などの高可用性構成をサポートします。一方、データベースオブジェクトの操作に制約があることがあります。
- ロジカルレプリケーション:
- ロジカルレプリケーションは、論理的な変更データの再作成と転送を使用してデータの複製を行います。マスターノードで発生したデータ変更は、変更イベント(INSERT、UPDATE、DELETEなど)として論理的な形式でキャプチャされ、スタンバイノードに対して再適用されます。
- ロジカルレプリケーションは、柔軟性とデータベースオブジェクト単位での操作の容易さを提供します。この方式は特にデータの再同期やスキーマ変更の反映といった機能を重視する場合に有用です。ただし、ストリーミングレプリケーションに比べてやや遅延が生じることがあります。
ストリーミングレプリケーションは従来からの基本的なレプリケーション方式であり、パフォーマンスと信頼性が重視されるシナリオで広く使用されています。一方、ロジカルレプリケーションは、より高度なレプリケーション機能が必要な場合や、複雑なデータ操作や変更管理が求められる場合に特に有用です。適切なレプリケーション方式は、システムの要件と目標に基づいて選択する必要があります。
バックアップを効率的に取得・管理するための設計
スナップショットは、ある特定の時点でデータベースのコピーを作成することができる機能です。これにより、データの静止点を確保してバックアップや復旧操作を効率的に行うことができます。
スナップショットは、データベースがオンラインの状態で、アプリケーションの処理が継続されている間に実行されることが特徴です。スナップショットの取得方法はデータベース管理システムによって異なりますが、一般的には以下の手順で行われます:
- スナップショットの作成要求をデータベースに送信します。この要求は、バックアップを取得するための特定のパラメータやオプションを指定することもできます。
- データベースはスナップショットを作成するために必要なリソースを割り当てます。これには、データファイルやWALファイルの書き込み操作を一時停止することも含まれます。
- スナップショットが作成されると、静止点が確保されます。これにより、スナップショットの時点でのデータ状態をアプリケーションの処理に影響することなく安全に取得できます。
- スナップショットが作成された後、データファイルとWALファイルの更新操作が再開されます。
バックアップや復旧操作においてはスナップショットを使用することでいくつかの利点があります:
- スナップショットを使用することで、データベースがアクティブな状態である間にバックアップを取得することができます。これにより、システムの停止時間を最小限に抑えることができます。
- スナップショットは効率的に取得・管理することができるため、バックアップや復旧操作の処理時間を短縮することができます。
- スナップショットによって確保された静止点は、特定の時点でのデータの一貫性を保証するため、データの正確性と信頼性を高めることができます。
ただし、スナップショットの使用には注意も必要です。いくつかのデータベース管理システムでは、スナップショットの取得中に一時的なパフォーマンスの低下を経験する場合があります。また、スナップショットは通常、バックアップストレージ内でのデータの長期保持や複製ではなく、一時的な利用に適しています。
遠隔地サブサイトの構成と切替方法
参考:パターンp.59-68