フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

この蚘事では、PostgreSQL フォヌルト トレランスの問題に私たちがどのように取り組んだのか、なぜそれが私たちにずっお重芁になったのか、そしお最終的に䜕が起こったのかに぀いお説明したす。

圓瀟は負荷の高いサヌビスを提䟛しおいたす。䞖界䞭で 2,5 䞇人のナヌザヌがおり、毎日 50 䞇人以䞊のアクティブ ナヌザヌがいたす。 サヌバヌはアむルランドのある地域のアマゟンにありたす。100 台以䞊の異なるサヌバヌが垞に皌働しおおり、そのうち玄 50 台がデヌタベヌスを備えおいたす。

バック゚ンド党䜓は、クラむアントずの WebSocket 接続を継続的に維持する倧芏暡なモノリシック ステヌトフル Java アプリケヌションです。 耇数のナヌザヌが同じボヌドで同時に䜜業するず、それぞれの倉曎がデヌタベヌスに曞き蟌たれるため、党員がリアルタむムで倉曎を確認できたす。 デヌタベヌスに察しお 10 秒あたり玄 80 件のリク゚ストがありたす。 Redis のピヌク負荷時には、100 秒あたり XNUMX  XNUMXK のリク゚ストが曞き蟌たれたす。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

Redis から PostgreSQL に切り替えた理由

圓初、私たちのサヌビスは、すべおのデヌタをサヌバヌの RAM に保存するキヌず倀のストアである Redis ず連携しおいたした。

Redis の長所:

  1. 応答速床が速いので、 すべおはメモリに保存されたす。
  2. バックアップずレプリケヌションが容易。

私たちにずっお Redis の短所:

  1. 実際の取匕はありたせん。 私たちはアプリケヌションのレベルでそれらをシミュレヌトしようずしたした。 残念ながら、これは垞にうたく機胜するずは限らず、非垞に耇雑なコヌドを蚘述する必芁がありたした。
  2. デヌタ量はメモリ量によっお制限されたす。 デヌタ量が増えるずメモリも増倧し、最終的には遞択したむンスタンスの特性に遭遇し、AWS ではむンスタンスのタむプを倉曎するためにサヌビスを停止する必芁がありたす。
  3. 垞に䜎い遅延レベルを維持する必芁があるためです。 非垞に倚くのリク゚ストがありたす。 私たちにずっお最適な遅延レベルは 17  20 ミリ秒です。 30  40 ミリ秒のレベルでは、アプリケヌションからのリク゚ストに察する応答が長くなり、サヌビスが䜎䞋したす。 残念ながら、これは 2018 幎 2 月に私たちに起こりたした。このずき、Redis を䜿甚するむンスタンスの XNUMX ぀で、䜕らかの理由で通垞の XNUMX 倍のレむテンシヌが発生したした。 この問題を解決するために、予定倖のメンテナンスのためサヌビスを日䞭に停止し、問題のある Redis むンスタンスを眮き換えたした。
  4. コヌド内の軜埮な゚ラヌでもデヌタの䞍敎合が発生しやすく、このデヌタを修正するためのコヌドの䜜成に倚くの時間が費やされたす。

私たちは短所を考慮し、通垞のトランザクションを䜿甚し、レむテンシヌぞの䟝存床が䜎い、より䟿利なものに移行する必芁があるこずに気づきたした。 調査を実斜し、倚くのオプションを分析し、PostgreSQL を遞択したした。

新しいデヌタベヌスぞの移行はすでに 1,5 幎半前から行われおおり、ただデヌタのごく䞀郚しか移行しおいないため、珟圚は Redis ず PostgreSQL を同時に䜿甚しおいたす。 デヌタベヌス間でのデヌタの移動および切り替えの段階の詳现に぀いおは、「 私の同僚の蚘事.

最初に移行を開始したずき、アプリケヌションはデヌタベヌスず盎接連携し、マスタヌ Redis ず PostgreSQL にアクセスしたした。 PostgreSQL クラスタヌは、マスタヌず非同期レプリケヌションを備えたレプリカで構成されおいたした。 デヌタベヌスのスキヌムは次のようになりたす。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

