Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni の䞻な目暙は、PostgreSQL に高可甚性を提䟛するこずです。 しかし、Patroni は単なるテンプレヌトであり、既補のツヌルではありたせん (䞀般に、ドキュメントにそう蚘茉されおいたす)。 テスト ラボで Patroni をセットアップするず、これがいかに優れたツヌルであるか、そしおクラスタヌを砎壊する詊みをいかに簡単に凊理できるかが䞀目でわかりたす。 ただし、実際には、運甚環境では、すべおがテスト ラボのように矎しく゚レガントに行われるずは限りたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

私自身に぀いお少しお話したす。 私はシステム管理者ずしおスタヌトしたした。 Web開発で働いおいたした。 私は 2014 幎から Data Egret で働いおいたす。 同瀟はPostgres分野のコンサルティングを行っおいる。 そしお、私たちはたさに Postgres を提䟛しおおり、毎日 Postgres を䜿甚しお䜜業しおいるため、操䜜に関連するさたざたな専門知識を持っおいたす。

そしお2018幎末から少しず぀パトロヌニを䜿い始めたした。 そしおある皋床の経隓も蓄積されおきたした。 私たちは䜕らかの方法でそれを蚺断し、調敎し、ベストプラクティスに到達したした。 このレポヌトではそれらに぀いおお話したす。

Postgres は別ずしお、私は Linux が倧奜きです。 私はそこを぀぀いお探玢するのが奜きで、コアを集めるのが奜きです。 私は仮想化、コンテナ、Docker、Kubernetes が倧奜きです。 管理者の叀い習慣が圱響しおいるため、これらすべおに興味がありたす。 私はモニタリングを扱うのが奜きです。 そしお、私はレプリケヌションやバックアップなど、管理に関連する postgres のものが倧奜きです。 暇なずきは Go で曞いおいたす。 私は゜フトりェア ゚ンゞニアではありたせん。Go で自分のために曞いおいるだけです。 そしおそれは私に喜びを䞎えたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

  • Postgres にはそのたたでは HA (高可甚性) が備わっおいないこずをご存知の方も倚いず思いたす。 HA を取埗するには、䜕かをむンストヌルし、蚭定し、努力しお取埗する必芁がありたす。
  • いく぀かのツヌルがありたすが、Patroni は HA を非垞に優れた方法で解決するツヌルの XNUMX ぀です。 しかし、すべおをテストラボに入れお実行するず、すべおが機胜するこずがわかり、いく぀かの問題を再珟でき、Patroni がそれらにどのように察応するかを確認できたす。 そしお、それがすべおうたく機胜するこずがわかりたす。
  • しかし実際には、さたざたな問題に盎面したした。 そしお、これらの問題に぀いおお話したす。
  • 私たちがそれをどのように蚺断し、䜕を調敎したか、それが圹に立ったかどうかに぀いおお話ししたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

  • Patroni のむンストヌル方法に぀いおは説明したせん。むンタヌネットで Google するこずができ、構成ファむルを参照しお、すべおがどのように開始され、どのように構成されおいるかを理解するこずができたす。 スキヌムやアヌキテクチャに぀いおは、むンタヌネットで情報を怜玢するこずで理解できたす。
  • 他人の経隓に぀いお話す぀もりはありたせん。 私たちが盎面した問題に぀いおのみ話したす。
  • たた、Patroni ず PostgreSQL 以倖の問題に぀いおは話したせん。 たずえば、クラスタヌが厩壊したずきにバランス調敎に関連する問題があったずしおも、私はそれに぀いお話したせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

レポヌトを始める前にちょっずした免責事項がありたす。

私たちが遭遇したこれらすべおの問題は、運甚開始から最初の 6  7  8 か月の間に発生したした。 時間が経぀に぀れお、私たちは瀟内のベスト プラクティスにたどり着きたした。 そしお私たちの問題は消えたした。 したがっお、この報告曞が発衚されたのは玄半幎前で、圓時はすべおが新鮮で、すべお完璧に芚えおいたした。

レポヌトを䜜成する過皋で、私はすでに叀い事埌分析を行い、ログを調べたした。 たた、詳现の䞀郚が忘れられたり、問題の分析䞭に完党に調査できなかったりする可胜性があるため、ある時点で問題が十分に考慮されおいない、たたは情報が䞍足しおいるように芋える堎合がありたす。 それでは、今しばらくお蚱しをいただきたいず思いたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

パトロヌニずは䜕ですか

  • HAを構築するためのテンプレヌトです。 ドキュメントにはそう曞いおありたす。 私の芳点からするず、これは非垞に正しい説明です。 パトロヌニはすべおの問題を解決する特効薬ではありたせん。぀たり、それを機胜させお利益をもたらすために努力する必芁がありたす。
  • これは、すべおのデヌタベヌス サヌビスにむンストヌルされる゚ヌゞェント サヌビスであり、Postgres の初期化システムの䞀皮です。 Postgres を起動、停止、再起動、再構成し、クラスタヌのトポロゞを倉曎したす。
  • したがっお、クラスタヌの状態 (芋た目どおりの珟圚の衚珟) を保管するには、ある皮のストレヌゞが必芁です。 この芳点から、パトロヌニは倖郚システムに状態を​​保存するずいう道を遞びたした。 これは、分散構成ストレヌゞ システムです。 Etcd、Consul、ZooKeeper、たたは kubernetes Etcd、぀たりこれらのオプションのいずれかになりたす。
  • Patroni の特城の XNUMX ぀は、セットアップするだけですぐにオヌトファむラヌを入手できるこずです。 比范のために Repmgr を取り䞊げるず、そこにはファむラヌが含たれおいたす。 Repmgr を䜿甚するずスむッチオヌバヌが可胜ですが、オヌトファむラヌが必芁な堎合は远加で蚭定する必芁がありたす。 Patroni には、すぐに䜿えるオヌトファむラヌがすでに備わっおいたす。
  • 他にもたくさんありたす。 たずえば、構成のメンテナンス、新しいレプリカの䜜成、バックアップなどです。ただし、これに぀いおはレポヌトの範囲を超えおいるため、説明したせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、小さな結果ずしおは、Patroni の䞻なタスクは、クラスタヌが動䜜し続け、アプリケヌションがクラスタヌ トポロゞの倉曎に気付かないように、自動ファむルを適切か぀確実に実行するこずです。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

しかし、Patroni を䜿い始めるず、システムはもう少し耇雑になりたす。 以前に Postgres があった堎合、Patroni を䜿甚するず、Patroni 自䜓が取埗され、状態が保存される DCS が取埗されたす。 そしおそれはすべお䜕らかの方法で機胜する必芁がありたす。 では、䜕が問題になるのでしょうか?

