30.3. データのレプリケーション
レプリケーションを使用すると、ライブとバックアップサーバーのペアが同じデータディレクトリーを共有せず、すべてのデータ同期がネットワーク経由で行われます。したがって、ライブサーバーが受信したすべての (永続的な) データがバックアップに複製されます。
ライブサーバーが正常にシャットダウンされると、バックアップサーバーがアクティブになり、クライアントはバックアップにフェイルオーバーします。この動作は事前に決定し、データのレプリケーション使用時に設定することはできません。
バックアップサーバーは、最初にライブサーバーのすべての既存データを同期してから置き換える必要があります。したがって、共有ストレージとは異なり、複製バックアップは、起動直後に完全に機能する訳ではありません。同期にかかる時間は、同期されるデータ量とネットワーク速度によって異なります。また、バックアップが起動すると、クライアントは initial-replication-sync-timeout
の間ブロックされることに注意してください。このタイムアウトが過ぎると、同期が完了しない場合でもクライアントのブロックが解除されます。
フェイルオーバーが成功すると、バックアップのジャーナルは、ライブサーバーのデータよりも新しいデータの保持を開始します。フェイルバックを実行し、再起動後にライブサーバーになるように元のライブサーバーを設定できます。フェイルバックは、ライブサーバーがオンラインに戻る前に、バックアップサーバーとライブサーバーの間でデータを同期します。
両方のサーバーがシャットダウンしている場合、管理者はどのサーバーのジャーナルに最新データがあるかを判断する必要があります。バックアップジャーナルに最新のデータがある場合は、そのジャーナルをライブサーバーにコピーします。最新データがない場合は、再度アクティブになるたびに、バックアップはライブサーバーから古いジャーナルデータを複製し、独自のジャーナルデータを削除します。ライブサーバーのデータが最新の場合、アクションは不要で、サーバーを正常に起動できます。
レイテンシーが高く、データセンター間のネットワークが信頼できない可能性があるため、データセンター間の高可用性に複製ジャーナルの設定と使用は推奨されず、サポートされていません。
ライブとバックアップの複製ペアは、クラスターの一部である必要があります。cluster-connection
設定要素は、バックアップサーバーがライブ一致を見つける方法を定義します。
レプリケーションには、ネットワーク分離のリスクを軽減するには、少なくとも 3 つのライブ/バックアップペアが必要ですが、このリスクを排除することはできません。3 つ以上のライブ/バックアップのペアを使用する場合、クラスターはクォーラム voting を使用して 2 つのライブブローカーを使用しないようにすることができます。
cluster-connection
を設定する場合は、以下の詳細を確認してください。
- ライブサーバーとバックアップサーバーはいずれも同じクラスター内に含まれる必要があります。単純なライブ/バックアップ複製ペアでも、クラスター設定が必要になることに注意してください。
- クラスターのユーザーとパスワードは、ペアの各サーバーで一致している必要があります。
<master>
および <slave>
要素の両方に group-name
属性を設定して、ライブ/バックアップサーバーのペアを指定 し ます。バックアップサーバーは、同じ group-name
を共有するライブサーバーにのみ接続します。
group-name
を使用する例として、ライブサーバーと 3 つのバックアップサーバーがあるとします。ライブサーバーはそれぞれ独自のバックアップとペアする必要があるため、以下のグループ名を割り当てます。
-
live1 および backup1 は、
pair1
のgroup-name
を使用します。 -
live2 および backup2 は、
pair2
のgroup-name
を使用します。 -
live3 および backup3 は、
pair3
のgroup-name
を使用します。
上記の例では、サーバー backup1
は同じ group-name
、pair1
でライブサーバーを検索します。この場合は、サーバーは live1
です。
共有ストアの場合と同様に、ライブサーバーが停止またはクラッシュすると、複製するペアのバックアップがアクティブになり、そのロールを引き継ぎます。特に、ライブサーバーへの接続が失われると、ペアのバックアップがアクティブになります。これは、一時的なネットワークの問題が原因でも発生することがあるため、問題となる可能性があります。この問題に対処するために、ペアのバックアップは、クラスター内の他のサーバーにまだ接続できるかどうかを判断しようとします。半分を超えるサーバーに接続できる場合、アクティブになります。ライブサーバーのほか、クラスター内の半分を超える他のサーバーとの通信が失われた場合、ペアのバックアップは待機し、ライブサーバーとの再接続を試みます。これにより、バックアップサーバーとライブサーバーの両方がメッセージを処理し、一方がそれに気付かないスプリットブレイン状況のリスクが軽減されます。
これは、ライブサーバーが見つからず、ジャーナルのファイルロックが解放された場合にバックアップがアクティブになり、クライアント要求の処理を開始する共有ストアバックアップとの重要な違いです。また、レプリケーションでは、バックアップサーバーは、保持している可能性のあるデータが最新であるかどうかがわからないため、自動的にアクティブ化することを決定できないことに注意してください。保持しているデータを使用して複製バックアップサーバーをアクティブにするには、管理者はスレーブをマスターに変更することで、設定を変更してライブサーバーにする必要があります。
30.3.1. データのレプリケーションの設定
以下の 2 つの例は、my-cluster
という名前のクラスターと group1
という名前のバックアップグループに存在するライブサーバーとバックアップサーバーの両方の基本設定を示しています。
以下の手順では、管理 CLI を使用して my-cluster
という名前のクラスターと group1
という名前のバックアップグループに存在するライブサーバーとバックアップサーバーの両方の基本設定を提供します。
以下の例は、standalone-full-ha
設定プロファイルを使用して JBoss EAP を実行していることを前提とします。
管理 CLI コマンドを使用して、データレプリケーションにライブサーバーを設定する
ha-policy
をライブサーバーに追加します/subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(check-for-live-server=true,cluster-name=my-cluster,group-name=group1)
/subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(check-for-live-server=true,cluster-name=my-cluster,group-name=group1)
Copy to Clipboard Copied! check-for-live-server
属性は、指定された ID を持つ他のサーバーがクラスター内にないことを確認するようにライブサーバーに指示します。JBoss EAP 7.0 では、この属性のデフォルト値はfalse
でした。JBoss EAP 7.1 以上では、デフォルト値はtrue
です。ha-policy
をバックアップサーバーに追加します/subsystem=messaging-activemq/server=default/ha-policy=replication-slave:add(cluster-name=my-cluster,group-name=group1)
/subsystem=messaging-activemq/server=default/ha-policy=replication-slave:add(cluster-name=my-cluster,group-name=group1)
Copy to Clipboard Copied! 共有された
cluster-connection
が存在することを確認します。ライブサーバーとバックアップサーバーの間の適切な通信には
cluster-connection
が必要です。以下の管理 CLI コマンドを使用して、同じcluster-connection
がライブサーバーとバックアップサーバーの両方に設定されていることを確認します。この例では、standalone-full-ha
設定プロファイルにあるデフォルトのcluster-connection
を使用しています。ほとんどの場合、これで十分なはずです。クラスター接続の設定方法の詳細は、クラスター接続の設定 を参照してください。以下の管理 CLI コマンドを使用して、ライブおよびバックアップサーバーの両方で同じ cluster-connection を使用していることを確認します。
/subsystem=messaging-activemq/server=default/cluster-connection=my-cluster:read-resource
/subsystem=messaging-activemq/server=default/cluster-connection=my-cluster:read-resource
Copy to Clipboard Copied! cluster-connection
が存在する場合、出力は現在の設定を提供します。存在しない場合は、エラーメッセージが表示されます。
すべての設定属性の詳細は、すべてのレプリケーション設定 を参照してください。
30.3.2. すべてのレプリケーション設定
管理 CLI を使用して、追加された後、ポリシーに設定を追加できます。これを実行するコマンドは、以下の基本構文に従います。
/subsystem=messaging-activemq/server=default/ha-policy=POLICY:write-attribute(name=ATTRIBUTE,value=VALUE)
/subsystem=messaging-activemq/server=default/ha-policy=POLICY:write-attribute(name=ATTRIBUTE,value=VALUE)
たとえば、restart-backup
属性の値を true
に設定するには、以下のコマンドを使用します。
/subsystem=messaging-activemq/server=default/ha-policy=replication-slave:write-attribute(name=restart-backup,value=true)
/subsystem=messaging-activemq/server=default/ha-policy=replication-slave:write-attribute(name=restart-backup,value=true)
以下の表は、replication-master
ノードと replication-slave
設定要素の HA 設定属性を示しています。
属性 | 説明 |
---|---|
check-for-live-server |
|
cluster-name | レプリケーションに使用されるクラスターの名前。 |
group-name |
設定されている場合、バックアップサーバーは、 |
initial-replication-sync-timeout |
開始レプリケーションが同期されるまでの待機時間 (ミリ秒単位)。デフォルトは |
synchronized-with-backup | ライブサーバーとレプリケーションサーバーのジャーナルが同期されているかどうかを示します。 |
属性 | 説明 |
---|---|
allow-failback |
別のサーバーがこのサーバーを引き継ぐ要求を送信したときに、このサーバーが自動的に停止するかどうか。通常のユースケースは、再起動または障害復旧後に、ライブサーバーがアクティブなプロセスの再開を要求する場合です。 |
cluster-name | レプリケーションに使用されるクラスターの名前。 |
group-name |
設定されている場合、バックアップサーバーは、 |
initial-replication-sync-timeout |
開始レプリケーションが同期されるまでの待機時間 (ミリ秒単位)。デフォルトは |
max-saved-replicated-journal-size |
起動時にファイルを移動した後に、レプリケートされたバックアップサーバーが再起動できる回数を指定します。最大値に達した後、サーバーはフェイルバックすると永久に停止します。デフォルトは |
restart-backup |
|
synchronized-with-live | レプリケーションサーバーのジャーナルがライブサーバーと同期されているかどうか (ライブサーバーを安全にシャットダウンできるかどうか) を示します。 |
30.3.3. クラスター接続タイムアウトの防止
ライブとバックアップのペアはそれぞれ cluster-connection
を使用して通信します。cluster-connection
の call-timeout
属性は、クラスターの別のサーバーへの呼び出し後にサーバーが応答を待機する時間を設定します。call-timeout
のデフォルト値は 30 秒で、ほとんどの場合、これで十分です。ただし、バックアップサーバーが、ライブサーバーから送信されるレプリケーションパケットを処理できない状況があります。これは、たとえば、ディスク操作が遅いため、または journal-min-files
の値が大きいために、ジャーナルファイルの最初の事前作成に時間がかかりすぎる場合に発生することがあります。このようなタイムアウトが発生すると、ログに次のような行が表示されます。
AMQ222207: The backup server is not responding promptly introducing latency beyond the limit. Replication server being disconnected now.
AMQ222207: The backup server is not responding promptly introducing latency beyond the limit. Replication server being disconnected now.
上記のような行がログに表示された場合は、レプリケーションのプロセスが停止していることを意味します。レプリケーションを再度開始するには、バックアップサーバーを再起動する必要があります。
クラスター接続のタイムアウトを防ぐには、以下のオプションを考慮してください。
-
cluster-connection
のcall-timeout
を増やします。詳細は、クラスター接続の設定 を参照してください。 -
journal-min-files
の値を減らします。詳細は、永続性の設定 を参照してください。
30.3.4. 古いジャーナルディレクトリーの削除
バックアップサーバーは、ライブサーバーとの同期を開始すると、ジャーナルを新しい場所に移動します。デフォルトでは、ジャーナルディレクトリーは EAP_HOME/standalone
の data/activemq
ディレクトリーに置かれます。ドメインの場合、各サーバーは EAP_HOME/domain/servers
の下に独自の serverX/data/activemq
ディレクトリーを持っています。ディレクトリーの名前は、bindings
、journal
、largemessages
、paging
です。これらのディレクトリーの詳細は、永続性の設定 と ページングの設定 を参照してください。
移動すると、新しいディレクトリーの名前が oldreplica.X
に変更されます。X
は数字の接尾辞です。新しいフェイルオーバーにより別の同期が開始されると、moved ディレクトリーの接尾辞が 1 増えます。たとえば、最初の同期では、ジャーナルディレクトリーは oldreplica.1
に移動され、2 回目は oldreplica.2
、といったように移動されます。元のディレクトリーは、ライブサーバーから同期したデータを保存します。
デフォルトでは、バックアップサーバーは、フェイルオーバーとフェイルバックの 2 つの発生を管理するように設定されています。その後、クリーンアッププロセスがトリガーされ、oldreplica.X
ディレクトリーが削除されます。バックアップサーバーの max-saved-replicated-journal-size
属性を使用して、クリーンアッププロセスをトリガーするフェイルオーバーの発生回数を変更できます。
ライブサーバーには、max-saved-replicated-journal-size
が 2
に設定されます。この値は変更できません
30.3.5. 専用ライブサーバーとバックアップサーバーの更新
ライブサーバーとバックアップサーバーが専用のトポロジーにデプロイされ、そこで各サーバーが JBoss EAP の独自のインスタンスで実行されている場合は、以下の手順に従ってクラスターのスムーズな更新と再起動を行ってください。
- バックアップサーバーを正常にシャットダウンします。
- ライブサーバーを正常にシャットダウンします。
- ライブサーバーとバックアップサーバーの設定を更新します。
- ライブサーバーを起動します。
- バックアップサーバーを起動します。
30.3.6. データのレプリケーションの制限: スプリットブレイン処理
スプリットブレイン状態は、ライブサーバーとそのバックアップの両方が同時にアクティブなときに発生します。両方のサーバーがクライアントおよびプロセスメッセージを処理し、一方はそれに気付きません。この場合、ライブサーバーとバックアップサーバーの間でメッセージのレプリケーションは行われなくなります。2 つのサーバー間でネットワーク障害が発生すると、スプリット状況が発生する可能性があります。
たとえば、ライブサーバーとネットワークルーター間の接続が切断されると、バックアップサーバーはライブサーバーへの接続を失います。ただし、バックアップはクラスター内の半分以上のサーバーに引き続き接続できるため、アクティブになります。ライブ/バックアップのペアが 1 つのみで、バックアップサーバーがライブサーバーへの接続を失った場合にも、バックアップがアクティブになることに注意してください。両方のサーバーがクラスター内でアクティブな場合、2 つの望ましくない状況が発生する可能性があります。
- リモートクライアントはバックアップサーバーにフェイルオーバーしますが、MDB などのローカルクライアントはライブサーバーを使用します。両方のノードでのジャーナルが完全に別になるため、スプリットブレイン処理が生じます。
- ライブサーバーへの接続の切断は、リモートクライアントがバックアップサーバーにフェイルオーバーした後に修正されます。古いクライアントは引き続きバックアップを使用し続け、新しいクライアントはライブサーバーに接続するので、これもスプリットブレインの状況が生じます。
お客様は、ライブサーバーとバックアップサーバーの各ペア間に信頼できるネットワークを実装して、データのレプリケーション使用時のスプリットブレイン処理のリスクを軽減する必要があります。たとえば、複製したネットワークインターフェイスカードや、その他のネットワーク冗長性を使用します。