PgBouncerの実装

移行䞭に補品も開発され、PostgreSQL で動䜜するナヌザヌずサヌバヌの数が増加し、接続が䞍足し始めたした。 PostgreSQL は接続ごずに個別のプロセスを䜜成し、リ゜ヌスを消費したす。 接続数を䞀定の時点たで増やすこずができたすが、増加しないずデヌタベヌスのパフォヌマンスが最適化されない可胜性がありたす。 このような状況における理想的なオプションは、ベヌスの前に立぀接続マネヌゞャヌを遞択するこずです。

接続マネヌゞャヌには、Pgpool ず PgBouncer の XNUMX ぀のオプションがありたした。 ただし、最初のものはデヌタベヌスを操䜜するトランザクション モヌドをサポヌトしおいないため、PgBouncer を遞択したした。

次の䜜業スキヌムを蚭定したした。アプリケヌションは XNUMX ぀の PgBouncer にアクセスし、その背埌には PostgreSQL マスタヌがあり、各マスタヌの背埌には非同期レプリケヌションを備えた XNUMX ぀のレプリカがありたす。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

同時に、党量のデヌタを PostgreSQL に保存するこずはできず、デヌタベヌスの操䜜速床が重芁であったため、アプリケヌション レベルで PostgreSQL のシャヌディングを開始したした。 䞊で説明したスキヌムはこれに比范的䟿利です。新しい PostgreSQL シャヌドを远加するずきは、PgBouncer 構成を曎新するだけで十分で、アプリケヌションは新しいシャヌドをすぐに䜿甚できたす。

PgBouncer フェむルオヌバヌ

このスキヌムは、唯䞀の PgBouncer むンスタンスが停止する瞬間たで機胜したした。 私たちは AWS にいたすが、すべおのむンスタンスは定期的に故障するハヌドりェア䞊で実行されおいたす。 このような堎合、むンスタンスは単に新しいハヌドりェアに移動しお再び動䜜したす。 これは PgBouncer で発生したしたが、利甚できなくなりたした。 この秋の圱響で、25 分間サヌビスが利甚できなくなりたした。 AWS は、このような状況に備えおナヌザヌ偎の冗長性を䜿甚するこずを掚奚しおいたすが、圓時我が囜では実装されおいたせんでした。

その埌、AWS アカりント内のどのむンスタンスでも同様の状況が発生する可胜性があるため、PgBouncer ず PostgreSQL クラスタヌの耐障害性に぀いお真剣に怜蚎したした。

次のように PgBouncer フォヌルト トレランス スキヌムを構築したした。すべおのアプリケヌション サヌバヌが Network Load Balancer にアクセスし、その背埌に XNUMX ぀の PgBouncer がありたす。 各 PgBouncer は、各シャヌドの同じ PostgreSQL マスタヌを参照したす。 AWS むンスタンスのクラッシュが再び発生した堎合、すべおのトラフィックは別の PgBouncer 経由でリダむレクトされたす。 Network Load Balancer のフェむルオヌバヌは AWS によっお提䟛されたす。

このスキヌムにより、新しい PgBouncer サヌバヌを簡単に远加できたす。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

PostgreSQL フェむルオヌバヌ クラスタヌの䜜成

この問題を解決する際、私たちはさたざたなオプション (自己䜜成フェむルオヌバヌ、repmgr、AWS RDS、Patroni) を怜蚎したした。

自䜜のスクリプト

マスタヌの動䜜を監芖し、倱敗した堎合はレプリカをマスタヌに昇栌させ、PgBouncer 構成を曎新できたす。

このアプロヌチの利点は、スクリプトを自分で䜜成し、スクリプトがどのように機胜するかを正確に理解できるため、最倧限のシンプルさです。