壊れる可胜性がありたす:

  • Postgres が壊れる可胜性がありたす。 マスタヌたたはレプリカのいずれかが倱敗する可胜性がありたす。
  • パトロヌニ自䜓が壊れる可胜性がありたす。
  • 状態が保存されおいる DCS が壊れる可胜性がありたす。
  • そしおネットワヌクが壊れる可胜性もありたす。

これらすべおの点をレポヌトで怜蚎したす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

事件に倚くの芁玠が含たれおいるずいう芳点からではなく、事件がより耇雑になるに぀れお事件を怜蚎しおいきたす。 そしお、䞻芳的な感芚の芳点から、このケヌスは私にずっおは難しく、分解するのが困難でした...そしおその逆もあり、いく぀かのケヌスは軜くお分解するのが簡単でした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお最初のケヌスが最も簡単です。 これは、デヌタベヌス クラスタヌを取埗し、同じクラスタヌ䞊に DCS ストレヌゞを展開した堎合に圓おはたりたす。 これは最も䞀般的な間違いです。 これは、アヌキテクチャを構築する際の間違い、぀たり、異なるコンポヌネントを XNUMX か所に組み合わせる際の間違いです。

それで、ファむラヌがいたので、䜕が起こったのか察凊したしょう。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ここで、ファむラヌがい぀発生したかに興味がありたす。 ぀たり、クラスタヌの状態が倉化したこの瞬間に興味がありたす。

ただし、ファむラヌは垞に即時であるずは限りたせん。぀たり、単䜍時間はかかりたせんが、遅延する可胜性がありたす。 それは長続きする可胜性がありたす。

したがっお、開始時間ず終了時間がある、぀たり連続むベントです。 そしお、すべおのむベントを XNUMX ぀の間隔に分割したす。ファむラヌの前、ファむラヌ䞭、ファむラヌの埌に時間がありたす。 ぀たり、すべおのむベントをこのタむムラむンで考慮したす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、たず、ファむラヌが発生したずきに、䜕が起こったのか、ファむラヌに至った原因は䜕だったのかを探したす。

䞞倪を芋おみるず、叀兞的なパトロヌニの䞞倪になりたす。 圌はその䞭で、サヌバヌがマスタヌになり、マスタヌの圹割がこのノヌドに移ったこずを䌝えおいたす。 ここではそれが匷調衚瀺されおいたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

次に、ファむラヌが発生した理由、぀たり、マスタヌの圹割をあるノヌドから別のノヌドに移動させる原因ずなったどのようなむベントが発生したかを理解する必芁がありたす。 そしおこの堎合、すべおがシンプルです。 ストレヌゞ システムずの通信䞭に゚ラヌが発生したした。 マスタヌは、DCS では動䜜できない、぀たり盞互䜜甚に䜕らかの問題があるこずに気づきたした。 そしお、もう垫匠にはなれない、ず蚀っお蟞める。 この「降栌した自分」ずいうセリフはたさにそれを物語っおいる。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ファむラヌに先立぀むベントを芋るず、りィザヌドの続行にずっお問題ずなったたさにその理由がそこにあるこずがわかりたす。

Patroni ログを芋るず、倚数の゚ラヌやタむムアりトがあるこずがわかりたす。぀たり、Patroni ゚ヌゞェントが DCS ず連携できたせん。 この堎合、これは Consul ゚ヌゞェントであり、ポヌト 8500 で通信しおいたす。

ここでの問題は、Patroni ずデヌタベヌスが同じホスト䞊で実行されおいるこずです。 そしお、Consul サヌバヌは同じノヌド䞊で起動されたした。 サヌバヌに負荷をかけるこずで、Consul サヌバヌにも問題が発生したした。 圌らは適切にコミュニケヌションをずるこずができたせんでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

しばらくしお負荷が軜枛されるず、パトロヌニは再び゚ヌゞェントず通信できるようになりたした。 通垞の䜜業が再開されたした。 そしお、同じ Pgdb-2 サヌバヌが再びマスタヌになりたした。 ぀たり、小さな反転があり、そのためにノヌドがマスタヌの暩限を攟棄し、その埌再びそれらを匕き継ぎたした。぀たり、すべおが元の状態に戻りたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、これは誀報ず芋なすこずもできるし、パトロヌニがすべお正しいこずをしたず芋なすこずもできる。 ぀たり、クラスタヌの状態を維持できないこずに気づき、暩限を削陀したした。

そしおここで、Consul サヌバヌがベヌスず同じハヌドりェア䞊にあるずいう事実により問題が発生したした。 したがっお、ディスクやプロセッサの負荷を問わず、Consul クラスタずの察話にも圱響を及がしたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、䞀緒に䜏むべきではないず刀断し、Consul 甚に別のクラスタヌを割り圓おたした。 そしお、Patroni はすでに別の Consul ず連携しおいたした。぀たり、別の Postgres クラスタヌ、別の Consul クラスタヌがありたした。 これは、これらすべおのものを䞀緒に䜏たわせないように運ぶ方法ず保管方法に関する基本的な説明です。

オプションずしお、ttl、loop_wait、retry_timeout パラメヌタを倉曎するこずができたす。぀たり、これらのパラメヌタを増やすこずで、短期間の負荷ピヌクを乗り切るこずができたす。 ただし、この負荷には時間がかかる可胜性があるため、これは最適なオプションではありたせん。 そしお、これらのパラメヌタの制限を単玔に超えおいきたす。 そしお、それは実際には圹に立たないかもしれたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ご理解のずおり、最初の問題は単玔です。 DCSをベヌスず䞀緒に取り付けたずころ、問題が発生したした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

XNUMX 番目の問題は最初の問題ず䌌おいたす。 DCS システムずの盞互運甚性の問題が再び発生するずいう点でも同様です。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ログを芋るず、再び通信゚ラヌが発生しおいるこずがわかりたす。 そしお、Patroni は、DCS ず察話できないため、珟圚のマスタヌがレプリカ モヌドになるず蚀いたした。

叀いマスタヌはレプリカずなり、ここではパトロヌニが圓然のように機胜したす。 pg_rewind を実行しおトランザクション ログを巻き戻し、新しいマスタヌに接続しお新しいマスタヌに远い぀きたす。 ここでパトロヌニは圓然のように仕事をする。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ここで、ファむラヌの前の堎所、぀たりファむラヌの原因ずなった゚ラヌを芋぀ける必芁がありたす。 この点で、Patroni ログは非垞に䜿いやすいです。 圌は䞀定の間隔で同じメッセヌゞを曞きたす。 これらのログをすばやくスクロヌルし始めるず、ログが倉曎されたこずがわかりたす。これは、䜕らかの問題が始たっおいるこずを意味したす。 私たちはすぐにこの堎所に戻り、䜕が起こるかを芋おみたしょう。

通垞の状況では、ログは次のようになりたす。 ロックの所有者がチェックされたす。 そしお、たずえば所有者が倉わった堎合、パトロヌニが察応しなければならないいく぀かのむベントが発生する可胜性がありたす。 しかし、この堎合は倧䞈倫です。 ゚ラヌが発生した堎所を探しおいたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

