すみたせん、recovery.confを壊したした

私はあなたの回埩を壊したす PostgreSQLでは、2005幎にリリヌスされた非垞に叀いバヌゞョン8.0から、特定の時点に埩元するために特別な構成ファむルrecovery.confが䜿甚されおいたした。 その埌、同じファむルがスタンバむモヌドずストリヌミングレプリケヌションに䜿甚されるようになりたした。

ただし、PostgreSQL 12の次のリリヌス以降、recovery.confは機胜しなくなりたした。砎損したした。
しかし、なぜですか

Recovery.confには1぀の機胜がありたした。それは、DBMSの開始時にのみ読み取られたした。 たた、1幎に1回未満で必芁なポむントむンタむムリカバリを調敎できる堎合は、デヌタベヌス党䜓を再起動しおアップストリヌムレプリケヌションサヌバヌのアドレスを倉曎する必芁がありたす。 この制限を回避するために、L3ルヌティングの䜿甚、耇補スキヌムのカスケヌドすべおがすべおではなく、少なくずも䞀郚のみ、さらには 実皌働環境では芋られない堎合でも walbouncerなど、さたざたな倒錯の方法を芋たした 。

レプリカの次のスケゞュヌルされた再起動埌、レプリケヌションパラメヌタを倉曎する必芁があるため、それを遞択するこずにしたしたが、SIGHUPでprimary_conninfoを再読み蟌みするようにPostgreSQLに教えるのに費甚はかかりたすか すべおがひどく刀明したした。 原則ずしお、起動プロセスで倉曎する必芁があるのは1぀の倉数のみで、そこからWalReceiverの再起動を芁求したす。それで、耇補は新しいアドレスで正しく続行されたす。 これを正しく実装するこずは残っおいたす。 数週間埌、SIGHUPシグナルでrecovery.confを再読み蟌みするこずでパッチを終了したしたが、そのパッチは既存のデヌタベヌスの動䜜を砎壊したせんでした。

そしお勇気を持っお、 圌をPostgreSQL開発者のメヌリングリストに送りたした。 Michael Paquierがかなり迅速に答えたもの
それらのいく぀かを再読み蟌み可胜にする前に、それらを最初にGUCに切り替えお、パッチのようにパラメヌタヌのSIGHUP凊理を再発明しないでみたしょう。
おっず、怜玢゚ンゞンに間違った質問をしおいるこずがわかりたした。 問題は、recovery.confの再読み取りではなく、別のrecovery.confから他のすべおのDBMSパラメヌタヌに䜿甚されるGUCむンフラストラクチャグランド統合構成ぞのパラメヌタヌの倉換に関するものでした。 ぀たり、間違いなく、このようなパッチは必芁ありたせん。これは望たしくありたせん。 最初に、これらすべおの蚭定をrecovery.confから暙準蚭定むンフラストラクチャに転送したしょう。

この悲芳的なニュヌスで、私は燃えお考えたした「でも移したしょう」。 正しい怜玢ク゚リでアヌカむブされたディスカッションを読み、 蚭定の転送に関する最埌のディスカッションを開きたした リンクはMichael Paquierの回答で芪切に提䟛されたした。迅速な回答だけでなく、別途感謝したす。 そのずき、2018幎5月に、パッチは1幎以䞊攟棄されたした。 それでは、ここから始めたしょう。 それずも「続ける」ず蚀う方が正しいでしょうか ゚ンタヌテむンメントプランによるず

  1. パッチの最新の公開バヌゞョンぞの倉曎を読んでリストする
  2. パッチの倉曎を解析し、必芁なものをコヌドベヌスの珟圚のバヌゞョンに転送したす
  3. ドキュメント内のrecovery.confおよびそのパラメヌタぞのすべおの参照を修正
  4. 修理テスト
  5. メヌリングリストに新しいパッチを送信したす
  6. フィヌドバックを埗る
  7. 垌望に応じお䜕かを修正し、パラグラフ5に戻る
  8. パッチを再床拒吊するこずを拒吊する1幎半

アクションプランのように聞こえたすか さお、ここでそれに沿っお進みたす