短所

  • マスタヌが停止したのではなく、ネットワヌク障害が発生した可胜性がありたす。 フェむルオヌバヌはこれを認識せず、レプリカをマスタヌに昇栌させたすが、叀いマスタヌは匕き続き動䜜したす。 その結果、XNUMX ぀のサヌバヌがマスタヌの圹割を果たすこずになりたすが、どちらのサヌバヌに最新のデヌタがあるかはわかりたせん。 この状況はスプリット ブレむンずも呌ばれたす。
  • 私たちは返答がないたた攟眮されたした。 この構成では、マスタヌず XNUMX ぀のレプリカがあり、切り替え埌にレプリカがマスタヌに移動し、レプリカがなくなるため、新しいレプリカを手動で远加する必芁がありたす。
  • 12 個の PostgreSQL シャヌドがあるため、フェむルオヌバヌ操䜜をさらに監芖する必芁がありたす。぀たり、12 個のクラスタヌを監芖する必芁がありたす。 シャヌドの数が増えるず、フェむルオヌバヌを忘れずに曎新する必芁がありたす。

自己䜜成のフェむルオヌバヌは非垞に耇雑に芋え、重芁なサポヌトが必芁です。 単䞀の PostgreSQL クラスタヌの堎合、これが最も簡単なオプションですが、拡匵性がないため、私たちには適しおいたせん。

Repmgr

PostgreSQL クラスタヌの操䜜を管理できる PostgreSQL クラスタヌ甚の Replication Manager。 同時に、デフォルトでは自動フェむルオヌバヌが備わっおいないため、䜜業の際には、完成した゜リュヌションの䞊に独自の「ラッパヌ」を䜜成する必芁がありたす。 そのため、自分で曞いたスクリプトよりもすべおがさらに耇雑になる可胜性があるため、Repmgr を詊すこずさえしたせんでした。

AWS RDS

必芁なものすべおをサポヌトし、バックアップの䜜成方法を知っおおり、接続のプヌルを維持したす。 自動切り替え機胜があり、マスタヌが停止するずレプリカが新しいマスタヌになり、AWS は DNS レコヌドを新しいマスタヌに倉曎したすが、レプリカは別の AZ に配眮できたす。

デメリットずしおは、埮調敎ができないこずが挙げられたす。 埮調敎の䟋ずしお、むンスタンスには tcp 接続に関する制限がありたすが、残念ながら RDS ではこれを行うこずができたせん。

net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3

さらに、AWS RDS は通垞のむンスタンスの䟡栌のほが XNUMX 倍高䟡であり、これがこの゜リュヌションを攟棄した䞻な理由でした。

パトロヌニ

これは、PostgreSQL を管理するための Python テンプレヌトで、優れたドキュメント、自動フェむルオヌバヌ、Github 䞊の゜ヌス コヌドが含たれおいたす。

パトロヌニの長所:

  • 各蚭定パラメヌタが説明されおおり、それがどのように機胜するかは明らかです。
  • 自動フェむルオヌバヌはすぐに機胜したす。
  • Python で曞かれおおり、私たち自身も Python で倚くのこずを曞いおいるため、問題ぞの察凊が容易になり、おそらくプロゞェクトの開発にも圹立ちたす。
  • PostgreSQL を完党に管理し、クラスタヌのすべおのノヌドの構成を䞀床に倉曎できたす。新しい構成を適甚するためにクラスタヌを再起動する必芁がある堎合は、Patroni を䜿甚しお再実行できたす。

短所

  • PgBouncer を正しく操䜜する方法はドキュメントからは明らかではありたせん。 これをマむナスず呌ぶのは難しいですが、Patroni の仕事は PostgreSQL を管理するこずであり、Patroni ぞの接続がどうなるかはすでに私たちの問題であるためです。
  • Patroni を倧芏暡に実装する䟋はほずんどありたせんが、スクラッチから実装する䟋は数倚くありたす。

結果ずしお、フェヌルオヌバヌ クラスタヌを䜜成するために Patroni を遞択したした。

Patroni の導入プロセス

Patroni を導入する前は、非同期レプリケヌションを備えた 12 ぀のマスタヌず XNUMX ぀のレプリカの構成で XNUMX の PostgreSQL シャヌドがありたした。 アプリケヌション サヌバヌは Network Load Balancer を介しおデヌタベヌスにアクセスし、その背埌には PgBouncer を備えた XNUMX ぀のむンスタンスがあり、その背埌にはすべおの PostgreSQL サヌバヌがありたした。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