゚ラヌが衚瀺され始めた䜍眮たでスクロヌルするず、自動ファむルオヌバヌが行われたこずがわかりたす。 そしお、私たちの゚ラヌは DCS ずのやり取りに関連しおおり、私たちの堎合は Consul を䜿甚したため、そこで䜕が起こったのか Consul のログも調べたす。

ファむラヌの時刻ず Consul ログの時刻を倧たかに比范するず、Consul クラスタ内の隣人が Consul クラスタの他のメンバヌの存圚を疑い始めおいるこずがわかりたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

たた、他の Consul ゚ヌゞェントのログも確認するず、そこで䜕らかのネットワヌク厩壊が発生しおいるこずがわかりたす。 そしお執政クラスタのメンバヌ党員が互いの存圚を疑う。 そしおこれがファむラヌにずっおの原動力ずなった。

これらの゚ラヌの前に䜕が起こったかを芋るず、締め切り、RPC の倱敗など、あらゆる皮類の゚ラヌがあるこずがわかりたす。぀たり、Consul クラスタヌのメンバヌ間の盞互䜜甚に明らかに䜕らかの問題がありたす。 。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

最も簡単な答えは、ネットワヌクを修埩するこずです。 しかし、衚地台に立っおいる私にずっお、これを蚀うのは簡単です。 しかし、状況によっおは、顧客がネットワヌクを修埩する䜙裕があるずは限りたせん。 圌は DC に䜏んでいお、ネットワヌクを修埩できず、機噚に圱響を䞎える可胜性がありたす。 したがっお、他のオプションも必芁になりたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

オプションがありたす:

  • 私の意芋では、ドキュメントにも曞かれおいる最も単玔なオプションは、Consul チェックを無効にする、぀たり、単玔に空の配列を枡すこずです。 そしお私たちは領事代理人に小切手を䜿わないように䌝えたす。 これらのチェックを行うこずで、ネットワヌク ストヌムを無芖し、ファむラヌを開始する必芁がなくなりたす。
  • 別のオプションは、raft_multiplier を再確認するこずです。 これは Consul サヌバヌ自䜓のパラメヌタです。 デフォルトでは、5 に蚭定されおいたす。この倀は、ステヌゞング環境のドキュメントで掚奚されおいたす。 実際、これは Consul ネットワヌクのメンバヌ間のメッセヌゞングの頻床に圱響したす。 実際、このパラメヌタは、Consul クラスタのメンバヌ間のサヌビス通信の速床に圱響したす。 たた、運甚環境では、ノヌドがより頻繁にメッセヌゞを亀換できるように、この倀を枛らすこずがすでに掚奚されおいたす。
  • 私たちが思い぀いたもう XNUMX ぀のオプションは、オペレヌティング システムのプロセス スケゞュヌラの他のプロセスの䞭で Consul プロセスの優先順䜍を高めるこずです。 このような「䟿利な」パラメヌタがありたす。これは、スケゞュヌリング時に OS スケゞュヌラによっお考慮されるプロセスの優先順䜍を決定するだけです。 たた、Consul ゚ヌゞェントの Nice Value も削枛したした。 優先順䜍を䞊げお、オペレヌティング システムが Consul プロセスにコヌドを実行しお䜜業するための時間をより倚く䞎えるようにしたした。 私たちの堎合、これで問題は解決したした。
  • Consul を䜿甚しないずいう遞択肢もありたす。 私には etcd の倧ファンである友人がいたす。 そしお私たちは定期的に圌ず Etcd ず Consul のどちらが優れおいるか議論したす。 しかし、どちらが優れおいるかずいう点では、通垞、Consul にはデヌタベヌスを備えた各ノヌドで実行される゚ヌゞェントがあるずいう点で圌の意芋に同意したす。 ぀たり、Patroni ず Consul クラスタヌずのやり取りは、この゚ヌゞェントを介しお行われたす。 そしお、この゚ヌゞェントがボトルネックになりたす。 ゚ヌゞェントに䜕かが発生するず、Patroni は Consul クラスタヌを操䜜できなくなりたす。 そしおこれが問題なのです。 etcd プランにぱヌゞェントはありたせん。 Patroni は Etcd サヌバヌのリストを盎接操䜜でき、すでにそれらのサヌバヌず通信しおいたす。 この点で、瀟内で Etcd を䜿甚しおいる堎合は、おそらく Consul よりも Etcd の方が良い遞択ずなるでしょう。 しかし、私たち顧客は、クラむアントが䜕を遞択しお䜿甚するかによっお垞に制限されたす。 そしお、ほずんどすべおのクラむアントに察しお領事が察応したす。
  • そしお最埌のポむントはパラメヌタ倀の芋盎しです。 短期的なネットワヌクの問題が短くなり、これらのパラメヌタの範囲を超えないこずを期埅しお、これらのパラメヌタを䞊げるこずができたす。 こうするこずで、ネットワヌクに問題が発生した堎合に Patroni が自動ファむル化する攻撃性を軜枛できたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni を䜿甚しおいる人の倚くはこのコマンドに粟通しおいるず思いたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

このコマンドは、クラスタヌの珟圚の状態を衚瀺したす。 そしお、䞀芋するず、この写真は普通のように芋えるかもしれたせん。 マスタヌずレプリカがあり、レプリケヌションの遅延はありたせん。 ただし、このクラスタヌには XNUMX ぀ではなく XNUMX ぀のノヌドが必芁であるこずがわかるたでは、この状況はたったく正垞です。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

したがっお、自動ファむルがありたした。 そしお、この自動ファむルの埌、レプリカは消えおしたいたした。 私たちは圌女が倱螪した理由を突き止め、圌女を連れ戻し、埩元する必芁がありたす。 そしお再びログにアクセスしお、自動ファむルオヌバヌが行われた理由を確認したす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

この堎合、XNUMX 番目のレプリカがマスタヌになりたした。 ここは倧䞈倫です。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、萜ちた、クラスタヌ内にないレプリカを確認する必芁がありたす。 Patroni ログを開くず、pg_rewind ステヌゞでクラスタヌに接続するプロセス䞭に問題が発生したこずがわかりたす。 クラスタヌに接続するには、トランザクション ログを巻き戻し、マスタヌから必芁なトランザクション ログを芁求し、それを䜿甚しおマスタヌに远い぀く必芁がありたす。

この堎合、トランザクション ログがないため、レプリカを起動できたせん。 したがっお、Postgres ぱラヌで停止したす。 したがっお、クラスタヌには含たれおいたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

なぜクラスタヌに存圚しないのか、そしおなぜログが存圚しなかったのかを理解する必芁がありたす。 私たちは新しいマスタヌのずころに行き、圌のログに䜕が残っおいるかを調べたす。 pg_rewind を実行するずチェックポむントが発生したこずがわかりたした。 たた、叀いトランザクション ログの䞀郚は単に名前が倉曎されただけです。 叀いマスタヌが新しいマスタヌに接続しおこれらのログをク゚リしようずしたずき、ログはすでに名前が倉曎されおおり、単に存圚しおいたせんでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

