インフラ・DevOps
WAL-RUS: PostgreSQLバックアップのためのWAL-GをRustで書き換え
WAL-RUS: a Rust Rewrite of WAL-G for PostgreSQL Backups (clickhouse.com)
要約
ClickHouse Cloudは、PostgreSQLのバックアップとWALアーカイブのメモリ使用量の予測不可能性という問題に直面し、WAL-GをRustで再実装した「WAL-RUS」を開発しました。WAL-RUSは、ガーベージコレクションがないRustの特性を活かし、メモリ効率と予測可能性を大幅に向上させ、WAL-Gとの互換性を維持しつつ、継続的なWALアーカイブに最適化されています。ベンチマークでは、WAL-Gの仮想メモリ使用量が2.8GBに達するのに対し、WAL-RUSは1GB未満に抑えられ、70%以上の削減を実現しました。
全文翻訳
Postgresのバックアップは、地味であるべきインフラの要素の1つです。バックグラウンドで動作し、WALファイルを継続的にアーカイブし、バックアップをアップロードし、何か問題が発生したときにリカバリが可能であることを保証します。ClickHouse Cloudでは、このパスは極めて重要です。WALアーカイブは、Postgresサービスに対する耐久性とリカバリ可能性を維持するために不可欠です。WAL-Gは、この作業において強力で信頼できるツールでした。成熟しており、実証済みで、Postgresコミュニティに貢献してきました。しかし、Postgresをより厳しく、リソースに制約のある環境に押し込むにつれて、特定の課題に直面し始めました。それはメモリの予測可能性です。それが私たちをWAL-RUSの開発へと導きました。WAL-RUSは、予測可能なメモリ効率とWAL-Gとの互換性を目指して設計された、オープンソースのRustベースのPostgresバックアップおよびWALアーカイブツールです。
問題
WAL-Gはガーベージコレクション言語であるGoで書かれています。Goは信頼性の高いインフラソフトウェアの構築を容易にしますが、ガーベージコレクションランタイムは、WALアーカイブのような長時間実行されるサービスの場合、メモリ使用量を予測しにくくします。課題は、実際に使用されているメモリ(常駐メモリ)だけでなく、オペレーティングシステムから予約されているメモリ(仮想メモリ)にもあります。Goのランタイムは独自のメモリプールを管理し、アプリケーションが実際に使用しているメモリよりもはるかに多くの仮想メモリを予約する可能性があります。ワークロードが変化すると、このフットプリントは推論やチューニングが困難な方法で変動する可能性があります。GoのGCガイドでは、これを特徴的な「のこぎり波」パターンと表現しており、メモリ使用量はガーベージコレクションサイクル間で増加し、コレクション後に減少するため、ピークメモリ消費を予測し、リソースを効率的にプロビジョニングすることが困難です。オペレーターにとって、これはシンプルだが重要な問題を引き起こします。バックアップインフラのためにどれくらいのメモリを予約すべきか、という問題です。答えは通常、予期せぬメモリ圧力を避けるために「必要以上に多く」なります。WALアーカイブに割り当てられたメモリは、クエリ、共有バッファ、ページキャッシュのためにPostgres自体に自信を持って割り当てることができないメモリです。Postgresは、オーバーコミットを無効にした状態で最も確実に動作し、仮想メモリは、最新のソフトウェアが後回しにしがちな貴重なリソースとなります。WAL-Gは依然として実績のある信頼できるツールですが、Postgresをますますリソースに制約のある環境にスケールするにつれて、より予測可能なメモリプロファイルを持ち、同じ機能を提供しながらより少ないリソースを消費し、容量計画を簡素化するバックアップシステムを望んでいました。
解決策:WAL-RUSの紹介
私たちは新しい機能を求めていたわけではありません。WAL-Gは成熟した信頼できるバックアップシステムであり、私たちはそれに貢献することに満足しています。私たちの目標は、より予測可能なリソースプロファイルを提供しながら、コア機能と互換性を維持することでした。WAL-RUSは、メモリの予測可能性とリソース使用量に関してWAL-Gで遭遇した運用上の課題に対処するために構築された、PostgresバックアップおよびWALアーカイブツールのRust実装です。
1. 予測可能なリソース使用量:ガーベージコレクションランタイムとは異なり、Rustはメモリ割り当てと並行処理を直接制御できます。WAL-RUSは、境界のあるワーカープールと慎重に制御された並行処理を使用することで、メモリ消費をより推論しやすくし、バックアップインフラにリソースを過剰にプロビジョニングする必要性を減らします。
2. 継続的なWALアーカイブのために構築:WAL-RUSは、WAL-Gのデーモンアーキテクチャを優先します。WALファイルごとに新しいプロセスを生成し、新しい接続を確立する代わりに、バックグラウンドでアーカイブ要求を継続的に処理する永続的なオブジェクトストレージ接続を維持します。
3. ストリーミングワークロードに最適化:WALアーカイブは根本的にストリーミング問題です。WALファイルを読み取り、圧縮し、オブジェクトストレージにアップロードします。WAL-RUSは、このパイプライン全体で不要なバッファリングとデータコピーを最小限に抑えることで、より小さく予測可能なメモリフットプリントで同じアーカイブ作業を実行できます。
4. WAL-G互換性:WAL-RUSはWAL-Gと同じWALG_構成変数を使用し、相互運用性のために継続的にテストされています。WAL-GはWAL-RUSによって生成されたアーカイブを読み取ることができ、WAL-RUSはWAL-Gによって生成されたアーカイブを読み取ることができるため、既存のデプロイメントの移行は簡単です。
ベンチマーク
WAL-RUSを評価するために、持続的なWALヘビーなPostgreSQLワークロードの下でWAL-RUS、WAL-G、およびpgBackRestを比較する再現可能なベンチマークを構築しました。ベンチマークは継続的にWALを生成し、S3にアーカイブし、各アーカイバがWAL生成に追いつきながらどの程度効率的にメモリを使用するかを測定します。公平な比較を確実にするために、3つのツールすべてが4つの同時アーカイブワーカーで構成されました。
メモリ使用量
メモリ効率はWAL-RUSの主な動機であったため、メモリ消費量が最初に調べたメトリックでした。WAL-Gはベンチマーク中にピーク仮想メモリが約2.8GBに達しましたが、WAL-RUSは1GB未満にとどまり、70%以上の削減となりました。WAL-RUSは実行中、安定したメモリプロファイルを維持し、本番環境でのリソース要件を推論しやすくしました。pgBackRestもここで評価に値します。ガーベージコレクションランタイムを持たないCベースの実装であるため、メモリ割り当てを厳密に制御できます。
WALアーカイブスループット
WAL-RUSとWAL-Gはどちらもベンチマーク全体で最小限のバックログを維持し、生成されるワークロードに追いつくことができることを示しました。pgBackRestは、激しいWALアクティビティ中に大きなバックログを蓄積し、デーモンベースとプロセスベースのアーカイブスループット間のアーキテクチャ上のトレードオフを示しました。
CPU使用率
CPU使用率はそれほど重要ではありませんが、注意を払うのは良いことです。使用率は3つすべてで同程度で、主にLZ4圧縮を計算しています。
概要と結論
WAL-RUSは、実用的な問題を解決するために構築されました。PostgreSQLの信頼性の高いバックアップとWALアーカイブを、より小さく、より予測可能なリソースフットプリントで提供することです。Rustの明示的なメモリ管理とデーモン化されたストリーミングアーキテクチャを組み合わせることで、WAL-RUSはWAL-Gに匹敵するアーカイブスループットを達成しながら、メモリ消費量を大幅に削減します。重要なことに、WAL-RUSは既存のWAL-Gアーカイブと構成と完全に互換性があり、既存のデプロイメントへの採用を簡単にします。
WAL-RUSは、インクリメンタルバックアップのためにPostgres 17のWALサマリーを使用するサポートを導入しており、私たちはWAL-Gにアップストリームするよう取り組んでいます。WAL-Gに機能が不足していたからWAL-RUSを構築したわけではありません。WAL-Gは依然として成熟した実証済みのプロジェクトです。WAL-Gが確立したエコシステムとの互換性を維持しながら、リソース使用量に対するより厳密な制御を望んでいたため、WAL-RUSを構築しました。プロジェクトを開発し、強化し続ける中で、WAL-RUSをClickHouse CloudのマネージドPostgresサービスにおけるデフォルトのバックアップおよびWALアーカイブメカニズムにする予定です。このプロジェクトはオープンソースであり、フィードバック、テスト、貢献を歓迎します!ClickHouseで管理されるPostgresを試すClickHouse + Postgresは、スケーリングするアプリケーションのための統合データスタックとなっています。ClickHouse CloudでマネージドPostgresが利用可能になったことで、このスタックはすぐに導入できます。サインアップ