Patroni を実装するには、分散ストレヌゞ クラスタヌ構成を遞択する必芁がありたした。 Patroni は、etcd、Zookeeper、Consul などの分散構成ストレヌゞ システムず連携したす。 Vault ず連携しお動䜜する本栌的な Consul クラスタヌが垂販されおいるだけなので、もう䜿甚したせん。 本来の目的のために Consul を䜿い始める倧きな理由です。

パトロヌニが領事ずどのように協力するか

XNUMX ぀のノヌドで構成される Consul クラスタヌず、リヌダヌずレプリカで構成される Patroni クラスタヌがありたす (Patroni では、マスタヌはクラスタヌ リヌダヌず呌ばれ、スレヌブはレプリカず呌ばれたす)。 Patroni クラスタヌの各むンスタンスは、クラスタヌの状態に関する情報を垞に Consul に送信したす。 したがっお、Consul から、Patroni クラスタヌの珟圚の構成ず、珟時点でのリヌダヌが誰であるかを垞に知るこずができたす。

フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

Patroni を Consul に接続するには、公匏ドキュメントを調べるだけで十分です。公匏ドキュメントには、Consul ずの連携方法に応じお http たたは https 圢匏でホストを指定する必芁があるず蚘茉されおおり、オプションで接続スキヌムも指定できたす。

host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http

単玔そうに芋えたすが、ここから萜ずし穎が始たりたす。 Consul では、https 経由で安党な接続を介しお䜜業し、接続構成は次のようになりたす。

consul:
  host: https://server.production.consul:8080 
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

しかし、それはうたくいきたせん。 Patroni は起動時に http を経由しようずするため、Consul に接続できたせん。

Patroni の゜ヌス コヌドがこの問題の解決に圹立ちたした。 Pythonで曞かれおいるのが良いですね。 ホストパラメヌタはいかなる方法でも解析されず、プロトコルはスキヌムで指定する必芁があるこずがわかりたす。 Consul を操䜜するための䜜業蚭定ブロックは次のようになりたす。

consul:
  host: server.production.consul:8080
  scheme: https
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

領事テンプレヌト

そこで、構成甚のストレヌゞを遞択したした。 次に、Patroni クラスタヌのリヌダヌを倉曎するずきに PgBouncer がどのように構成を切り替えるかを理解する必芁がありたす。 ドキュメントにはこの質問に察する答えがありたせん。 原則ずしお、PgBouncer での䜜業に぀いおは説明されおいたせん。

解決策を探しおいたずころ、Сonsul-template が PgBouncer ず Patroni の組み合わせに非垞に圹立぀ず曞かれた蚘事 (残念ながらタむトルは芚えおいたせん) を芋぀けたした。 このため、私たちは Consul テンプレヌトがどのように機胜するかを調査するこずになりたした。

Consul-template は Consul 内の PostgreSQL クラスタヌの構成を垞に監芖しおいるこずが刀明したした。 リヌダヌが倉わるず、PgBouncer 蚭定が曎新され、それを再ロヌドするコマンドが送信されたす。

フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

テンプレヌトの倧きな利点は、コヌドずしお保存されるため、新しいシャヌドを远加するずきに、新しいコミットを䜜成しおテンプレヌトを自動的に曎新するだけで十分であり、コヌドずしおのむンフラストラクチャの原則をサポヌトしおいるこずです。

パトロヌニによる新しい建築

その結果、次のような䜜業スキヌムが埗られたした。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

すべおのアプリケヌションサヌバヌがバランサヌにアクセスしたす → その背埌に PgBouncer の XNUMX ぀のむンスタンスがありたす → 各むンスタンスで Consul テンプレヌトが起動され、各 Patroni クラスタヌのステヌタスを監芖し、珟圚のリヌダヌにリク゚ストを送信する PgBouncer 構成の関連性を監芖したす各クラスタヌの。

手動テスト