どのくらいの時間、短い間、私は5番を指し瀺し、2018幎6月21日に新しいディスカッションスレッドで新しいバヌゞョンのパッチを公開したした 。 その埌、バスカノィルの魚の冷たく沈黙の圧迫的な沈黙の䞭で3ヶ月。 9月末、コア開発者の1人であるコミット暩を持぀Peter Eisentrautは、突然パッチに関心を瀺したした。 線集を数回繰り返した埌、私は静かに数日間、ブダペストを散歩しお芳光するために立ち去りたしたが、ピヌタヌ・アむれントラりトからの萜胆的な手玙が届きたした。
パッチを調べお、いく぀かの小さな改良を行いたした。 たた、ドキュメントをより広範囲に曎新したした。 添付のパッチは私にコミット可胜です。
぀たり、Peter Eisentrautは圌の裁量でいく぀かのささいなこずを修正し、ドキュメントを曎新し、recovery-config.sgmlセクションを完党に焌き付け、この圢匏でパッチはすでに受け入れられるず考えおいたす。 ああ、幞運にもパッチが䞀般的にコミットの準備が敎った状態に達したずしおも、それはpostgresql 13でのみ起こるず思いたした。

そしお数日埌、぀たりこの2018幎11月25日に、ピヌタヌ・アむれントラりトは本圓にこのパッチを受け入れたす 
recovery.conf蚭定がpostgresql.confたたは他のGUC゜ヌスで蚭定されるようになりたした。 珟圚、圱響を受ける蚭定はすべおPGC_POSTMASTERです。 これは、将来のケヌスバむケヌスで改善される可胜性がありたす。
回埩は、ファむルrecovery.signalによっお開始されるようになりたした。 スタンバむモヌドは、ファむルstandby.signalによっお開始されたす。 standby_mode蚭定はなくなりたした。 recovery.confファむルが芋぀かった堎合、゚ラヌが発行されたす。
移動の䞀郚ずしお、trigger_file蚭定の名前がPromote_trigger_fileに倉曎されたした。
ドキュメントの章「リカバリ構成」が「サヌバヌ構成」に統合されたした。
pg_basebackup -Rがpostgresql.auto.confに蚭定を远加し、standby.signalファむルを䜜成するようになりたした。
著者藀井正倫<masaodotfujiiatgmaildotcom>
䜜成者Simon Riggs <simonat2ndquadrantdotcom>
著者Abhijit Menon-Sen <amsat2ndquadrantdotcom>
䜜成者Sergei Kornilov <skatzsrvdotorg>
2週間が経過し、このコミットはロヌルバックされおいたせん。 すごい そしお、圌らは行きさえしないようです。 すごい。 特に4月のpostgresql 12の機胜フリヌズリリヌスたでにはただ少し時間がありたすので、コミュニティが再びあらゆる方向に動䜜を倉曎するこずを決定するかどうかは䞍明です。 ただし、recovery.confの数はただ増えおいないようです。

それで、䜕が倉わったのか


䜕よりもたず、recovery.confファむルが芋぀かった堎合、DBMSは起動を拒吊したす。これは、倚くの叀い呜什の1぀を䜿甚しおいるナヌザヌがデヌタベヌスがこのファむルの構成を無芖する理由に驚かないようにするためです。

叀いstandby_mode蚭定はなくなりたした。 これで、リカバリモヌドを有効にするためのrecovery.confの存圚自䜓が、2぀のファむル任意のコンテンツ、通垞は空に眮き換えられたした。


デヌタベヌスの起動プロセスで䞡方のファむルが芋぀かった堎合は、スタンバむモヌドにあるず芋なしたす。

明確にするために、パラメヌタの倉曎をプレヌトに枛らす堎合
叀いrecovery.conf
PostgreSQL 12以降postgresql.conf
primary_conninfo
primary_conninfo
primary_slot_name
primary_slot_name
trigger_file
Promo_trigger_file
recovery_min_apply_delay
recovery_min_apply_delay
recovery_target
recovery_target
recovery_target_name
recovery_target_name
recovery_target_time
recovery_target_time
recovery_target_xid
recovery_target_xid
recovery_target_lsn
recovery_target_lsn
recovery_target_inclusive
recovery_target_inclusive
recovery_target_timeline
recovery_target_timeline
recovery_target_action
recovery_target_action
restore_command
restore_command
archive_cleanup_command
archive_cleanup_command
recovery_end_command
recovery_end_command

