web-dev-qa-db-ja.com

双方向のデータ同期のベストプラクティス/パターン

私の仕事では、データベースシステム間の双方向のデータ同期のアイデアがよく生まれます。古典的な例は、わずかに異なる2つのCRMシステム(Raiser's EdgeとSalesforceなど)であり、それらの間で連絡先データを双方向で同期する必要があります。

APIに関する考慮事項はさておき、同期する共有キーがあると想定し、採用するアルゴリズム/パターンを純粋に考えている場合、これは技術者以外の人には過小評価されているタスクです。

たとえば、次の点に注意する必要があります。

  • 両方のシステムで変更されたレコードを簡単に検出できますか(または、システム間ですべてのレコードを比較して変更を検出する必要があります)
  • N時間に1回の同期を行う場合は、両方のシステムで同じレコードがほぼ同時に変更される競合に対処する方法
  • リアルタイム同期を行う場合(つまり、一方のシステムでの更新がすぐに他方のシステムへの更新をトリガーする)、バグまたはシステムクラッシュによる時間の経過に伴う分岐を処理する方法

個人的に私はこれらすべてに取り組む方法を考えることができますが、私が参照できる既知のパターン、文献、またはベストプラクティスがあるかどうか疑問に思っています。

53
codeulike

はい、難しい問題です。簡単に過小評価されています。そして、多くの仕事になる可能性があります。 Microsoftテクノロジを使用している場合は、Microsoft Sync Framework here および here を参照することをお勧めします。

8
codingoutloud

リモートサイトのDB同期については、多くの理論があります。まず、INSERTから始めます。これを処理するのは簡単です-すべてのサイトに一意のIDを作成できるため(たとえば、サイト名+ ID(番号)のイニシャル:site_a_177とsite_b_53の比較)

したがって、挿入によって競合が発生することはありません。問題はアップデートです。 100%失敗を証明する方法があるとは思いませんが、リモートDBのレコードを「ロック」して、ハンドルを取得した後でのみ更新を開始できます-更新を続行し、更新を同期して終了しますその後、ロックを解除します。

0
alfasin