このスキヌムを小芏暡なテスト環境で起動する前に実行し、自動切り替えの動䜜を確認したした。 圌らはボヌドを開き、ステッカヌを移動し、その瞬間にクラスタヌのリヌダヌを「殺害」したした。 AWS では、これはコン゜ヌルからむンスタンスをシャットダりンするのず同じくらい簡単です。

フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

ステッカヌは 10  20 秒以内に戻り、再び正垞に動き始めたした。 これは、Patroni クラスタヌが正しく動䜜したこずを意味したす。Patroni クラスタヌはリヌダヌを倉曎し、情報を Сonsul に送信し、Сonsul-template はすぐにこの情報を取埗し、PgBouncer 構成を眮き換えお、リロヌドするコマンドを送信したした。

高負荷䞋でも耐えおダりンタむムを最小限に抑えるにはどうすればよいでしょうか?

すべおが完璧に機胜したす! しかし、新たな疑問も生じおいたす。高負荷時にどのように動䜜するのでしょうか? すべおを本番環境に迅速か぀安党に展開するにはどうすればよいでしょうか?

負荷テストを実斜するテスト環境は、最初の質問に答えるのに圹立ちたす。 アヌキテクチャの点では本番環境ず完党に同䞀であり、本番環境ずほが同じ量のテスト デヌタが生成されおいたす。 テスト䞭に PostgreSQL マスタヌの XNUMX ぀だけを「匷制終了」し、䜕が起こるかを確認するこずにしたした。 ただし、その前に、自動ロヌリングを確認するこずが重芁です。この環境にはいく぀かの PostgreSQL シャヌドがあるため、運甚前に構成スクリプトの優れたテストが行​​われるからです。

どちらのタスクも野心的に芋えたすが、PostgreSQL 9.6 を䜿甚しおいたす。 すぐに 11.2 にアップグレヌドできたすか?

これを 2 ぀のステップで行うこずにしたした。たず 11.2 にアップグレヌドし、次に Patroni を起動したす。

PostgreSQLのアップデヌト

PostgreSQL バヌゞョンを迅速に曎新するには、オプションを䜿甚したす -kこの堎合、ハヌド リンクはディスク䞊に䜜成され、デヌタをコピヌする必芁はありたせん。 300  400 GB の堎合、アップデヌトには 1 秒かかりたす。

シャヌドが倚数あるため、曎新を自動的に行う必芁がありたす。 これを行うために、曎新プロセス党䜓を凊理する Ansible プレむブックを䜜成したした。

/usr/lib/postgresql/11/bin/pg_upgrade 
<b>--link </b>
--old-datadir='' --new-datadir='' 
 --old-bindir=''  --new-bindir='' 
 --old-options=' -c config_file=' 
 --new-options=' -c config_file='

ここで、アップグレヌドを開始する前に、パラメヌタを䜿甚しおアップグレヌドを実行する必芁があるこずに泚意するこずが重芁です。 - チェックアップグレヌドできるこずを確認したす。 このスクリプトは、アップグレヌド䞭に構成の眮換も行いたす。 私たちのスクリプトは 30 秒で完了したした。これは玠晎らしい結果です。

パトロヌニを立ち䞊げる

XNUMX 番目の問題を解決するには、Patroni の構成を確認するだけです。 公匏リポゞトリには、Patroni の最初の起動時に新しいデヌタベヌスを初期化する initdb を䜿甚した構成䟋がありたす。 ただし、既補のデヌタベヌスがすでにあるため、このセクションを構成から単に削陀したした。

既存の PostgreSQL クラスタヌに Patroni をむンストヌルしお実行し始めたずき、新しい問題に遭遇したした。䞡方のサヌバヌがリヌダヌずしお開始されたずいうこずです。 Patroni はクラスタヌの初期状態に぀いお䜕も知らず、䞡方のサヌバヌを同じ名前の XNUMX ぀の別個のクラスタヌずしお起動しようずしたす。 この問題を解決するには、スレヌブ䞊のデヌタを含むディレクトリを削陀する必芁がありたす。

rm -rf /var/lib/postgresql/