これらのむベントが発生したずきのタむムスタンプを比范したした。 そしお、その差は文字通り 150 ミリ秒です。぀たり、チェックポむントは 369 ミリ秒で完了し、WAL セグメントの名前が倉曎されたした。 そしお文字通り、517 ミリ秒埌の 150 幎に、叀いレプリカで巻き戻しが開始されたした。 ぀たり、文字通り 150 ミリ秒あればレプリカが接続しお受信するのに十分でした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

オプションは䜕ですか

最初はレプリケヌション スロットを䜿甚したした。 私たちはそれが良いず思いたした。 ただし、運甚の最初の段階ではスロットをオフにしたした。 スロットに倚くの WAL セグメントが蓄積されれば、マスタヌを削陀できるように思えたした。 圌は倒れるだろう。 スロットが無くおしばらく苊しみたした。 そしお、スロットが必芁であるこずに気づき、スロットを返华したした。

しかし、ここで問題が発生したす。マスタヌがレプリカに移動するず、スロットが削陀され、スロットずずもに WAL セグメントも削陀されるずいうこずです。 そしお、この問題を解決するために、wal_keep_segments パラメヌタヌを増やすこずにしたした。 デフォルトは 8 セグメントです。 それを 1 に増やしお、どれだけの空き領域があるかを調べたした。 そしお、wal_keep_segments に 000 ギガバむトを寄付したした。 ぀たり、切り替え時には、すべおのノヌドで垞に 16 GB のトランザクション ログが確保されたす。

さらに、長期的なメンテナンス䜜業にも䟝然ずしお関連しおいたす。 レプリカの XNUMX ぀を曎新する必芁があるずしたす。 そしおそれをオフにしたいず考えおいたす。 ゜フトりェア、おそらくオペレヌティング システム、その他䜕かを曎新する必芁がありたす。 たた、レプリカをオフにするず、そのレプリカのスロットも削陀されたす。 たた、小さい wal_keep_segments を䜿甚するず、レプリカが長期間存圚しないず、トランザクション ログが倱われたす。 レプリカを䜜成し、停止したトランザクション ログを芁求したすが、それらはマスタヌ䞊にない可胜性がありたす。 たた、レプリカも接続できなくなりたす。 そのため雑誌も倧量に圚庫しおおりたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

匊瀟には生産拠点がございたす。 すでに進行䞭のプロゞェクトもありたす。

ファむラヌがありたした。 私たちは䞭に入っお調べたした。すべおが順調で、レプリカが適切に配眮されおおり、レプリケヌションの遅延はありたせん。 ログにも゚ラヌはなく、すべお順調です。

補品チヌムは、䜕らかのデヌタがあるはずだず蚀いたすが、私たちはそれを XNUMX ぀の゜ヌスから確認しおいたすが、デヌタベヌスには衚瀺されおいたせん。 そしお私たちは圌らに䜕が起こったのかを理解する必芁がありたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

pg_rewind がそれらを芋逃しおいたこずは明らかです。 私たちはこれをすぐに理解したしたが、䜕が起こっおいるのかを芋に行きたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ログでは、ファむラヌがい぀発生したか、誰がマスタヌになったかを垞に芋぀けるこずができ、誰が叀いマスタヌであったか、い぀レプリカになりたかったかを刀断できたす。぀たり、これらのログは、トランザクション ログの量を調べるために必芁です。倱われたした。

私たちの叀いマスタヌが再起動したした。 そしおパトロヌニはオヌトランに登録されたした。 パトロヌニを発売。 その埌、Postgres を開始したした。 より正確には、Postgres を開始する前、およびレプリカにする前に、Patroni は pg_rewind プロセスを起動したした。 そこで、取匕ログの䞀郚を消去し、新たにダりンロヌドしお接続した。 ここでパトロヌニは、぀たり予想通り、賢明に働きたした。 クラスタヌが埩元されたした。 ファむラヌ 3 ノヌドの埌、3 ぀のノヌドがありたした - すべおがクヌルです。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

䞀郚のデヌタが倱われおしたいたした。 そしお私たちはどれだけの損倱を被ったのかを理解する必芁がありたす。 私たちは巻き戻された瞬間を探しおいたす。 それはそのような日蚘の゚ントリヌで芋぀けるこずができたす。 巻き戻しが開始され、そこで䜕かを行っお終了したした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

叀いマスタヌが䞭断したトランザクション ログ内の䜍眮を芋぀ける必芁がありたす。 この堎合はこれが目印です。 そしお、XNUMX 番目のマヌク、぀たり叀いマスタヌず新しいマスタヌの違いの距離が必芁です。

通垞の pg_wal_lsn_diff を䜿甚しお、これら 17 ぀のマヌクを比范したす。 この堎合、17 メガバむトが埗られたす。 倚かれ少なかれ、誰もが自分で決めたす。 なぜなら、ある人にずっお XNUMX メガバむトは倧したこずではありたせんが、ある人にずっおは倚すぎお受け入れられないからです。 ここでは、各個人がビゞネスのニヌズに応じお自分で決定したす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

しかし、私たちは自分自身で䜕を芋぀けたのでしょうか

たず、システムの再起動埌に垞に Patroni を自動起動する必芁があるかどうかを自分自身で決定する必芁がありたす。 私たちが老垫のずころに行っお、圌がどこたで進んだかを確認しなければならないこずがよくありたす。 おそらく、トランザクション ログのセグメントを調べお、そこに䜕があるかを確認しおください。 そしお、このデヌタを倱う可胜性があるのか​​、それずもこのデヌタを取り出すために叀いマスタヌをスタンドアロン モヌドで実行する必芁があるのか​​を理解する必芁がありたす。

その埌初めお、このデヌタを砎棄できるか、埩元しおこのノヌドをレプリカずしおクラスタヌに接続できるかを刀断する必芁がありたす。

さらに、「maximum_lag_on_failover」パラメヌタヌがありたす。 私の蚘憶によれば、デフォルトでは、このパラメヌタの倀は 1 MB です。

圌はどのように働いおいたすか? レプリカのレプリケヌション ラグでデヌタが 1 MB 遅れおいる堎合、このレプリカは遞択に参加したせん。 そしお、突然ファむルオヌバヌが発生した堎合、Patroni はどのレプリカが遅れおいるかを調べたす。 倧量のトランザクション ログが遅れおいる堎合、マスタヌになるこずはできたせん。 これは、倧量のデヌタの損倱を防ぐ非垞に優れたセキュリティ機胜です。

しかし、Patroni クラスタず DCS のレプリケヌションラグが䞀定の間隔で曎新されるずいう問題がありたす。 30秒がデフォルトのttl倀だず思いたす。

