1706154566
2024-01-25 03:30:12
の 先行書き込みログ (WAL) は、データベースの原子性と耐久性に関連するテクノロジーです。
これは、トランザクションのコミット中にランダムな書き込みをシーケンシャルな読み取り/書き込みに変換することによって機能します。 トランザクションの変更は、分散しているさまざまなページにわたってランダムに発生します。
このランダムな書き込みはシーケンシャルな書き込みよりもコストがかかるため、コミットのパフォーマンスが低下する可能性があります。
WAL は、ブロックへの特定の行の追加など、トランザクションの変更操作のみを記録します。 トランザクションをコミットすると、新しい WAL エントリが WAL ファイルの最後に順次書き込まれます。
コミット後、ダーティ ページが非同期で更新され、これらの更新に対応する WAL エントリが破棄され、スペースが解放されます。
コミット パイプラインは、トランザクションのコミットを処理するために設計されたコンポーネントです。 コミットする前に、memtable を更新し、WAL (Write Ahead Log) エントリを永続化することが重要です。
これらのタスクの実行に必要な時間は、コミットのパフォーマンスに大きく影響します。 WAL エントリの永続化は、I/O 集中型で時間のかかる操作です。
私たちのようなシステムでは、WAL エントリを非同期的に永続化するためにコミット パイプラインが実装されています。 このアプローチにより、永続化プロセスがメモリ内で発生する更新をブロックしないことが保証されるため、全体の効率が向上します。
トランザクションコミットのプロセスには以下が含まれます。
- memtable への変更を更新する。 コミット パイプラインに入る前に、トランザクションは相互にブロックすることなく memtable を同時に更新します。 この時点では、これらの変更のステータスはコミットされておらず、どのトランザクションにも表示されません。
2. コミット パイプラインに入り、競合がないか確認します。
3. WAL エントリの永続化、 これには、メモリから WAL エントリを収集し、バックエンドに書き込むことが含まれます。 このプロセスは非同期です。
キューは、WAL エントリをバックエンドに渡した後、書き込みが成功するのを待たずにすぐに戻るため、後続のトランザクションのブロックが回避されます。
バックエンドはエントリのバッチを同時に処理します。 グループ コミットは、永続化プロセスをさらに高速化するために使用されます。
4. memtable のステータスを更新してトランザクションを表示できるようにします。 トランザクションは、キューに入った順序でステータスを更新します。 これにより、トランザクションの可視性の順序が、キューに WAL エントリを書き込む順序と一致するようになります。
チェックポイントは、ダーティ データをストレージに書き込み、古いログ エントリを破棄し、スペースを解放します。 MatrixOne で行うチェックポイントはバックグラウンドで開始されるタスクであり、そのプロセスは次のとおりです。
適切なタイムスタンプをチェックポイントとして選択し、このタイムスタンプより前に行われた変更をスキャンします。 タイムスタンプ t0 は前のチェックポイントを表し、t1 は現在のチェックポイントを表します。 間の変更 [t0, t1] 転送する必要があります。
DML の変更を転送します。 DML の変更は、memtable のさまざまなブロックに存在します。Logtail Mgr は、各トランザクションがどのブロックを変更したかを記録するメモリ モジュールです。
間のトランザクションをスキャンします。 [t0, t1] Logtail Mgr では、バックグラウンド トランザクションを開始してこれらのブロックをストレージに転送し、メタデータ内のアドレスを記録します。したがって、t1 より前にコミットされたすべての DML 変更は、メタデータ内のアドレスを通じて見つけることができます。
チェックポイントを迅速に実施し、WAL の際限のない増大を防ぐため、 インターバル内のブロックに 1 行しか変更がない場合でも、転送する必要があります。
カタログのスキャンには、データ定義言語 (DDL) とメタデータの変更のダンプが含まれます。
カタログ自体はツリーのような構造になっており、すべての DDL およびメタデータ情報が保存されます。 このツリー内の各ノードは、変更が発生したときにタイムスタンプを記録します。
スキャンの際、このプロセスでは、指定された時間範囲内にあるすべての変更を収集する必要があります。 [t0, t1]。
古い WAL (Write Ahead Log) エントリを破棄します。
Logtail Manager は、各トランザクションに対応する LSN (ログ シーケンス番号) を保存します。 タイムスタンプに基づいて、t1 より前の最後のトランザクションを特定し、このトランザクションの LSN より前のすべてのログをクリーンアップするようにログ バックエンドに指示します。
#WALとは何ですか #およびそれを適用する方法 #コミットパイプラインとチェックポイント #MatrixOrigin #により #年 #月