フェイルオーバー時のMongoDBのレプリカ セットのロールバックに対応する方法


解説

MongoDBのレプリカ セットが使用される場合、ネットワークの問題のため、まれにレプリカ セットのフェイルオーバーによるロールバックが引き起されることがあります。この挙動の詳細な説明につきましては、MongoDBドキュメントおよびmLabのブログ投稿をご参照ください。もし、Sitecore XPが使用しているMongoDBデータベースでロールバックが発生した場合は、ロールバックによるデータ損失を復元することができます。

解決策

ロールバック ファイルからのデータを、自動でデータベースに適用する方法はありません。個別のドキュメントを確認し、それらをデータベース内にあるドキュメントと比較して、マージする必要があるかどうかをご確認いただく必要があります。以下のセクションでは、ロールバック データからのドキュメントをどのように扱うべきかについて記載します。

Analyticsデータベース内のIdentifiersコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、コレクション内のそのドキュメントのupdatedフィールドの値とロールバック データからのドキュメントを比較します。もしロールバック データからのドキュメントのupdatedフィールドのほうが新しい日時だった場合、コレクション内の既存のドキュメントを、ロールバック データからのドキュメントのバージョンで上書きします。

Analyticsデータベース内のDevicesコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、ロールバック データからのドキュメントのバージョンと一致するように既存のドキュメントを更新します。

Analyticsデータベース内のContactsコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、以下を実施します。

Analyticsデータベース内のOperationStatusesコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、ロールバック データからのバージョンと一致するように既存のドキュメントを更新します。

Analyticsデータベース内のLocationsコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、既存のドキュメントをロールバック データからのバージョンと一致するよう更新します。ロケーションのClassificationフィールドの値が変更されていた場合は、Sitecore.Analytics.Data.DataAccess.ClassificationクラスのUpdateVisitorClassification()メソッドを呼び出して、ロケーションの分類の変更により影響を受けたコンタクトの分類を更新する必要があります。このメソッドは、全てのロールバック ファイルを処理し、必要な変更をデータベース内のコレクションに適用した後に呼び出してください。

Analyticsデータベース内のUserAgentsコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在し、かつコレクション内のドキュメントのFetchedフィールドの日付がロールバック データからのドキュメントのFetchedフィールドの日付よりも前の日付である場合、既存のドキュメントをロールバック データからのバージョンと一致するよう更新してください。ドキュメントが更新されており、かつClassificationフィールドの値が変更されていた場合は、Sitecore.Analytics.Data.DataAccess.ClassificationクラスのUpdateVisitorClassification()メソッドを呼び出して、ユーザー エージェント分類の変更により影響を受けたコンタクトの分類を更新する必要があります。このメソッドは、全てのロールバック ファイルを処理し、必要な変更をデータベース内のコレクションに適用した後に呼び出してください。

Analyticsデータベース内のGeoIpsコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在し、かつコレクション内のドキュメントのFetchedフィールドの日付がロールバック データからのドキュメントのFetchedフィールドの日付よりも前の日付である場合、既存のドキュメントをロールバック データからのバージョンと一致するよう更新してください。ドキュメントが更新されており、かつClassificationフィールドの値が変更されていた場合は、Sitecore.Analytics.Data.DataAccess.ClassificationクラスのUpdateVisitorClassification()メソッドを呼び出して、GeoIP分類の変更により影響を受けたコンタクトの分類を更新する必要があります。このメソッドは、全てのロールバック ファイルを処理し、必要な変更をデータベース内のコレクションに適用した後に呼び出してください。

Analyticsデータベース内のReferrringSitesコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、 ロールバック データからのバージョンと一致するように既存のドキュメントを更新します。

Analyticsデータベース内のClassificationMapコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、既存のドキュメントは更新しないでください。既存のドキュメントは、ロケーションの分類、GeoIP、ユーザー エージェントの変更によって、関連するコンタクトの分類が影響を受ける場合、Sitecore.Analytics.Data.DataAccess.ClassificationクラスのUpdateVisitorClassification()メソッドの実行後に更新されます。