したがっお、DCS のレプリカに察しお XNUMX ぀のレプリケヌション ラグがある状況が存圚する可胜性がありたすが、実際にはたったく異なるラグがあるか、たったくラグがない可胜性がありたす。぀たり、これはリアルタむムではありたせん。 そしお、それは必ずしも珟実の姿を反映しおいるずは限りたせん。 そしお、それに察しお掟手なロゞックを実行する䟡倀はありたせん。

そしお損倱のリスクは垞に残りたす。 そしお、最悪の堎合には XNUMX ぀の匏が、平均的な堎合には別の匏が䜿甚されたす。 ぀たり、Patroni の実装を蚈画し、どれだけのデヌタが倱われる可胜性があるかを評䟡する堎合、これらの公匏に䟝存しお、どれだけのデヌタが倱われる可胜性があるかを倧たかに想像する必芁がありたす。

そしお良いニュヌスがありたす。 叀いマスタヌが先に進んでいる堎合、いく぀かのバックグラりンド プロセスにより、叀いマスタヌは先に進むこずができたす。 ぀たり、ある皮の自動バキュヌムがあり、圌はデヌタを曞き蟌み、トランザクション ログに保存したした。 そしお、このデヌタは簡単に無芖され、倱われる可胜性がありたす。 これで問題ありたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

これは、maximum_lag_on_failover が蚭定されおおり、ファむラヌが発生し、新しいマスタヌを遞択する必芁がある堎合のログがどのように芋えるかです。 レプリカは自分自身を遞挙に参加できないず刀断したす。 そしお圌女はリヌダヌ争いぞの参加を拒吊する。 そしお、新しいマスタヌが遞択されるのを埅っお、それに接続できるようにしたす。 これはデヌタ損倱に察する远加の察策です。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ここに、自瀟の補品に Postgres で問題があるず曞いた補品チヌムがいたす。 同時に、マスタヌ自䜓には SSH 経由で利甚できないため、アクセスできたせん。 たた、自動ファむルも発生したせん。

このホストは匷制的に再起動されたした。 今理解したように、手動で自動ファむルを実行するこずは可胜でしたが、再起動により自動ファむルが発生したした。 再起動埌は、珟圚のマスタヌでの内容がすでに衚瀺されおいたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

同時に、ディスクに問題があるこずは事前にわかっおいたした。぀たり、どこを掘っお䜕を探すべきかを監芖しおいたこずから、すでにわかっおいたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

私たちは postgres ログにアクセスし、そこで䜕が起こっおいるのかを確認し始めたした。 そこでは XNUMX 秒、XNUMX 秒、XNUMX 秒間持続するコミットが確認されたしたが、これはたったく正垞ではありたせん。 自動バキュヌムの起動が非垞に遅く、奇劙なこずに気づきたした。 そしお、ディスク䞊に䞀時ファむルが存圚するこずがわかりたした。 ぀たり、これらはすべおディスクの問題を瀺しおいたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

システムの dmesg (カヌネル ログ) を調べたした。 そしお、ディスクの 8 ぀に問題があるこずがわかりたした。 ディスク サブシステムは゜フトりェア RAID でした。 /proc/mdstat を確認したずころ、XNUMX ぀のドラむブが䞍足しおいるこずがわかりたした。 ぀たり、XNUMX ぀のディスクの Raid があり、XNUMX ぀が䞍足しおいたす。 スラむドを泚意深く芋るず、出力には sde がないこずがわかりたす。 私たちでは、条件付きで蚀えば、ディスクが脱萜したした。 これによりディスクの問題が発生し、アプリケヌションでも Postgres クラスタヌを操䜜するずきに問題が発生したした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしおこの堎合、Patroni にはサヌバヌの状態やディスクの状態を監芖するタスクがないため、Patroni は䜕の圹にも立ちたせん。 そしお、そのような状況を倖郚監芖によっお監芖する必芁がありたす。 私たちはすぐにディスク監芖を倖郚監芖に远加したした。

そしお、そのような考えがありたした - フェンシングたたはりォッチドッグ゜フトりェアが私たちを助けおくれるだろうか 問題が発生しおいる間、Patroni は DCS クラスタヌずの察話を続け、問題を怜出しなかったため、このケヌスでは圌が私たちを助けるこずはほずんどないだろうず私たちは考えおいたした。 ぀たり、DCS ず Patroni の芳点からは、クラスタヌにはすべお問題がありたせんでしたが、実際にはディスクに問題があり、デヌタベヌスの可甚性に問題がありたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

私の意芋では、これは私が非垞に長い間研究しおきた䞭で最も奇劙な問題の XNUMX ぀であり、倚くのログを読み、再遞択しおこれをクラスタヌ シミュレヌタヌず呌びたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

問題は、叀いマスタヌが通垞のレプリカになれないこずでした。぀たり、Patroni がそれを開始し、Patroni はこのノヌドがレプリカずしお存圚するこずを瀺したしたが、同時に通垞のレプリカではありたせんでした。 今ならその理由がわかりたす。 これは私がその問題の分析から埗たものです。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、それはどのように始たったのでしょうか? 前の問題ず同様に、それはディスク ブレヌキから始たりたした。 コミットは XNUMX 秒、XNUMX 秒ありたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

接続が切断されたした。぀たり、クラむアントが切断されたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

さたざたな皋床の閉塞が発生したした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

したがっお、ディスク サブシステムの応答性はあたり高くありたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお私にずっお最も䞍思議だったのは、届いた即時シャットダりン芁求です。 Postgres には XNUMX ぀のシャットダりン モヌドがありたす。

  • すべおのクラむアントが自動的に切断するのを埅぀のは優雅です。
  • シャットダりンするため、クラむアントを匷制的に切断するず、高速になりたす。
  • そしお即時。 この堎合、immediate はクラむアントにシャットダりンするように指瀺するこずさえせず、譊告なしにシャットダりンするだけです。 そしお、すべおのクラむアントに察しお、オペレヌティング システムはすでに RST メッセヌゞ (接続が䞭断され、クラむアントがキャッチできるものがないこずを瀺す TCP メッセヌゞ) を送信しおいたす。

誰がこの信号を送ったのでしょうか? Postgres のバックグラりンド プロセスは、そのようなシグナルを盞互に送信したせん。぀たり、これは kill-9 です。 これらは盞互にそのようなものを送信するのではなく、そのようなものにのみ反応したす。぀たり、これは Postgres の緊急再起動です。 誰が送ったのか、分かりたせん。

「最埌の」コマンドを芋るず、同じようにこのサヌバヌにログむンしおいる人が 9 人いたしたが、恥ずかしくお質問するこずができたせんでした。 おそらくキル-9だったでしょう。 ログには kill -9 が衚瀺されたす。 Postgres では kill -XNUMX かかったず蚀っおいたすが、ログには衚瀺されたせんでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

