Patroni 4.1.5ドキュメント
Python 3.11+を使用する、メモリー制限のあるシステムでのPatroniの実行
たとえばvm.overcommit_memory=2(PostgreSQLで推奨)を設定したような、メモリー制限が厳しいシステムでPatroniを実行し、Python 3.11以降を使用すると、予期しない動作が見られる場合があります。
- Patroniは正常に見える
- PostgreSQLは動作を継続する
- PatroniのREST APIが応答しなくなる
- オペレーティングシステムは、PatroniがREST APIポートでリッスンしていると報告する
- Patroniのログは正常に見える。ただし、次のメッセージが一度表示される場合がある:
Exception ignored in thread started by: <object repr() failed>、MemoryError - カーネルのログに、
not enough memory for the allocationなどのメッセージが含まれる場合がある
この動作は、Python 3.11+のバグ によって発生します。メモリーの条件が厳しく、十分な空きメモリーがない場合、新しいスレッドの起動が無期限にハングする可能性があります。
推奨される解決策
最近のPatroniリリース(4.1.1+、4.0.8+)では、システムのメモリーが逼迫する前に、起動の早い段階で必要なすべてのスレッドを開始することで、この問題の影響を軽減しています。
追加の推奨事項(Linux、glibc)
vm.overcommit_memory=2(PostgreSQLで推奨)を設定して実行する場合は、次の環境変数を設定してPatroniを起動することも推奨します。
MALLOC_ARENA_MAX=1- マルチスレッドアプリケーション向けにglibcが割り当てる仮想メモリーの量を削減するPG_MALLOC_ARENA_MAX=- Patroniが起動するPostgreSQLプロセスのMALLOC_ARENA_MAXの値をリセットする。
さらに、次のPatroni構成パラメーターを調整できます。
thread_stack_size- Patroniが起動するスレッドで使用するスタックサイズ。この値を小さくすると、Patroniプロセスのメモリー使用量が減ります。Patroniが設定するデフォルト値は512kBです。Patroniでスタックに関連するクラッシュが発生する場合は、thread_stack_sizeを増やしてください。それ以外の場合はデフォルト値で十分です。thread_pool_size- リーダー選出やフェイルセーフの確認中に、Patroniが非同期タスクや他のメンバーとのREST API通信に使用するスレッドプールのサイズ。デフォルト値は5で、三つのノードからなるクラスターには十分です。restapi.thread_pool_size- REST APIリクエストの処理に使用するスレッドプールのサイズ。デフォルト値は5で、最大五つのREST APIリクエストを並行処理できます。ただし、データベース接続を一つだけ使用するため、SQLクエリーを伴うリクエストは実質的に直列化されます。そのため、この値を増やしても通常は効果がありません。
Patroniは、Pythonを使用した高可用性(HA)PostgreSQLソリューションのテンプレートです。できるだけ幅広い環境で利用できるように、PatroniはZooKeeper 、etcd 、Consul 、Kubernetes など、さまざまな分散構成ストアをサポートしています。データセンターをはじめ、あらゆる場所にHA PostgreSQLを迅速にデプロイしたいデータベースエンジニア、DBA、DevOpsエンジニア、SREに役立つことを期待しています。
Patroniを「テンプレート」と呼ぶのは、あらゆる状況に適合したり、導入するだけで使えたりするレプリケーションシステムとは大きく異なるためです。独自の注意点があります。十分に理解して使用してください。PostgreSQLで高可用性を実現する方法はさまざまです。一覧はPostgreSQLドキュメント を参照してください。
現在サポートしているPostgreSQLのバージョン:9.3から18。
Citusユーザーへの注意:3.0以降のPatroniは、Postgresのデータベース拡張機能であるCitus と円滑に連携します。Patroniの高可用性とCitusの分散クラスターを組み合わせて使用する方法については、PatroniドキュメントのCitusサポートページ を参照してください。
Kubernetesユーザーへの注意:PatroniはKubernetes上でネイティブに動作できます。PatroniドキュメントのKubernetes の章を参照してください。

Patroniの紹介、クイックスタート、高可用性の基本概念。
サポート対象プラットフォームにおけるPatroniのインストールとアップグレードの手順。
Patroni 構成モデル、優先順位ルール、および検証ツール。
Patroni REST API エンドポイントと操作動作のリファレンス。
patronictl の設定、構文、およびサブコマンドに関するコマンド リファレンス。
レプリカのイメージング、ブートストラップ、およびカスタム レプリカ作成のワークフロー。
Patroniが管理する非同期・同期レプリケーションモード。
スタンバイクラスターの設定、動作、リモートのプライマリーからのレプリケーション。
Patroniクラスターでのウォッチドッグ連携とフェンシングに関する考慮事項。
Patroni クラスター管理における一時停止および再開モードの動作。
DCSフェイルセーフモードの動作、要件、運用上の注意事項。
Kubernetesのオブジェクト、ラベル、サービスディスカバリーを使用したPatroniの運用。
Citusのコーディネーターとワーカーグループに対するPatroniの統合の詳細。
既存のPostgreSQLデータをPatroniクラスターに移行する手順。
Patroni を外部のバックアップおよびオーケストレーションツールと統合する。
DCS、REST API、および資格情報の取り扱いに関するセキュリティ上の考慮事項。
Patroniのレプリケーションを使用した、複数のデータセンターにまたがる高可用性の構成パターン。
Patroni の操作とトラブルシューティングに関するよくある質問。
時系列の Patroni リリース ノートと変更履歴。
貢献のワークフロー、サポート窓口、開発ガイドライン。