問題
- バルクロード時の単一テーブルのアトミック性: 一般的には、まず一時的な部分キーに insert し、その後レコードを実際のキーにコピーして一時レコードを削除します。ただし、この方法はパフォーマンスが低く、特に削除ステップが処理全体の 90% 以上を占めることがあります。
- 複数テーブル間の整合性: パイプラインが Table A のロードには成功しても、Table B で失敗した場合、Table A はすでにコミット済みのためロールバックできません。その結果、両方のテーブルをまたいでクエリするアナリストには、同期の取れていないデータが見えてしまいます。
背景
INSERT が成功した場合、そのブロック内のすべての行が可視になります。失敗した場合は、1 行も可視になりません。ただし、複数の insert や複数のテーブルにまたがるデータをアトミックにコミットするための組み込みの仕組みはありません。
パーティション操作コマンド (MOVE PARTITION TO TABLE、REPLACE PARTITION、ATTACH PARTITION FROM) は、ソーステーブルと宛先テーブルが同じストレージポリシーを共有している場合、メタデータレベルで動作します。
つまり、これらはデータサイズに関係なくほぼ瞬時に実行されるため、アトミックなスワップパターンの理想的な構成要素となります。
推奨される方法
単一テーブルでアトミック性を実現する手順
insert が成功した場合は、パーティションを本番環境に移動する
データを本番環境に移動し、ステージングテーブルから取り除くには、MOVE PARTITION を使用します。ATTACH PARTITION を使用して、本番環境の既存パーティションにデータをコピーすることもできます。複数テーブル間の整合性
要件と制約
MOVE PARTITION TO TABLE、REPLACE PARTITION、ATTACH PARTITION FROM では、転送元テーブルと転送先テーブルが次の条件を満たしている必要があります。
- 同一のカラム構造
- 同一のパーティションキー、
ORDER BYキー、および主キー - 同一のストレージポリシー
- 転送先テーブルには、転送元テーブルのすべてのインデックスとプロジェクションが含まれている必要があります
例
参考資料
- パーティションとパーツの操作
- この戦略の詳細については、ブログ記事 大規模な ClickHouse データロードを高速化する - Part 3: 大規模なデータロードの耐障害性を高める をご覧ください。