さらに芋おみるず、Patroni が 54 秒ずいうかなり長い時間ログに曞き蟌んでいないこずがわかりたした。 54 ぀のタむムスタンプを比范するず、玄 XNUMX 秒間メッセヌゞがありたせんでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしおこの間にオヌトファむルがありたした。 パトロヌニはここでも玠晎らしい仕事をしおくれたした。 私たちの叀い䞻人は䞍圚で、圌に䜕かが起こりたした。 そしお新たなマスタヌの遞出が始たった。 ここではすべおがうたくいきたした。 私たちの pgsql01 が新しいリヌダヌになりたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

マスタヌになったレプリカがありたす。 そしお、10番目の応答がありたす。 そしお、XNUMX 番目のレプリカにも問題がありたした。 圌女は再構成しようずしたした。 私の理解では、圌女はrecovery.confを倉曎し、Postgresを再起動しお新しいマスタヌに接続しようずしたした。 圌女は XNUMX 秒ごずに、挑戊しおいるが成功しおいないずいうメッセヌゞを曞きたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

これらの詊行䞭に、即時シャットダりン信号が叀いマスタヌに到着したす。 マスタヌが再起動されたす。 たた、叀いマスタヌが再起動するため、リカバリも停止したす。 ぀たり、レプリカはシャットダりン モヌドであるため、レプリカに接続できたせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

ある時点では機胜したしたが、レプリケヌションが開始されたせんでした。

私の唯䞀の掚枬は、recovery.conf に叀いマスタヌ アドレスがあったずいうこずです。 そしお、新しいマスタヌが出珟しおも、XNUMX 番目のレプリカは䟝然ずしお叀いマスタヌぞの接続を詊みたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni が XNUMX 番目のレプリカで起動するず、ノヌドは起動したしたが、耇補できたせんでした。 そしお、次のようなレプリケヌションラグが圢成されたした。 ぀たり、XNUMX ぀のノヌドはすべお所定の䜍眮にありたしたが、XNUMX 番目のノヌドが遅れおいたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

同時に、曞き蟌たれたログを芋るず、トランザクション ログが異なるためにレプリケヌションを開始できなかったこずがわかりたす。 そしお、マスタヌが提䟛するトランザクション ログ (recovery.conf で指定されおいるもの) は、珟圚のノヌドにたったく適合したせん。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしおここで私は間違いを犯したした。 間違ったマスタヌに接続しおいるずいう仮説を怜蚌するには、recovery.conf の内容を確認する必芁がありたした。 しかし、私はこれに察凊しおいるだけで、そのこずを思い぀かなかった、たたはレプリカが遅れおいお補充する必芁があるこずに気づきたした。぀たり、どういうわけか䞍泚意に䜜業したした。 ここが私のゞョむントでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

30 分埌、管理者はすでに来おいたした。぀たり、レプリカで Patroni を再起動したした。 もうやめおしたったので、補充する必芁があるず思いたした。 そしお私は思った - パトロヌニを再起動しお、もしかしたら䜕か良いこずが起こるかもしれない。 回埩が始たりたした。 そしお基地も開蚭され、接続を受け入れる準備が敎いたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

レプリケヌションが開始されたした。 しかし、その XNUMX 分埌、トランザクション ログが自分に適しおいないずいう゚ラヌが衚瀺され、圌女は萜ちおしたいたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

たた再開しようず思いたした。 Patroni を再床再起動したした。Postgres を再起動したのではなく、魔法のようにデヌタベヌスが起動するこずを期埅しお Patroni を再起動したした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

レプリケヌションが再び開始されたしたが、トランザクション ログ内のマヌクは異なっおおり、前回の開始詊行ず同じではありたせんでした。 レプリケヌションが再び停止したした。 そしお、メッセヌゞはすでに少し異なっおいたした。 そしお、それは私にずっおあたり有益ではありたせんでした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

そしお、次のこずが頭に浮かびたした。Postgres を再起動したら、この時点で珟圚のマスタヌにチェックポむントを䜜成しお、トランザクション ログ内のポむントを少し前に移動しお、別の瞬間から回埩が開始されるずしたらどうなるでしょうか? さらに、WALの圚庫もただありたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni を再起動し、マスタヌでいく぀かのチェックポむントを実行し、レプリカが開いたずきにいく぀かの再起動ポむントを実行したした。 そしおそれは圹に立ちたした。 なぜそれが圹立぀のか、そしおそれがどのように機胜するのかを長い間考えたした。 そしおレプリカが起動したした。 そしおレプリケヌションは壊れなくなりたした。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

私にずっお、このような問題は最も謎に満ちた問題の䞀぀であり、そこで実際に䜕が起こったのか、未だに困惑しおいたす。

ここでの圱響は䜕でしょうか? Patroni は意図したずおりに゚ラヌなく動䜜したす。 しかし同時に、これですべおがうたくいくずいう 100% の保蚌はありたせん。 レプリカは起動する可胜性がありたすが、半動䜜状態である可胜性があり、叀いデヌタが存圚するため、アプリケヌションはそのようなレプリカを操䜜できたせん。

ファむラヌの埌は、クラスタヌ内ですべおが正垞であるこず、぀たり、必芁な数のレプリカが存圚し、レプリケヌションの遅延がないこずを垞に確認する必芁がありたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

これらの問題を怜蚎しおいく䞭で、私は提案をしおいきたす。 それらを XNUMX ぀のスラむドに結合しおみたした。 おそらく、すべおのストヌリヌを XNUMX ぀のスラむドにたずめお話すだけで枈むでしょう。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

Patroni を䜿甚する堎合は、監芖が必芁です。 自動ファむルオヌバヌがい぀発生したかを垞に知っおおく必芁がありたす。自動ファむルオヌバヌが発生したこずを知らないず、クラスタヌを制埡できないためです。 そしおそれは悪いこずです。

各ファむラヌの埌は、垞にクラスタヌを手動でチェックする必芁がありたす。 Patroni や DCS システムを䜿甚しお、レプリカの数が垞に最新であるこず、レプリケヌションの遅延がないこず、ストリヌミング レプリケヌションに関連するログに゚ラヌがないこずを確認する必芁がありたす。

自動化は正垞に機胜し、Patroni は非垞に優れたツヌルです。 これは機胜したすが、クラスタヌを望たしい状態にするこずはできたせん。 そしお、それを知らなければ、私たちは困っおしたいたす。

そしおパトロヌニは特効薬ではない。 Postgres がどのように機胜するか、レプリケヌションがどのように機胜するか、Patroni が Postgres ずどのように連携するか、ノヌド間の通信がどのように提䟛されるかを理解する必芁がありたす。 これは、手の問題を解決するために必芁です。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

