この節では、レプリケーションに関する問題の一般的な分析手順を紹介します。レプリケーションの動作方法およびレプリケーションデータの収集に使用可能なツールについて説明します。
レプリケーションは、複数の参加者が関与するトポロジ規模の機能です。この理由で、レプリケーションに関する問題のトラブルシューティングでは、トポロジ内でレプリケーションが停止したポイント、および破壊されたレプリケーションアグリーメントを確認する必要があります。
レプリケーションは次のように動作します。
マスターが変更を受信します。変更がデータベース内のエントリに適用されると、サーバーがマスターであるため、サーバーにより更新履歴ログデータベース内に変更が格納されます。
マスターが、メモリー内のレプリカ更新ベクトル (RUV) を更新します。
マスターが、新しい変更が更新履歴ログに記録されたことをレプリケーションスレッドに通知します。
これらのレプリケーションスレッドは、レプリケーションパートナーと通信して情報を伝達します。
たとえば、マスター 1 は変更を受信し、エントリに適用して、更新履歴ログを更新します。マスター 1 上のスレッドがコンシューマと通信すると、コンシューマは自身の RUV 情報をマスターに示します。マスターは RUV を参照してメモリー内部の RUV と比較し、コンシューマよりも新しい変更が含まれるかどうかを確認します。たとえば、コンシューマの RUV の方が新しい情報を持っている場合は、変更を送信しません。マスターに新しい変更が含まれる場合、マスターは更新を実行できるように、レプリカ ID 1 のロックを求める別の要求をコンシューマに送信します。ロックできない場合は、更新は延期されます。ロック可能な場合、マスターは変更の処理に進むことができます。
レプリケーションは逐次的です。つまり、エントリのレプリケーションは順番に実行されます。レプリケーションは順番に実行されるため、マスターにより生成されたすべての変更に、変更シーケンス番号 (CSN) が付けられます。この番号は、マルチマスタートポロジ内部のすべての変更で一意です。CSN は 16 進数で、次のようにログに表示されます。
41e6ee93000e00640000 |
この 16 進数の最初の 8 桁は、マスターで変更が生成された時刻を表します。時刻は、1970 年 1 月 1 日からの経過時間 (秒) で表されます。
次の 4 桁は、シーケンス番号、つまり現在の秒で変更が発生した順番です。たとえば、秒 41e6ee93 の間に複数の変更が発生する場合があります。シーケンス番号は、この秒のどの時点で変更が発生したかを示します。
次の 4 桁は、最初に変更を受信したマスターのレプリカ ID を示します。
最後の 4 桁は常に 0000 になります。
CSN が生成されるのは、ローカルトラフィックによって新しい変更がレプリカに取り込まれるときだけです。このため、更新を受信するマスターだけが CSN を生成します。受信する更新はすべてレプリケーションを介して実行されるため、コンシューマは常にマスターを参照します。
トラブルシューティングの際は、遅延の原因となった CSN を検索してみてください。遅延に関係する CSN を検索するには、レプリカ更新ベクトル (RUV) を使用する必要があります。RUV については、次の節で説明します。
レプリケーショントポロジ内のすべてのレプリカは、現在のレプリケーション状態をレプリカ更新ベクトル (RUV) に格納します。RUV は、実行中のプロセスによりメモリー内に格納され、このレプリカが保持する自分自身およびレプリケーショントポロジ内のほかの参加者すべての正確な情報を提供します。指定されたサーバーの RUV エントリの各行には、レプリケーショントポロジに参加しているマスターが含まれます。各行には、いずれかのマスターの識別子、レプリカの URL、およびサーバーで実行された最初と最後の変更の CSN が含まれます。CSN には、サーバーが検出した最初と最後の変更だけが記録されます。マスターにより実行された最新の変更が記録されるとは限りません。
RUV エントリの状態は、次に示すエントリ内で 30 秒ごとに物理的に更新されます。
nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff,suffix-name |
RUV はメモリーにも格納されます。この RUV にアクセスするには、cn=replica,cn=suffix,cn=mapping tree,cn=config エントリに対して ldapsearch を使用します。たとえば、ldapsearch を ou=people サフィックスに対して実行すると、次のような結果が生成されます。
# ldapsearch -h host1 -p 1389 -D cn=Directory Manager -w secret \ -b cn=replica, cn=ou=people,cn=mapping tree,cn=config -s base objectclass=* nsds50ruv nsds50ruv: {replicageneration} 45e8296c000000010000 nsds50ruv: {replica 1 ldap://server1:1389} 45ed8751000000010000 4600f252000000010000 nsds50ruv: {replica 2 ldap://server1:2389} 45eec0e1000000020000 45f03214000000020000 |
わかりやすいように、ここからは RUV の構文を CSNchange-number -replica-id に簡略化します。change-number は、マスターで発生した一連の変更のうち、どの変更が RUV に対応するかを示します。たとえば、45ed8751000000010000 は CSN05-1 と記述できます。前の例では、マスター 1 には次の RUV が含まれています。
replica 1: CSN05-1 CSN43-1 replica 2: CSN05-2 CSN40-2 |
最初の行は、レプリカ ID 1 で示されるこのレプリカ自身 (マスター 1) から入手した、このレプリカが認識している最初と最後の変更の情報を示します。2 番目の行は、マスター 2 から入手した、このレプリカが認識している最初と最後の変更の情報を示します。注目すべき情報は、最後の変更の方です。通常の操作では、受信した更新についてマスター 1 はマスター 2 より多くの情報を持っています。この点をマスター 2 の RUV で確認してみましょう。
replica 2: CSN05-2 CSN50-2 replica 1: CSN01-1 CSN35-1 |
最後の変更を参照すると、マスター 2 は受信した最後の変更 (CSN50-2) について、マスター 1 (最後の変更が CSN40-2 で発生したとしている) より多くの情報を持っていることがわかります。それに対して、マスター 1 はその最後の変更 (CSN43-1) について、マスター 2 (CSN35-1) より多くの情報を持っています。
レプリケーションの問題のトラブルシューティングでは、CSN は問題を識別するのに役立ちます。マスター 1 は常に、自身のレプリカ ID について、レプリケーショントポロジ内のほかの参加者と同程度以上の情報を持っています。変更は最初にマスター 1 に適用されてからレプリケートされるからです。このため、CSN43-1 は、トポロジ内のレプリカ ID 1 に関連付けられる最大の値になります。
たとえば、30 分後にマスター 1 上の RUV が依然として CSN40-2 であるにもかかわらず、マスター 2 上の RUV が CSN67-2 と大幅に大きくなる場合、問題が発生したと見なされます。これは、マスター 2 からマスター 1 へのレプリケーションが実行されていないことを示します。
障害が発生したため、可能なかぎり多くのデータを保存して、トポロジを再初期化することが必要になった場合は、RUV ピクチャーを使って最新の変更を含むマシンを判別できます。たとえば、前述のレプリケーショントポロジでは、次の RUV を含むハブが存在します。
2: CSN05-2 CSN50-2 1: CSN05-1 CSN43-1 |
この場合、ハブ 1 は最新の変更を提供する有力な候補と考えられます。
サーバーが停止すると、nsds50ruv 属性は cn=replica エントリには格納されません。すでに説明したように、これは少なくとも 30 分ごとに、nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff, suffix-name エントリに LDAP サブエントリとして格納されます。この情報をファイルにエクスポートするにはこの方法しか存在しないため、この情報は設定ファイルではなくサフィックスに格納されます。トポロジの初期化時にサーバーがオフラインであると、このことが発生します。データは LDIF ファイルにエクスポートされてから、再インポートされます。この属性がエクスポートされたファイルに格納されていない場合、インポート後に新しいレプリカは正しい情報を保持しません。
db2ldif -r コマンドを使用する場合は、常に nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff, suffix-name エントリが含まれます。
Directory Server Version 6.0 以降では、前の節で説明したように、nsds50ruv 属性を使用してコンシューマの内部状態を表示することもできます。レプリケーション優先順位機能を使用している場合は、ds6ruv 属性を使用できます。この属性には優先順位操作に関する情報が含まれます。レプリケーション優先順位を設定する場合は、レプリケーションルールを作成して特定の変更 (ユーザーパスワードの更新など) が高い優先順位でレプリケートされるように指定できます。たとえば、RUV は次のように表示されます。
nsds50ruv: {replicageneration} 4405697d000000010000 nsds50ruv: {replica 2 ldap://server1:2389} nsds50ruv: {replica 1 ldap://server1:1390} 440569aa000000010000 44056a23000200010000 ds6ruv: {PRIO 2 ldap://server1:2389} ds6ruv: {PRIO 1 ldap://server1:1390} 440569b6000100010000 44056a30000800010000 |
レプリケーション情報を表示するには、次のファイルをエクスポートします。
# dsadm export instance-path suffix-dn [suffix-dn] ldif-file |
レプリケーションエラーが発生した場合、レプリケーショントポロジから最小限のデータを収集する必要があります。
アクセスログ、エラーログ、および監査ログ (使用可能な場合) から情報を収集する必要があります。エラーログを収集する前に、レプリケーション情報を保持するためのログレベルを調整します。レプリケーションが含まれるようにエラーログレベルを設定するには、次のコマンドを使用します。
# dsconf set-log-prop ERROR level:err-replication |
Directory Server 5.x で、コンソールを使ってエラーログレベルを設定します。
insync コマンドは、サプライヤレプリカと 1 つ以上のコンシューマレプリカ間の同期状態に関する情報を提供します。このコマンドは、レプリカの RUV を比較して、サーバー間の時間のずれまたは遅延を秒単位で表示します。
たとえば、次のコマンドは 30 秒ごとに状態を表示します。
$ insync -D cn=admin,cn=Administrators,cn=config -w mypword \ -s portugal:1389 30 ReplicaDn Consumer Supplier Delay dc=example,dc=com france.example.com:2389 portugal:1389 0 dc=example,dc=com france.example.com:2389 portugal:1389 10 dc=example,dc=com france.example.com:2389 portugal:1389 0 |
出力を分析して、レプリケーションの遅延がゼロではなくなる時点を確認します。上の例では、レプリケーションの遅延が 10 に変化しており、コンシューマがサプライヤより 10 秒遅れていることを示しているため、コンシューマ france.example.com とサプライヤ portugal 間でレプリケーションの問題が存在する可能性が見て取れます。この遅延の進み具合を継続的に観察します。この遅延が比較的安定しているか、減少していくようであれば、問題はないと結論できます。しかし、時間の経過とともに遅延が増大していくようであれば、レプリケーションが停止する可能性があります。
insync コマンドの詳細については、insync(1) のマニュアルページを参照してください。
repldisc コマンドは、RUV を使用して既知のレプリカすべてのグラフを作成して、レプリケーショントポロジを表示します。次に、トポロジを表す隣接行列を出力します。このコマンドによりマシン名とその接続が表示されるため、insync ツールの出力を読み取るのが容易になります。Directory Server Version 6.0 以降でこのコマンドを実行するには、次のようにします。
# /opt/SUNWdsee/ds6/bin/repldisc -D cn=Directory Manager -w password -b replica-root -s host:port |
Directory Server Version 5.x でこのコマンドを実行するには、次のようにします。
# install-root /shared/bin/repldisc -D cn=Directory Manager -w password -b replica-root -s host:port |
次に repldisc コマンドの出力例を示します。
$ repldisc -D cn=admin,cn=Administrators,cn=config -w pwd \ -b o=rtest -s portugal:1389 Topology for suffix: o=rtest Legend: ^ : Host on row sends to host on column. v : Host on row receives from host on column. x : Host on row and host on column are in MM mode. H1 : france.example.com:1389 H2 : spain:1389 H3 : portugal:389 | H1 | H2 | H3 | ===+=============== H1 | | ^ | | ---+--------------- H2 | v | | ^ | ---+--------------- H3 | | v | | ---+--------------- |
この例では、2 つのマスターが 2 つのホストにレプリケートされて、そこから 5 つのコンシューマにレプリケートされます。
レプリケーションは正常に機能せず、致命的なエラーがコンシューマ 4 のログに表示されます。
ただし、レプリケーションはトポロジ規模の機能であるため、トポロジ内のほかのコンシューマでも問題が発生しているかどうかを確認します。コンシューマ 3 と 5 でもエラーログに致命的なエラーが存在していることが判明します。この情報を使って、コンシューマ 3、4、5、ハブ 2 と 3、およびマスター 1 と 2 が問題に関係している可能性があることがわかります。コンシューマ 1 と 2 およびハブ 2 には問題がないと推測できます。
この問題のデバッグを行うには、少なくとも次のレプリケーション参加者から次に示す情報を収集する必要があります。
insync および repldisc コマンドを使用して得た、トポロジ規模のデータ。
マスター 1 と 2、およびコンシューマ 4 の RUV を使用して得た、ブロックしている CSN に関する情報。
問題に関与している可能性のある各参加者の情報。ブロックしている CSN が作成された日付に関係する dse.ldif、nsslapd -V、access ログと errors ログ (レプリケーションを有効に設定) を含む。
正しく機能しており、問題に関与していないと思われるレプリケーション参加者の情報。dse.ldif、nsslapd -V、および access ログと errors ログ (レプリケーションを有効に設定) を含む。
このデータを使って、遅延の始まりを特定できます。insync コマンドの出力を参照すると、ハブ 2 からの遅延が 3500 秒になっていることがわかります。このため、問題はここから始まった可能性があります。ここで、nsds50ruv 属性の RUV を使って、遅延を発生させた操作を特定できます。トポロジの全域で RUV を参照して、コンシューマに表示された最後の CSN を確認します。この例では、マスター 1 には次の RUV が含まれます。
replica 1: CSN05-1 CSN91-1 replica 2: CSN05-2 CSN50-2 |
マスター 2 には、次の RUV が含まれます。
replica 2: CSN05-2 CSN50-2 replica 1: CSN05-1 CSN91-1 |
これらは、完全に同期しているように見えます。ここで、コンシューマ 4 の RUV を参照します。
replica 1: CSN05-1 CSN35-1 replica 2: CSN05-2 CSN50-2 |
問題は、マスター 1 の CSN 35 に関する変更の次の変更に関係していると考えられます。CSN 35 に関する変更は、これまでコンシューマ 4 にレプリケートされたもっとも古い CSN に対応しています。CSN35–01 上のレプリカのアクセスログに対して grep コマンドを実行することで、問題が発生した時期を特定できます。トラブルシューティングは、この時点から開始してください。
「問題の範囲の定義」で説明したように、問題の発生時点を特定するのに役立つ情報を稼働中のシステムから入手すると有益です。このため、期待どおりに動作しているハブ 1 とコンシューマ 1 からデータを収集します。稼働中のサーバーから得たデータを比較し、問題が発生した時点に注目することで、相違点を識別できます。たとえば、ハブが別のマスターまたはサブネットからレプリケートされていたり、レプリケーションの問題が発生した変更の直前に別の変更がハブに含まれていたりすることがあります。
問題の徴候に応じて、トラブルシューティングの方法も異なります。
たとえば、コンシューマのアクセスログに何も表示されないが、ネットワークの問題が原因でレプリケーション障害が発生することがあります。再初期化は必要ありません。
更新履歴ログ内に特定のエントリが見つからないことがエラーログに示される場合は、マスターの更新履歴ログは最新のものではありません。トポロジの再初期化が必要かどうかは、最新の更新履歴ログがレプリケーショントポロジ (ハブやほかのマスターなど) 内にあるかどうかによります。
ループの処理やロックの中止など、コンシューマで問題が発生した場合は、アクセスログを参照して、特定の CSN で数多く実行されている再試行を見つけます。replck ツールを実行してレプリケーション停止の原因となった CSN を特定し、更新履歴ログ内でこのエントリを修復します。