Analyticsデータベース内のInteractionsコレクション

_idのようなドキュメントがコレクションに存在しない場合、このドキュメントを手動で追加することはお薦めいたしません。新しいインタラクションがシステムに追加されたとき、システムは他のいくつかのコレクション内のデータも更新する必要があります。したがって、ドキュメントを手動で挿入するのではなく、Interaction Registry API(Sitecore.Analytics.Tracking.External.InteractionRegistryクラス)を使って、新しいインタラクションをプログラムで追加することをお薦めいたします。このAPIが使用された場合、インタラクションが追加されるとともに、関連するコレクション内のデータも適切に更新されます。
_idのようなドキュメントがコレクションに存在する場合、(コンタクトのマージが既存のインタラクションのドキュメントを編集できる唯一の操作であるため、)十中八九、コンタクトのマージの結果、ロールバック データ内に既にインタラクションが取り込まれていると考えられます。この場合、コレクション内のContactIdフィールドの値を、ロールバック データからのドキュメントのContactIdフィールドの値と一致するよう更新することが必要です。

Analyticsデータベース内のKeyBehaviorCacheコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、ドキュメントを手動でマージするのではなく、コンタクトのKey Behavior Cacheを再構築することをお薦めいたします。コンタクトのKey Behavior Cacheは、Sitecore.Analytics.Processing.Contact.KeyBehaviorCache.RebuildKeyBehaviorCacheWorkerクラスのProcess()メソッドを呼び出すことで再構築できます。

Analyticsデータベース内のAutomationStatesコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。
_idのようなドキュメントがコレクションに存在する場合、以下の対応のうちのいずれかを実施する必要があります。

Analyticsデータベース内のAutomationRangesコレクション

これは、エンゲージメント オートメーション関連のデータの処理を担当するコードによって使用されるシステム コレクションです。このコレクション内のデータを手動でマージすることはお薦めいたしません。

Analyticsデータベース内のHistoryTasksコレクション

このコレクション内のドキュメントは、Reportingデータベースの再構築中に作成されるものです。このコレクション内のドキュメントは手動で復元せず、代わりにReportingデータベースの再構築を検討してください。

Analyticsデータベース内のHistoryRangesコレクション

このコレクション内のドキュメントは、Reportingデータベースの再構築中に作成されるものです。このコレクション内のドキュメントは手動で復元せず、代わりにReportingデータベースの再構築を検討してください。

tracking_liveデータベース内のProcessingPoolコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。コレクションに新しいドキュメントを追加するのは、全てのロールバック ファイルを処理し、必要な変更をデータベース内のコレクションに適用した後にしてください。
_idのようなドキュメントがコレクションに存在する場合、何もする必要はありません。

tracking_liveデータベース内のTaskQueueコレクション

このコレクション内のデータを手動で復元するのではなく、ロールバック データ内のドキュメントを解析し、ロールバック データのTaskQueueコレクションにタスクを出現させる原因となった操作(ロケーションの分類の変更、コンタクトのエンゲージメント プランの状態間の移動など)を再度実行します。

tracking_contactデータベース内のProcessingPoolコレクション

_idのようなドキュメントがコレクションに存在しない場合、ロールバック データからのドキュメントをコレクションに追加します。コレクションに新しいドキュメントを追加するのは、全てのロールバック ファイルを処理し、必要な変更をデータベース内のコレクションに適用した後にしてください。
_idのようなドキュメントがコレクションに存在する場合、何もする必要はありません。

tracking_historyデータベース内のProcessingPoolコレクション

このコレクション内のドキュメントは、Reportingデータベースの再構築中に作成されるものです。このコレクション内のドキュメントは手動で復元せず、代わりにReportingデータベースの再構築を検討してください。