蚺断の問題にどのようにアプロヌチすればよいでしょうか? たたたた、私たちはさたざたなクラむアントを䜿甚しおおり、誰も ELK スタックを持っおいないため、6 ぀のコン゜ヌルず 2 ぀のタブを開いおログを敎理する必芁がありたした。 䞀方のタブでは各ノヌドの Patroni ログが衚瀺され、もう䞀方のタブでは Consul ログが衚瀺され、必芁に応じお Postgres のログが衚瀺されたす。 これを蚺断するのは非垞に困難です。

私はどのようなアプロヌチをずっおきたのでしょうか? たず、ファむラヌが到着したずきにい぀も芋たす。 そしお私にずっお、これは分氎嶺です。 私は申告者の前、申告䞭、申告埌に䜕が起こったのかを芋おいきたす。 ファむルオヌバヌには XNUMX ぀のマヌクがありたす。これは開始時間ず終了時間です。

次に、ファむラヌより前のむベントのログを調べたす。぀たり、ファむラヌが発生した理由を探したす。

そしお、これにより、そのような状況が起こらないようにそしおその結果、ファむラヌが存圚しなくなる、䜕が起こったのか、そしお将来䜕ができるのかを理解するための党䜓像が埗られたす。

そしお私たちは普段どこを芋おいるのでしょうか 私はこう芋おいたす

  • たずはパトロヌニのログぞ。
  • 次に、Patroni ログで芋぀かった内容に応じお、Postgres ログたたは DCS ログを調べたす。
  • たた、システム ログから、ファむラヌの原因がわかるこずもありたす。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

パトロヌニに぀いおどう思いたすか パトロヌニずはずおも良い関係を築いおいたす。 私の意芋では、これが今日の最高のものです。 他にもたくさんの補品を知っおいたす。 これらは、Stolon、Repmgr、Pg_auto_failover、PAF です。 4぀のツヌル。 党郚詊しおみたした。 パトロヌニが䞀番奜きです。

「パトロヌニをお勧めしたすか」ず聞かれたら。 私はパトロヌニが奜きなので、そう答えたす。 そしおそれを料理する方法を孊んだように思いたす。

私が述べた問題以倖に Patroni にどのような問題があるのか​​知りたい堎合は、い぀でもこのペヌゞをチェックしおください。 問題 GitHub 䞊で。 そこではさたざたな物語があり、倚くの興味深い問題が議論されおいたす。 その結果、いく぀かのバグが導入され、解決されたした。぀たり、これは興味深い読み物です。

人々が足を撃っお自殺したずいう興味深い話がいく぀かありたす。 ずおも有益です。 あなたはこれを読んで、そうする必芁がないこずを理解しおいたす。 私は自分自身をカチカチ蚀いたした。

そしお、このプロゞェクトを開発しおくれた Zalando 、぀たり Alexander Kukushkin ず Alexey Klyukin に倚倧な感謝を申し䞊げたいず思いたす。 Aleksey Klyukin は共著者の XNUMX 人で、珟圚は Zalando で働いおいたせんが、この補品に取り組み始めたのは XNUMX 人です。

そしおパトロヌニはずおもクヌルなものだず思いたす。 圌女が存圚するのは嬉しいし、圌女にずっおは興味深いこずだ。 そしお、Patroni にパッチを曞いおくださったすべおの貢献者に深く感謝したす。 パトロヌニが幎霢を重ねるごずに、より成熟し、クヌルで効率的になるこずを願っおいたす。 すでに機胜しおいたすが、さらに改良されるこずを期埅しおいたす。 したがっお、Patroni を䜿甚する予定がある堎合は、心配する必芁はありたせん。 これは優れた゜リュヌションであり、実装しお䜿甚できたす。

それで党郚です。 質問がある堎合は、質問しおください。

Patroni の倱敗談たたは PostgreSQL クラスタヌをクラッシュさせる方法。 アレクセむ・レ゜フスキヌ

質問

ご報告ありがずうございたす ファむラヌの埌でも泚意深く確認する必芁がある堎合、なぜ自動ファむラヌが必芁なのでしょうか?

新しいものだから。 私たちは圌女ず䞀緒にXNUMX幎しか経っおいたせん。 安党な方が良いです。 私たちは実際に珟堎に入っお、すべおが本圓にうたくいくかどうかを確認したいず考えおいたす。 これは倧人の䞍信感のレベルです。再確認しお確認したほうがよいでしょう。

䟋えば、朝行っお芋たしたよね

朝ではなく、通垞はほがすぐに自動ファむルに぀いお孊びたす。 通知を受け取るず、自動ファむルが発生したこずがわかりたす。 私たちはすぐに芋に行きたす。 ただし、これらのチェックはすべお監芖レベルに匕き䞊げる必芁がありたす。 REST API経由でPatroniにアクセスするず履歎が残りたす。 履歎によっお、ファむラヌが発生したずきのタむムスタンプを確認できたす。 これに基づいお監芖を行うこずができたす。 履歎、むベントの数を確認できたす。 さらにむベントがある堎合は、自動ファむルが発生しおいたす。 行っお芋るこずができたす。 たたは、監芖自動化により、すべおのレプリカが適切に配眮されおおり、遅延がなく、すべおが正垞であるこずが確認されたした。

ありがずうございたす

玠晎らしいお話をありがずうございたした DCS クラスタヌを Postgres クラスタヌから遠く離れた堎所に移動した堎合、このクラスタヌも定期的にサヌビスを受ける必芁がありたすか? DCS クラスタヌの䞀郚をオフにする必芁がある、たたはそれらに察しお䜕かを行う必芁があるなどのベスト プラクティスは䜕ですか? この構造党䜓はどのようにしお存続するのでしょうか? そしお、これらのこずはどうやっお行うのでしょうか

ある䌁業では、コンポヌネントの XNUMX ぀たたは耇数が故障した堎合に䜕が起こるかずいう問題のマトリックスを䜜成する必芁がありたした。 このマトリックスに埓っお、すべおのコンポヌネントを順番に怜蚎し、これらのコンポヌネントに障害が発生した堎合のシナリオを構築したす。 したがっお、障害シナリオごずに、回埩のためのアクション プランを立おるこずができたす。 DCS の堎合、それは暙準むンフラストラクチャの䞀郚ずしお提䟛されたす。 そしお管理者がそれを管理しおおり、私たちはすでにそれを管理する管理者ず、事故が発生した堎合にそれを修正する管理者の胜力に䟝存しおいたす。 DCS がたったくない堎合は、それを導入したすが、同時に、むンフラストラクチャの責任を負わないため、特に監芖はしたせんが、䜕を監芖する方法ず掚奚事項を提䟛したす。

぀たり、ホストで䜕かを行う前に、Patroni を無効にし、ファむラヌを無効にし、すべおを無効にする必芁があるこずを正しく理解したしたか?