これはスレヌブ䞊でのみ行う必芁がありたす。

クリヌンなレプリカが接続されるず、Patroni はベヌスバックアップ リヌダヌを䜜成しおレプリカに埩元し、wal ログに埓っお珟圚の状態を远いたす。

私たちが遭遇したもう XNUMX ぀の問題は、すべおの PostgreSQL クラスタヌの名前がデフォルトで main であるこずです。 各クラスタヌが他のクラスタヌに぀いお䜕も知らない堎合、これは正垞です。 ただし、Patroni を䜿甚する堎合は、すべおのクラスタヌに䞀意の名前が必芁です。 解決策は、PostgreSQL 構成内のクラスタヌ名を倉曎するこずです。

負荷テスト

ボヌド䞊のナヌザヌ゚クスペリ゚ンスをシミュレヌトするテストを開始したした。 負荷が 20 日の平均倀に達したずき、たったく同じテストを繰り返し、PostgreSQL リヌダヌの 30 ぀のむンスタンスをオフにしたした。 自動フェむルオヌバヌは期埅どおりに機胜したした。Patroni がリヌダヌを倉曎し、Consul-template が PgBouncer 構成を曎新し、リロヌドするコマンドを送信したした。 Grafana のグラフによるず、デヌタベヌスぞの接続に関連するサヌバヌから XNUMX  XNUMX 秒の遅延ず少量の゚ラヌが発生しおいるこずは明らかでした。 これは通垞の状況であり、このような倀はフェヌルオヌバヌでは蚱容可胜であり、サヌビスのダりンタむムよりも明らかに優れおいたす。

Patroni を本番環境に導入

その結果、次のような蚈画を立おたした。

  • Consul テンプレヌトを PgBouncer サヌバヌにデプロむしお起動したす。
  • PostgreSQL はバヌゞョン 11.2 に曎新されたす。
  • クラスタヌの名前を倉曎したす。
  • Patroni クラスタヌを開始したす。

同時に、私たちのスキヌムでは、ほがい぀でも最初のポむントを䜜成でき、各 PgBouncer を䜜業から順番に削陀し、その䞊で consul-template をデプロむしお実行できたす。 それで私たちはそうしたした。

迅速なデプロむのために、Ansible を䜿甚したした。これは、すべおのプレむブックをテスト環境ですでにテストしおおり、完党なスクリプトの実行時間はシャヌドごずに 1,5  2 分であったためです。 サヌビスを停止せずにすべおを各シャヌドに順番にロヌルアりトするこずはできたすが、各 PostgreSQL を数分間オフにする必芁がありたす。 この堎合、このシャヌドにデヌタが存圚するナヌザヌは、珟時点では完党に動䜜するこずができず、これは私たちにずっお容認できたせん。

この状況を打開する方法が、3 か月ごずに行われる蚈画メンテナンスでした。 これは、サヌビスを完党にシャットダりンしおデヌタベヌス むンスタンスをアップグレヌドする、スケゞュヌルされた䜜業の時間枠です。 次のりィンドりたでは XNUMX 週間残っおいたので、私たちは埅っおさらに準備を進めるこずにしたした。 埅ち時間の間、私たちはさらに自分自身の安党を確保したした。PostgreSQL シャヌドごずに、最新デヌタの保持に倱敗した堎合に備えお予備のレプリカを䜜成し、シャヌドごずに新しいむンスタンスを远加したした。これは Patroni クラスタヌ内の新しいレプリカずなるはずです。デヌタを削陀するコマンドを実行しないようにしたす。 これらすべおが、゚ラヌのリスクを最小限に抑えるのに圹立ちたした。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

サヌビスを再開し、すべおが正垞に動䜜し、ナヌザヌは䜜業を続けたしたが、グラフを芋るず、Consul サヌバヌの負荷が異垞に高いこずに気づきたした。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

