2

イニシャルとデルタを使用してリモートデータセットをミラーリングするシステムに取り組んでいます。イニシャルが入ると、既存のものを一括削除し、新しいデータを一括挿入します。デルタが発生すると、システムはそれを更新、挿入、および削除に変換するための一連の作業を実行します。イニシャルとデルタは、データの整合性を維持するために長いトランザクション内で処理されます。

残念ながら、現在のソリューションはあまりうまくスケーリングしていません。トランザクションは非常に大規模で長時間実行されるため、RDBMSはさまざまな競合の問題で行き詰まります。また、デルタがどのように適用されるかについての適切な監査証跡がないため、データセットのローカルバージョンとリモートバージョンが同期しなくなる原因となる問題のトラブルシューティングが困難になります。

1つのアイデアは、トランザクションでイニシャルとデルタをまったく実行せず、代わりに、どのデルタまたはイニシャルから来たかを示すバージョン番号を各レコードに添付することです。イニシャルまたはデルタが正常にロードされると、データセットの新しいバージョンが利用可能であることをアプリケーションに警告できます。

これは、初期およびデルタから特定のバージョンまでのデータセットのビューをどのように正確に構成するかという問題を残すだけです。(AppleのTimeMachineは同様のことを行い、ファイルシステムのハードリンクを使用して特定の時点の「ビュー」を作成します。)

この種の問題を解決したり、この特定のソリューションを実装したりした経験のある人はいますか?

ありがとう!

4

2 に答える 2

0

1つのライターと複数のリーダーデータベースがあります。書き込みを1つのデータベースに送信し、まったく同じ変更を他のすべてのデータベースに伝播させます。リーダーデータベースは結果整合性があり、更新にかかる時間は非常に速くなります。私はこれが1日あたり100万ページビュー以上になる環境で行われるのを見てきました。非常にスケーラブルです。すべての読み取りデータベースの前にハードウェアルーターを配置して、それらの負荷を分散することもできます。

于 2011-05-13T16:46:15.983 に答える
0

試した人に感謝します。

ここで終わる他の人のために、私は問題の各テーブルに「dataset_version_id」と「dataset_version_verb」列を追加するソリューションのベンチマークを行っています。次に、特定のレコードを取得するときに、ストアドプロシージャ内の相関サブクエリを使用して、現在のdataset_version_idを取得します。レコードの最新バージョンに「delete」のdataset_version_verbがある場合、WHERE句によって結果から除外されます。

このアプローチでは、これまでのところ平均で約80%のパフォーマンスヒットがあり、これは私たちの目的には受け入れられる可能性があります。

于 2011-05-16T18:03:55.147 に答える