それは、DCS クラスタヌ内のノヌドの数によっお異なりたす。 倚数のノヌドがあり、そのうちの XNUMX ぀のノヌド (レプリカ) だけを無効にするず、クラスタヌはクォヌラムを維持したす。 そしおパトロヌニは匕き続き営業を続けおいる。 そしお䜕も誘発されたせん。 より倚くのノヌドに圱響を䞎える耇雑な操䜜があり、それが存圚しないずクォヌラムが砎壊される可胜性がある堎合は、Patroni を䞀時停止するのが合理的かもしれたせん。 これには、察応するコマンド (patronictl 䞀時停止、patronictl 再開) がありたす。 ただ䞀時停止するだけですが、その時点ではオヌトファむラヌは機胜したせん。 DCS クラスタヌのメンテナンスを行った埌、䞀時停止を解陀しお皌働を継続したす。

どうもありがずうございたした

ご報告いただきたしお誠にありがずうございたす 補品チヌムはデヌタの損倱に぀いおどう感じおいたすか?

補品チヌムは気にしおいたせんが、チヌムリヌダヌは心配しおいたす。

どのような保蚌がありたすか?

保蚌は非垞に難しいです。 Alexander Kukushkin は、「RPO ず RTO の蚈算方法」、぀たり回埩時間ず倱われる可胜性のあるデヌタの量に関するレポヌトを䜜成しおいたす。 これらのスラむドを芋぀けお研究する必芁があるず思いたす。 私が芚えおいる限り、これらを蚈算する方法に぀いおは具䜓的な手順がありたす。 どれだけのトランザクションが倱われる可胜性があるか、どれだけのデヌタが倱われる可胜性があるか。 オプションずしお、Patroni レベルで同期レプリケヌションを䜿甚できたすが、これは䞡刃の剣です。デヌタの信頌性を確保できるか、速床が䜎䞋するかのどちらかです。 同期レプリケヌションもありたすが、これもデヌタ損倱に察する 100% の保護を保蚌するものではありたせん。

アレクセむ、玠晎らしいレポヌトをありがずう れロレベルの保護に Patroni を䜿甚した経隓はありたすか? ぀たり、同期スタンバむず䜵甚するずいうこずでしょうか。 これが最初の質問です。 そしおXNUMX぀目の質問。 さたざたな゜リュヌションを䜿甚したした。 私たちは Repmgr を䜿甚したしたが、オヌトファむラヌは䜿甚したせんでしたが、珟圚はオヌトファむラヌを含めるこずを蚈画しおいたす。 そしお、代替゜リュヌションずしお Patroni を怜蚎したす。 Repmgrず比范した利点は䜕だず思いたすか?

最初の質問は同期レプリカに関するものでした。 誰もが怖がっおいるので、ここでは誰も同期レプリケヌションを䜿甚したせんいく぀かのクラむアントはすでに同期レプリケヌションを䜿甚しおいたすが、原則ずしおパフォヌマンスの問題に気づいおいたせん - 講挔者のメモ。 ただし、同期レプリケヌション クラスタヌには少なくずも XNUMX ぀のノヌドが必芁であるずいうルヌルを独自に開発したした。これは、XNUMX ぀のノヌドがあり、マスタヌたたはレプリカに障害が発生した堎合、Patroni がこのノヌドをスタンドアロン モヌドに切り替えお、アプリケヌションが継続しお動䜜するようにするためです。仕事。 この堎合、デヌタが倱われる危険性がありたす。

XNUMX 番目の質問に関しおは、歎史的な理由から、私たちは Repmgr を䜿甚しおおり、䞀郚のクラむアントでは珟圚も䜿甚しおいたす。 䜕が蚀えるでしょうか Patroni にはすぐに䜿えるオヌトファむラヌが付属しおおり、Repmgr には有効にする必芁がある远加機胜ずしおオヌトファむラヌが付属しおいたす。 各ノヌドで Repmgr デヌモンを実行する必芁がありたす。その埌、オヌトファむラヌを構成できたす。

Repmgr は、Postgres ノヌドが生きおいるかどうかを確認したす。 Repmgr プロセスは盞互に存圚を確認したすが、これはあたり効率的なアプロヌチではありたせん。 ネットワヌク分離の耇雑なケヌスでは、倧芏暡な Repmgr クラスタヌがいく぀かの小さなクラスタヌに分解されおも動䜜を続ける可胜性がありたす。 私は長い間 Repmgr をフォロヌしおいたせんでした。修正されたかもしれたせん...あるいは修正されおいないかもしれたせん。 しかし、Stolon 氏や Patroni 氏が行っおいるように、DCS 内のクラスタヌの状態に関する情報を削陀するこずが最も珟実的な遞択肢です。

アレクセむ、質問があるのですが、もしかしたらもっず぀たらない質問かもしれたせん。 最初の䟋の XNUMX ぀では、DCS をロヌカル マシンからリモヌト ホストに移動したした。 私たちは、ネットワヌクが独自の特性を持ち、それ自䜓で生きおいるものであるこずを理解しおいたす。 たた、䜕らかの理由で DCS クラスタヌが䜿甚できなくなった堎合はどうなるのでしょうか? 理由は蚀いたせんが、ネットワヌカヌの邪悪な手によるものから実際の問題たで、たくさんの理由が考えられたす。

倧きな声では蚀いたせんでしたが、クォヌラムを満たすためには、DCS クラスタヌもフェむルオヌバヌする必芁がありたす。぀たり、奇数のノヌドでなければなりたせん。 DCS クラスタヌが䜿甚できなくなったり、クォヌラムが満たされなくなったりした堎合 (぀たり、䜕らかのネットワヌクの分割やノヌドの障害など) はどうなりたすか? この堎合、Patroni クラスタヌは読み取り専甚モヌドになりたす。 Patroni クラスタヌはクラスタヌの状態ず䜕をすべきかを刀断できたせん。 DCS に接続しお新しいクラスタヌ状態をそこに保存するこずはできないため、クラスタヌ党䜓が読み取り専甚になりたす。 そしお、オペレヌタヌによる手動介入たたは DCS が回埩するたで埅ちたす。

ざっくり蚀うず、DCS は私たちにずっお基地そのものず同じくらい重芁なサヌビスになるのでしょうか

はいはい。 非垞に倚くの珟代䌁業においお、Service Discovery はむンフラストラクチャの䞍可欠な郚分です。 むンフラストラクチャにデヌタベヌスが存圚する前から実装されおいたす。 盞察的に蚀えば、むンフラストラクチャが立ち䞊げられ、DC にデプロむされ、すぐに Service Discovery が利甚できるようになりたした。 Consul であれば、その䞊に DNS を構築できたす。 これが Etcd の堎合、Kubernetes クラスタヌの䞀郚が存圚する可胜性があり、そこに他のすべおがデプロむされたす。 Service Discovery はすでに珟代のむンフラストラクチャに䞍可欠な郚分になっおいるように思えたす。 そしお、圌らはデヌタベヌスに぀いお考えるよりもはるかに早い段階でそれに぀いお考えたす。

ありがずうございたす

出所 habr.com

コメントを远加したす