PolarDB for PostgreSQL (Oracle 互換) では、物理または論理レプリケーションプロセスが、ディスクではなく WAL バッファーから直接先行書き込みログ (WAL) ログを読み取ることができます。このアプローチにより、ディスク I/O ワークロードが大幅に削減され、帯域幅が節約され、WAL ログの読み取りレイテンシが短縮されます。
背景情報
ネイティブ PostgreSQL では、レプリケーションは 物理レプリケーション と 論理レプリケーション に分類できます。
物理レプリケーション: プライマリノードとセカンダリノード間でデータを同期するために WAL ログを転送します。
論理レプリケーション: パブリッシャーとサブスクライバー間でデータを同期するために、WAL ログからデコードされた論理変更を転送します。
実行中の PostgreSQL クラスターでは、複数の物理レプリケーションリンクと論理レプリケーションリンクが同時に存在できます。各リンクの WAL 送信者プロセスは、ストレージに永続化された WAL ログを読み取り、解析して、ダウンストリームシステムに送信します。
レプリケーションリンクは相互に独立しています。各レプリケーションプロセスは WAL ログの完全な読み取りを必要とし、WAL ログを個別に処理および送信します。レプリケーションリンクの数が増加すると、WAL ログの読み取りに必要な帯域幅は、WAL ログの書き込みに必要な帯域幅よりも大幅に大きくなります。これにより、IOPS の需要が高まります。複数のレプリケーションプロセスによる WAL ログの頻繁な読み取りは、システムの毎日の I/O 操作を妨げる可能性があり、I/O 操作のレイテンシの増加、日常業務の速度低下、レプリケーションレイテンシの増加につながります。
ネイティブ PostgreSQL では、WAL ログは最初に WAL バッファーに書き込まれ、その後、バックグラウンドプロセスまたは共通プロセスによって永続ストレージにフラッシュされます。WAL バッファーのスペースは循環的に再利用されます。その結果、WAL バッファーには、最近生成された WAL ログが含まれており、レプリケーションプロセスによってアクセスされる可能性が最も高くなります。
PolarDB for PostgreSQL (Oracle 互換) では、レプリケーションプロセスが WAL バッファーから保持されている WAL ログを直接読み取ることができます。このアプローチにより、ディスク I/O ワークロードが大幅に削減され、帯域幅が節約され、WAL ログの読み取りレイテンシが短縮されます。
前提条件
PolarDB for PostgreSQL (Oracle 互換) クラスターで、PolarDB for PostgreSQL (Oracle 互換) 2.0 (リビジョンバージョン 2.0.14.13.27.0 以後) が実行されている必要があります。
コンソールでリビジョンバージョンを表示する か、SHOW polardb_version; 文を実行します。必要に応じて、リビジョンバージョンをアップグレード します。
使用方法
polar_enable_read_from_wal_buffers パラメーターを ON に設定して、レプリケーションプロセスが WAL バッファーから WAL ログを読み取れるようにします。デフォルト値: ON。PolarDB コンソールでクラスターパラメーターを設定する方法については、クラスターパラメーターを設定する を参照してください。
polar_monitor 拡張機能を使用して、WAL バッファーでの WAL ログ読み取り操作のヒット数を表示できます。
polar_monitor 拡張機能を作成します。
CREATE EXTENSION IF NOT EXISTS polar_monitor;WAL バッファーでの WAL ログ読み取り操作のヒット数を表示します。
SELECT * FROM polar_stat_walsnd_xlog_read();結果例:
pid | hit | hit_bytes | prefetched | prefetched_bytes | read | read_bytes ---------+------+-----------+------------+------------------+------+------------ 3865685 | 2175 | 251583064 | 0 | 0 | 82 | 10628128 3865751 | 2173 | 251582792 | 0 | 0 | 82 | 10628400 (2 rows)
次の表に、返されるフィールドを示します。
フィールド | データ型 | 説明 |
pid | INTEGER | レプリケーションプロセスの ID。 |
hit | BIGINT | WAL バッファーにヒットした WAL ログ読み取り操作の数。 |
hit_bytes | BIGINT | WAL バッファーにヒットした WAL ログ読み取り操作で読み取られたバイト数。 |
prefetched | BIGINT | ストレージから WAL バッファーにバッチでキャッシュされた WAL ログにヒットした WAL ログ読み取り操作の数。 |
prefetched_bytes | BIGINT | ストレージから WAL バッファーにバッチでキャッシュされた WAL ログにヒットした WAL ログ読み取り操作で読み取られたバイト数。 |
read | BIGINT | ストレージからの WAL ログ読み取り操作の数。 |
read_bytes | BIGINT | ストレージから読み取られた WAL ログのバイト数。 |