よくある質問¶
このセクションでは、パトローニに関してよくある質問への回答を示します。各サブセクションでは、さまざまな種類の質問に焦点を当てます。
これがあなたの疑問のほとんどを解決するのに役立つことを願っています。さらに懸念がある場合、または予期しない問題に直面している場合は、 おしゃべり および おしゃべり を参照して、ヘルプを取得したり問題を報告したりする方法を参照してください。
他のHAソリューションとの比較¶
repmgrなどの他のソリューションでは必要ないのに、PatroniではDCSノードの別個のクラスターが必要なのはなぜですか?HAソリューションを実装するにはさまざまな方法があり、それぞれに長所と短所があります。
repmgrのようなソフトウェアは、ノード間で通信を実行して、いつアクションを実行するかを決定します。一方、PatroniはDCSに保存された状態に依存します。DCSは、パトローニが何をすべきかを決定するための真実の情報源として機能します。
別個のDCSクラスターを使用するとアーキテクチャが肥大化する可能性がありますが、このアプローチにより、Postgresクラスターでスプリットブレインシナリオが発生する可能性も低くなります。
- Postgres管理に関して、Patroniと他のHAソリューションの違いは何ですか?
Patroniは、Postgresクラスターの高可用性を管理するだけでなく、Postgres自体も管理します。
Postgresノードがまだ存在しない場合は、プライマリノードとスタンバイノードのブートストラップを処理し、ノードのPostgres構成も管理します。Postgresノードがすでに存在する場合、Patroniがクラスターの管理を引き継ぎます。
上記に加えて、Patroniには自己修復機能もあります。つまり、プライマリノードに障害が発生した場合、Patroniはレプリカにフェイルオーバーするだけでなく、新しいプライマリのレプリカとして元のプライマリに再参加しようとします。同様に、レプリカに障害が発生した場合、Patroniはそのレプリカに再参加しようとします。
これが、Patroniを「HAソリューションのテンプレート」と呼ぶ方法です。単に物理レプリケーションを管理するだけでなく、Postgres全体を管理します。
DCS¶
- 同じ
etcdクラスターを使用して、2つ以上のPatroniクラスターからのデータを保存できますか? はい、できます!
Patroniクラスターに関する情報は、Patroni設定の
namespaceおよびscopeというプレフィックスが付いたパスの下のDCSに保存されます。異なるPatroniクラスター間で競合する名前空間とスコープがない限り、同じDCSクラスターを使用して複数のPatroniクラスターからの情報を保存できるはずです。
- 同じDCSクラスターを指す異なるPatroniクラスターに対して
namespaceとscopeの同じ組み合わせを使用しようとするとどうなりますか? 同じ
namespaceとscopeを使用しようとする2番目のPatroniクラスターは、DCS内の同じ組み合わせに関連するが互換性のないPostgresシステムIDを持つ情報を見つけるため、Postgresを管理できません。システム識別子の不一致により、Patroniは2番目のクラスターの管理を中止します。これは、2番目のクラスターが別のクラスターを参照しており、ユーザーがPatroniの構成を誤っていると想定するためです。同じDCSクラスターを共有する異なるPatroniクラスターを扱う場合は、必ず異なる
namespace/scopeを使用してください。- DCSクラスターを失った場合はどうなりますか?
DCSは、基本的にPatroniクラスターのステータスと動的構成を保存するために使用されます。
その最初の結果は、 DCSフェールセーフモード が有効になっていない限り、そのDCSに依存するすべてのPatroniクラスターが読み取り専用モードになることです。
- DCSクラスターを紛失した場合はどうすればよいですか?
DCSクラスターが失われた場合、考えられる結果は3つあります。
DCSクラスターは完全に回復されています。これには、Patroni側からのアクションは必要ありません。DCSクラスターが回復すると、Patroniも回復できるはずです。
DCSクラスターは適切な場所に再作成され、エンドポイントは同じままになります。Patroni側では変更は必要ありません。
新しいDCSクラスターが異なるエンドポイントで作成されます。各PatroniノードのPatroni構成でDCSエンドポイントを更新する必要があります。
2.または3.のシナリオに直面した場合、Patroniはクラスターの現在のステータスに基づいてステータス情報を再度作成し、Postgresデータディレクトリ内に保存されているpatroni.dynamic.jsonという名前のバックアップファイルに基づいてDCS上に動的構成を再作成します。Patroniクラスターの各メンバー。- DCSクラスターの過半数を失った場合はどうなりますか?
DCSが応答しなくなるため、Patroniは現在の読み取り/書き込みPostgresノードを降格させます。
覚えておいてください:PatroniはDCSの状態に依存してクラスターに対してアクションを実行します。
DCSフェールセーフモード を使用すると、この状況を軽減できます。
Patroni¶
- Patroniホストで Patroni を実行する必要がありますか?
いいえ、その必要はありません。
Patroniホストにアクセスできる場合は、Patroniホストで Patroni を実行すると便利です。これは、
patroniエージェントからのまったく同じ構成ファイルを Patroni アプリケーションに使用できるためです。ただし、 Patroni は基本的にクライアントであり、リモートマシンから実行できます。PatroniメンバーのDCSおよびRESTAPIにアクセスできるように、十分な構成を提供するだけです。
- Patroniメンバーの1人からの情報が Patroniリスト コマンドの出力から消えたのはなぜですか?
Patroniリスト で示される情報はDCSの内容に基づいています。
メンバーに関する情報がDCSから消えた場合は、そのノード上のPatroniエージェントが実行されていないか、DCSと通信できない可能性が非常に高くなります。
メンバーは情報を更新できないため、最終的にDCSからの情報の有効期限が切れ、その結果、メンバーは Patroniリスト の出力に表示されなくなります。
- Patroniリスト コマンドの出力にあるPatroniメンバーの1つに関する情報が最新ではないのはなぜですか?
Patroniリスト で示される情報はDCSの内容に基づいています。
デフォルトでは、その情報はPatroniによっておよそ
loop_wait秒ごとに更新されます。つまり、すべてが正常に機能している場合でも、DCSに保存されている情報に最大loop_wait秒の「遅延」が発生する可能性があります。ただし、それはルールではないことに注意してください。Patroniによって実行される一部の操作により、DCS情報が即座に更新されます。
構成¶
- 動的構成とローカル構成の違いは何ですか?
動的構成(またはグローバル構成)は、DCSに保存される構成であり、Patroniクラスターのすべてのメンバーに適用されます。これは主に構成を保存する場所です。
ノードに固有の設定、またはグローバル構成を上書きしたい設定は、目的のPatroniメンバーにのみローカル構成として設定する必要があります。そのローカル構成は、構成ファイルまたは環境変数を通じて指定できます。
詳細については、 パトローニの構成 を参照してください。
- Patroniの構成の種類と優先順位は何ですか?
種類は次のとおりです。
動的構成:すべてのメンバーに適用されます。
ローカル構成:ローカルメンバーに適用され、動的構成をオーバーライドします。
環境構成:ローカルメンバーに適用され、動的構成とローカル構成の両方がオーバーライドされます。
Note: 一部のPostgresGUCは、グローバルに、つまり動的構成を通じてのみ設定できます。それに加えて、Patroniがハードコードされた値を強制するGUCもあります。
詳細については、 パトローニの構成 を参照してください。
- Patroni設定ファイルの作成に役立つ機能はありますか?
はいあります。
patroni --generate-sample-configまたはpatroni --generate-configコマンドを使用して、それぞれサンプルのPatroni構成または既存のPostgresインスタンスに基づくPatroni構成を生成できます。詳細については、 Patroni構成のサンプル および Patroni構成のサンプル を参照してください。
bootstrap.dcs設定でパラメータを変更しましたが、Patroniは変更をクラスタメンバーに適用していません。なにが問題ですか?bootstrap.dcsで構成された値は、新しいクラスターをブートストラップする場合にのみ使用されます。これらの値はブートストラップ中にDCSに書き込まれます。ブートストラップフェーズが終了した後は、DCSを介してのみ動的構成を変更できます。
詳細については、次の質問を参照してください。
- 動的構成を変更するにはどうすればよいですか?
DCSの設定を変更する必要があります。これは、次のいずれかの方法で実現されます。
patronictl編集構成 ;または
PATCHに対するPATCHリクエスト。
- ローカル設定を変更するにはどうすればよいですか?
対応するPatroniメンバーの構成ファイルを変更し、
SIHGUPでPatroniエージェントに通知する必要があります。これは、次のいずれかのアプローチを使用して実行できます。POSTリクエストをRESTAPIPOSTに送信します。またはパトロニトルリロード を実行します。または
SIGHUPを使用してローカルでPatroniプロセスに信号を送ります。systemdを通じてPatroniを起動した場合は、コマンド
systemctl reload PATRONI_UNIT.serviceを使用できます。PATRONI_UNITはPatroniサービスの名前です。または他の方法でPatroniを起動した場合は、
patroniプロセスを特定し、kill -s HUP PIDを実行する必要があります。PIDはpatroniプロセスのプロセスIDです。
Note: Note: によるリロードが機能しない場合があります。
期限切れのRESTAPI証明書:
-kの-kオプションを使用することで、これを軽減できます。間違った資格情報:たとえば、構成ファイル内の
restapiまたはctl資格情報を変更し、同じ構成ファイルをPatroniとrestapiに使用する場合。
- 環境構成を変更するにはどうすればよいですか?
環境設定は、起動時にPatroniによってのみ読み取られます。
これを念頭に置いて、環境構成を変更した場合は、対応するPatroniエージェントを再起動する必要があります。
クラスター内でフェイルオーバーが発生しないように注意してください。 一時停止 をチェックしてみるとよいでしょう。
- リロードが必要なPostgresGUCを変更するとどうなりますか?
前の質問で説明したように動的構成またはローカル構成を変更すると、PatroniがPostgres構成の再ロードを処理します。
- 再起動が必要なPostgresGUCを変更するとどうなりますか?
Patroniは、影響を受けるメンバーに
pending restartのフラグを付けます。メンバーをいつ、どのように再起動するかを決定するのはあなた次第です。これは、次のいずれかの方法で実現できます。
Patroni再起動 ;または
POSTに対するPOSTリクエスト。
Note: 一部のPostgresGUCでは、Postgresノードを再起動する順序に関して特別な管理が必要です。詳細については、 Note: を参照してください。
- Patroni設定における
etcdとetcd3の違いは何ですか? etcdはetcdのAPIバージョン2を使用し、etcd3はetcdのAPIバージョン3を使用します。APIバージョン2で保存された情報はAPIバージョン3では管理できず、その逆も同様であることに注意してください。
次の理由から、
etcdではなくetcd3を構成することをお勧めします。APIバージョン2は、Etcdv3.4以降、デフォルトで無効になっています。
APIバージョン2はEtcdv3.6では完全に削除されます。
- Patroni構成で
use_slotsを有効にしましたが、クラスターメンバーがしばらくオフラインになると、そのメンバーが使用していたレプリケーションスロットが上流ノードで削除されます。その問題を回避するにはどうすればよいでしょうか? メンバーに対して永続的な物理レプリケーションスロットを構成できます。
Patroni
3.2.0以降、メンバースロットをPatroniが管理する永久スロットとして持つことができるようになりました。Patroniはすべてのノードに永続的な物理スロットを作成し、スロットを削除しないようにするだけでなく、メンバーによって消費されたLSNに従ってすべてのノードのスロットのLSNを進めます。
後で、対応するメンバーを削除する場合は、 your responsability で永続スロット構成を調整します。そうでない場合、Patroniはスロットを永久に保持します。
3.2.0よりも古いPatroniの Note: では、メンバースロットを永続的な物理スロットとして構成できますが、それらは現在のリーダーでのみ管理されます。つまり、フェイルオーバー/スイッチオーバーの場合、これらのスロットは新しいリーダー上に作成されますが、存在しないノードのすべてのWALセグメントがあることは保証されません。Note: Patroni
3.2.0を使用した場合でも、小さな競合状態が発生する可能性があります。最初は、スロットがレプリカ上に作成されるときに、リーダー上の同じスロットよりも先に作成される可能性があり、誰もスロットを使用していない場合、フェイルオーバー後に一部のファイルが失われる可能性があります。これを念頭に置いて、必要なWALの復元やPITRの実行を可能にする継続的アーカイブを構成することをお勧めします。loop_wait、retry_timeout、ttlの違いは何ですか?Patroniは、HAサイクルと呼ばれるものを時々実行します。各HAサイクルでは、クラスター上で一連のチェックを実行してその健全性を判断し、ステータスに応じてスタンバイへのフェイルオーバーなどのアクションを実行します。
loop_waitは、HAチェックの新しいサイクルを実行する前にPatroniがスリープする時間を秒単位で決定します。retry_timeoutは、DCSおよびPostgresでの再試行操作のタイムアウトを設定します。たとえば、DCSがretry_timeout秒を超えて応答しない場合、Patroniはセキュリティアクションとしてプライマリノードを降格する可能性があります。ttlは、DCSのleaderロックのリース時間を設定します。クラスターの現在のリーダーがttlを超えてHAサイクル中にリースを更新できない場合、リースは期限切れになり、クラスター内でleader raceがトリガーされます。Note: これらの設定を変更するときは、Patroniがドキュメントの Note: セクションで説明されているルールと最小値を強制することに注意してください。
Postgres管理¶
- Postgres構成でPostgresGUCを直接変更できますか?
可能ですが、それは避けるべきです。
Postgres構成はPatroniによって管理されており、構成ファイルを編集しようとすると、最終的に構成ファイルが上書きされる可能性があるため、Patroniによって失敗する可能性があります。
Patroniによる管理を克服するために利用できるオプションがいくつかあります。
$PGDATA/postgresql.base.confを通じてPostgresGUCを変更します。またはpostgresql.base.confの代わりに使用されるpostgresql.custom_confを定義して、外部で管理できるようにします。またはALTER SYSTEM/ALTER DATABASE/ALTER USERを使用してGUCを変更します。
詳細については、 重要なルール セクションを参照してください。
いずれの場合も、すべてのPostgres構成をPatroniを通じて管理することをお勧めします。これにより、管理が集中化され、必要なときにPatroniをデバッグしやすくなります。
- Postgresノードを直接再起動できますか?
いいえ、 not でPostgresを直接管理する必要があります。
Patroniを使用せずにPostgresサーバーをバウンスしようとすると、クラスターがフェイルオーバーに直面する可能性があります。
Postgresサーバーを管理する必要がある場合は、Patroniが公開している方法で管理してください。
- Patroniは既存のPostgresクラスターの管理を引き継ぐことができますか?
はい、できます!
詳細な手順については、 スタンドアロンをPatroniクラスターに変換する を参照してください。
- PatroniはPostgresをどのように管理していますか?
Patroniは、
pg_ctlやpostgresなどのPostgresバイナリを実行することにより、Postgresの起動と停止を処理します。これを念頭に置いて、postgresクラスターを管理できる他のソース(systemdユニットなど)を MUST で無効にします。
postgresql.service。Patroniのみがクラスター内のPostgresインスタンスを開始、停止、昇格できるようにする必要があります。そうしないと、スプリットブレインシナリオが発生する可能性があります。たとえば、プライマリとして実行されているノードに障害が発生し、ユニットpostgresql.serviceが有効になっている場合、Postgresがバックアップされてスプリットブレインが発生する可能性があります。
概念と要件¶
- Patroniの一部を構成するアプリケーションはどれですか?
Patroniは基本的に次の2つのアプリケーションを同梱しています。
patroni:これは、Postgresノードの管理を担当するPatroniエージェントです。patronictl:これは、Patroniクラスターと対話する(スイッチオーバー、再起動、構成の変更などを実行する)ために使用されるコマンドラインユーティリティです。詳細については、patronictlを参照してください。
- Patroniの
standby clusterとは何ですか? これは、プライマリPostgresノードが実行されていないクラスターです。つまり、クラスター内に読み取り/書き込みメンバーがありません。
これらの種類のクラスターは、別のクラスターからデータをレプリケートするために存在し、通常、データセンター間でデータをレプリケートする場合に役立ちます。
クラスター内には、リモートPostgresノードからの変更のレプリケーションを担当するスタンバイとなるリーダーが存在します。次に、そのようなリーダーメンバーからのカスケードレプリケーションで構成された一連のスタンバイが存在します。
Note: スタンバイクラスターは、複製元のソースクラスターについて何も知りません。WALストリーミングの代わりに
restore_commandを使用することもでき、完全に独立したDCSクラスターを使用することもあります。詳細については、 スタンバイクラスタ を参照してください。
- Patroniの
leaderとは何ですか? Patroniの
leaderは、クラスターのコーディネーターのようなものです。通常のPatroniクラスターでは、
leaderが読み取り/書き込みノードになります。スタンバイPatroniクラスターでは、
leader(別名standby leader)がリモートPostgresノードからのレプリケーションを担当し、それらの変更をスタンバイクラスターの他のメンバーにカスケードします。- Patroniではクラスター内に最小限のPostgresノードが必要ですか?
いいえ、Patroniは任意の数のPostgresノードで実行できます。
覚えておいてください:PatroniはDCSから切り離されています。
- パトローニで
pauseは何を意味しますか? 一時停止はPatroniによって公開される操作であるため、ユーザーはPostgres管理に関してPatroniに手を引くように要求できます。
これは主に、クラスターでメンテナンスを実行する必要があり、プライマリを停止したときにスタンバイにフェイルオーバーするなど、PatroniがHAに関連する決定を下すことを避けたい場合に役立ちます。
詳細については、 クラスターの一時停止/再開モード を参照してください。
自動フェイルオーバー¶
- Patroniの自動フェイルオーバーメカニズムはどのように機能しますか?
Patroniの自動フェイルオーバーは、
leader raceと呼ばれるものに基づいています。PatroniはクラスターのステータスをDCSに保存します。その中には、クラスターの現在の
leaderであるPatroniメンバーの名前を保持するleaderロックがあります。その
leaderロックには有効期限が関連付けられています。リーダーノードがleaderロックのリースを期限内に更新できなかった場合、キーは最終的にDCSから期限切れになります。leaderロックの有効期限が切れると、Patroniでleader raceと呼ばれるものがトリガーされます。つまり、すべてのノードがチェックの実行を開始して、leaderの役割を引き継ぐ最適な候補であるかどうかを判断します。これらのチェックの一部には、他のすべてのPatroniメンバーのRESTAPIへの呼び出しが含まれます。leaderロックを引き継ぐための最良の候補であると判断したすべてのPatroniメンバーは、そうしようとします。leaderロックを取得できる最初のPatroniメンバーは、自身を読み取り/書き込みノード(またはstandby leader)に昇格し、他のメンバーはこれに従うように構成されます。- Patroniクラスターで自動フェイルオーバーを一時的に無効にすることはできますか?
はい、できます!
これを実現するには、クラスターを一時的に停止します。これは通常、メンテナンスを実行する場合に役立ちます。
クラスターの自動フェイルオーバーを再開したい場合は、一時停止を解除するだけです。
詳細については、 クラスターの一時停止/再開モード を参照してください。
ブートストラップとスタンバイの作成¶
- PatroniはどのようにしてプライマリPostgresノードを作成しますか?スタンバイPostgresノードについてはどうですか?
デフォルトでは、Patroniは
initdbを使用して新しいクラスターをブートストラップし、pg_basebackupを使用してleaderメンバーのコピーからスタンバイノードを作成します。カスタムブートストラップメソッドとカスタムレプリカ作成メソッドを作成することで、その動作をカスタマイズできます。
カスタムメソッドは通常、pgBackRestやBarmanなどのバックアップツールによって作成されたバックアップを復元する場合に役立ちます。
監視¶
- Patroniクラスターを監視するにはどうすればよいですか?
Patroniは、 パトローニRESTAPI でいくつかの便利なエンドポイントを公開しています。
/metrics:Prometheusで使用できる形式でモニタリングメトリクスを公開します。/patroni:クラスターのステータスをJSON形式で公開します。ここに表示される情報は、/metricsエンドポイントによって表示される情報と非常に似ています。
これらのエンドポイントを使用して、監視チェックを実装できます。