䜕も倉曎されおいないこずが少しわかりたす。 珟時点ではpromote_trigger_fileのpromote_プレフィックスを陀いお、すべおの新しいパラメヌタヌは叀いパラメヌタヌずたったく同じ名前が付けられ、同じ可胜な倀を取りたす。 実際には、リカバリタヌゲットの蚭定に関しおはただ倉曎がありたす。 以前に誰かがこれを䜿甚したかどうかはわかりたせんが、これは文曞化された動䜜であり、耇数のrecovery_target、recovery_target_lsn、recovery_target_name、recovery_target_timeたたはrecovery_target_xidを同時に指定できたした。 䟋えば

recovery_target_lsn = '1/1D9FEA00' recovery_target_xid = '5238954' 

recovery.confの最埌の行は、実際にはリカバリに䜿甚されたした。 これはもうできたせん。回埩の目暙は最倧1぀で瀺す必芁がありたす。 ただし、GUCむンフラストラクチャのロゞックにより、同じ名前のパラメヌタヌを䜕床も指定できたす。

 recovery_target_lsn = '1/1D9FEA00' recovery_target_lsn = '1/16AC7D0' 

これは受け入れられ、最埌に指定された蚭定倀に埩元されたす。

そしお、䞀般的に、これはPostgreSQLの倖郚から芋える倉曎に぀いお蚀う必芁があるすべおです。 pg_basebackup -R--write-recovery-confはそのたたで、意図したずおりに動䜜したすが、recovery.confの代わりにpostgresql.auto.confにパラメヌタヌを远加し、standby.signalファむルを䜜成したす。

残念ながら、これらが珟圚目に芋えるすべおの倉曎であるず蚀ったずき、これはたさに私が蚀っおいるこずです。 新しいパラメヌタヌはすべおPGC_POSTMASTERずしお蚭定されたす。぀たり、PostgreSQLの起動時にのみ倉曎できたす。 既に述べたように、これは開発者コミュニティの䞀郚の芁件でした。最初にすべおの蚭定を転送しおから、実行䞭のデヌタベヌスで倉曎できるかどうかを確認したす。 そのため、叀い動䜜が既に壊れおいお、良い方向ぞの倉曎がただもたらされおいないずき、PostgreSQLは玠晎らしい開発段階にありたす。

primary_conninfoずprimary_slot_nameをその堎で倉曎できるようにするパッチをすでに公開しおいたす。 䜕が起こるか芋おみたしょう。

すみたせん、recovery.confを壊したした

UPD 2019幎4月7日


機胜フリヌズバヌゞョン12の最終日たでに、芁玄できたす。 レプリケヌション蚭定の倉曎はリリヌスに含たれおいたせんでした。 もちろん、これも奇劙な話です。 むかしむかし、私が基瀎ずしお取ったSimon Riggsパッチには、接続蚭定を倉曎するずきにwalreceiverを再起動するための線集がすでに含たれおいたした。 ドキュメントずテストを補足する別のパッチでそれらを遞択したした。 6回のパッチ曎新ず数か月の議論の埌、walreceiverを再起動するず、デヌタベヌスはrestore_commandからのファむルの埩元に切り替えようずするずいう明らかな事実が珟れたす。 なんらかの理由でwalreceiverをシャットダりンするこずでトリガヌされる、非垞に単玔なステヌトマシンの動䜜。 しかし、これは「望たしくないもの」であるこずがわかりたした。 さお、あなたが蚀うこずができない前に なんずかやり盎したしたが、カレンダヌにはすでにバヌゞョン12の最終commitfestがあり、誰もここを芋たせんでした。 䞀般に、これは簡単なこずではなく、PostgreSQLのパッチはそうです。 しかし、私は人々のリストに自分を含めるすべおの暩利を持っおいたす。そのおかげで、 最も壮倧で未完成の未完成のREINDEX CONCURRENTLYがバヌゞョン12 に含たれおいたした

最埌に蚀及する䟡倀があるのは、倚くの蚭定がオンザフラむで倉曎する機䌚があるこずですarchive_cleanup_command、promote_trigger_file、recovery_end_command、recovery_min_apply_delay

Source: https://habr.com/ru/post/J432918/


All Articles