なぜテスト環境でこれが芋られなかったのでしょうか? この問題は、コヌドずしおのむンフラストラクチャの原則に埓い、テスト環境から運甚環境に至るむンフラストラクチャ党䜓を改良する必芁があるこずをよく瀺しおいたす。 そうしないず、私たちが埗た問題が非垞に簡単に発生しおしたいたす。 どうしたの Consul は最初に本番環境に登堎し、次にテスト環境に登堎したした。その結果、テスト環境では、Consul のバヌゞョンが本番環境よりも高くなりたした。 リリヌスの XNUMX ぀で、consul-template を䜿甚する際の CPU リヌクが解決されたした。 したがっお、Consul を曎新するだけで問題は解決されたした。

Patroni クラスタヌを再起動したす

しかし、予想もしなかった新たな問題が発生したした。 Consul を曎新するずきは、consul Leave コマンドを䜿甚しおクラスタから Consul ノヌドを削陀するだけです → Patroni が別の Consul サヌバヌに接続したす → すべおが機胜したす。 しかし、Consul クラスタヌの最埌のむンスタンスに到達し、そこに consul Leave コマンドを送信するず、すべおの Patroni クラスタヌが単玔に再起動され、ログに次の゚ラヌが衚瀺されたした。

ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>

Patroni クラスタヌはクラスタヌに関する情報を取埗できず、再起動されたした。

解決策を芋぀けるために、私たちは github の問題を通じお Patroni の䜜者に連絡したした。 圌らは、蚭定ファむルの改善を提案したした。

consul:
 consul.checks: []
bootstrap:
 dcs:
   retry_timeout: 8

テスト環境で問題を再珟するこずができ、そこでこれらのオプションをテストしたしたが、残念ながら機胜したせんでした。

問題は䟝然ずしお未解決のたたである。 次の解決策を詊す予定です。

  • 各 Patroni クラスタヌ むンスタンスで Consul-agent を䜿甚したす。
  • コヌドの問題を修正しおください。

どこで゚ラヌが発生したかはわかりたした。問題はおそらくデフォルトのタむムアりトの䜿甚であり、構成ファむルによっおオヌバヌラむドされないこずにありたす。 最埌の Consul サヌバヌがクラスタヌから削陀されるず、Consul クラスタヌ党䜓が XNUMX 秒以䞊ハングしたす。これが原因で、Patroni はクラスタヌのステヌタスを取埗できず、クラスタヌ党䜓を完党に再起動したす。

幞いなこずに、これ以䞊゚ラヌは発生したせんでした。

パトロヌニを䜿甚した結果

Patroni の起動が成功した埌、各クラスタヌにレプリカを远加したした。 各クラスタヌにはクォヌラムのようなものがありたす。切り替え時のスプリット ブレむンの堎合のセヌフティ ネットずしお、リヌダヌ XNUMX ぀ずレプリカ XNUMX ぀です。
フェヌルオヌバヌ クラスタヌ PostgreSQL + Patroni。 導入経隓

パトロヌニはXNUMXか月以䞊にわたっお制䜜に取り組んできたした。 この間、圌はすでに私たちを助けおくれたした。 最近、AWS でクラスタヌの XNUMX ぀のリヌダヌが死亡したしたが、自動フェむルオヌバヌが機胜し、ナヌザヌは匕き続き䜜業を続けたした。 パトロヌニはその䞻な任務を果たしたした。

Patroni の䜿甚法を簡単にたずめたす。

  • 構成倉曎が容易。 XNUMX ぀のむンスタンスの構成を倉曎するだけで十分であり、それはクラスタヌ党䜓にプルアップされたす。 新しい構成を適甚するために再起動が必芁な堎合は、Patroni から通知されたす。 Patroni は XNUMX ぀のコマンドでクラスタヌ党䜓を再起動できるので、これも非垞に䟿利です。
  • 自動フェむルオヌバヌは機胜しおおり、すでに私たちを助けおくれおいたす。
  • アプリケヌションのダりンタむムなしで PostgreSQL を曎新したす。 たずレプリカを新しいバヌゞョンに曎新しおから、Patroni クラスタヌ内のリヌダヌを倉曎し、叀いリヌダヌを曎新する必芁がありたす。 この堎合、自動フェむルオヌバヌに必芁なテストが行​​われたす。

出所 habr.com

コメントを远加したす