6

あるデータベースのマスター テーブルのデータを同期して、他のデータベース (多くの場合、他のサーバー) のテーブルをクローンする必要が頻繁に生じます。たとえば、バックエンド システムが在庫データを管理し、その在庫データを最終的に Web サイト アプリケーションの一部である 1 つ以上のデータベースにプッシュする必要がある場合を考えてみましょう。

バックエンド システムのソース データは、多数のテーブルと外部キー制約を使用して大幅に正規化されています。これは、適切に設計された OLTP RDBMS システムです。問題のテーブルの多くには、数百万行が含まれています。このデータを他のデータベースに定期的にプッシュする必要があります。可能な限り頻繁に。遅延は許容できます。何よりも、バックエンド データベースとリモート データベースの両方のアップタイムを最大化することが不可欠です。

私は SQL Server を使用しており、変更の追跡、行バージョン、トリガーなどに精通しています。Microsoft は、これらのシナリオに対してレプリケーション、SyncFx、および SSIS を強く推奨していることを知っています。ただし、ベンダーのホワイトペーパーと概要で推奨されるテクノロジと、ソリューションの実際の実装、展開、および保守との間にはかなりの違いがあります。SQL Server の世界では、レプリケーションはターンキー ソリューションと見なされることがよくありますが、私は別のソリューションを模索しています。(レプリケーションは管理が難しく、スキーマの変更が難しくなり、再初期化が必要になった場合に重要なシステムに大きなダウンタイムが発生するのではないかという懸念があります。)

たくさんの落とし穴があります。多数のテーブル間の複雑な外部キー関係のため、キャプチャを実行する順序や更新を適用する順序を決定することは簡単ではありません。一意のインデックスが原因で、一度に行単位の更新が機能しないような方法で 2 つの行がインターロックされる場合があります (最終更新の前に各行に対して中間更新を実行する必要があります)。多くの場合、一意のインデックスは通常のインデックスに変更され、外部キーは無効にされる可能性があるため、これらは必ずしもショーストッパーではありません (ただし、外部キーを無効にすることは非常に望ましくありません)。多くの場合、SQL 2008 の変更追跡と SSIS または SyncFx を "そのまま" 使用するという話を耳にします。これらの種類の答えは、実際の困難を正当化するものではありません。(そしてもちろん、クライアントは、データのコピーがいかに難しいかについて頭を悩ませています。

この問題は、最終的には非常に一般的なものです。多くの行を持つ、関連性の高い多くのデータベース テーブルの一方向の同期を実行します。データベースに携わるほぼ全員が、この種の問題に対処する必要があります。ホワイトペーパーは一般的であり、実際の専門知識を見つけるのは困難です。これが難しい問題になる可能性があることはわかっていますが、仕事を終わらせる必要があります。あなたにとって何がうまくいったか(そして何を避けるべきか)について聞いてみましょう。Microsoft 製品または他のベンダーの製品に関する経験を教えてください。ただし、関連性の高い多数のテーブルと行を使用してソリューションを実際にテストしたことがない場合は、回答を控えてください。これは理論的なものではなく、実用的なものにしましょう。

4

1 に答える 1

7

serverfault.comで質問することをお勧めします(コメントを投稿できません。SOではスクリプトが壊れているため、完全な回答を投稿する必要があります)

更新: (Safari に切り替え、スクリプトが再び機能し、適切に投稿できるようになりました)

銀の弾丸はありません。使いやすさと「1 回の操作で」導入できるという点で、レプリケーションに勝るものはありません。競合の検出と解決を深くカバーし、スキーマ変更のプッシュをサポートし、セットアップと監視のための包括的なツール セットを備えた唯一のソリューションです。この「アジェンダ」が .Net 群集に引き継がれるまで、何年もの間、MS はデータ同期の代表的な存在でした。私の意見では、レプリケーションには 2 つの根本的な問題があります。

  • 変更をプッシュするために使用されるテクノロジーは原始的で、遅く、信頼性がありません。レプリカを開始するにはファイル共有が必要であり、実際にデータをレプリケートするのは T-SQL に依存しているため、あらゆる種類のスケーラビリティの問題が発生します。レプリケーション スレッドはサーバー ワーカー スレッドを使用し、レプリケーション スレッドが任意のテーブルやアプリケーション クエリと対話するという事実がブロッキングにつながります。そしてデッドロック。私が聞いた最大の展開は約 400 ~ 500 サイトで、超人的な MVP と最高額のコンサルタントによって行われています。これは、1500 サイトで開始される多くのプロジェクト (デプロイされた最大のレプリケーション プロジェクトをはるかに超える) で停止します。500 を超えるサイトに展開された SQL Server レプリケーション ソリューションをご存知でしょうか。
  • レプリケーションの比喩はデータ中心すぎます。分散アプリケーションの要件は考慮されていません。バージョン管理および形式化されたコントラクトの必要性、データの自律性「領地」、可用性とセキュリティ pov からの疎結合。その結果、レプリケーション ベースのソリューションは、「そこでデータを利用できるようにする」という差し迫った必要性を解決しますが、「私のアプリはあなたのアプリと対話する必要がある」という真の問題を解決できません。

スペクトルの反対側には、アプリケーション通信の問題に真に対処するソリューションがあります。たとえば、キュ​​ーに入れられたメッセージングに基づくサービスです。しかし、非常に遅く、通信メカニズム (Web サービスや msmq) とデータ ストレージ (comm と db 間の DTC トランザクション、一般的な高可用性の話、一般的な回復性の話など) の分離に根ざした問題に悩まされています。非常に高速で DB と完全に統合されたソリューションがMS スタックに存在しますが、その使用方法は誰も知りません。これらとレプリケーションの間のどこかに、OCS/Synch フレームワークや SSIS ベースのカスタム ソリューションなど、さまざまな中間ソリューションがあります。レプリケーションのセットアップと監視を容易にするものはありませんが、拡張性とパフォーマンスが向上する可能性があります。

私は、非常に大規模 (+1200 サイト、+1600 サイト) で「データ同期」を必要とするいくつかのプロジェクトに関与しました。私の解決策は、問題を「アプリケーション通信」の問題に変えることでした。この考え方に変わると、データ フローが「テーブル Y のキー X のレコード」ではなく、「顧客 Y による商品 X の購入を伝えるメッセージ」と見なされなくなり、ソリューションが理解しやすく適用しやすくなります。「FK 関係が壊れないように XYZ の順序でレコードを挿入する」という観点から考えるのではなく、代わりに「メッセージ XYZ で説明されているように購入を処理する」という観点から考えます。

私の見解では、レプリケーションとその派生物 (つまり、データ トラッキングとデータ グラム シッピング) は、'80 年のテクノロジとデータ/アプリケーションのビューに基づいたソリューションです。時代遅れの恐竜(そして決して鳥に変わることはありません)。

これがあなたのすべての(非常に正当な)懸念に対処し始めるわけではないことはわかっていますが、このトピックについて私が言わなければならない/暴言/暴言をすべて書き出すと、ペーパーバックのボリュームがいっぱいになります...

于 2009-06-26T15:13:06.000 に答える