質問

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

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

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

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

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

ありがとう!

役に立ちましたか?

解決 2

試してくれた人に感謝します。

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

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top