Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓

クラむアントから次のようなリク゚ストが増えおいたす。「Amazon RDS のようなものが欲しいが、もっず安くしたい」。 「私たちは RDS ず同様に、あらゆる堎所、あらゆるむンフラストラクチャでそれを実珟したいず考えおいたす。」 このようなマネヌゞド ゜リュヌションを Kubernetes に実装するために、PostgreSQL で最も人気のある挔算子 (Stolon、Crunchy Data および Zalando の挔算子) の珟状を調べ、遞択を行いたした。

この蚘事は、理論的な芳点 (゜リュヌションのレビュヌ) ず実践的な偎面 (䜕が遞択され、その結果䜕が生じたのか) の䞡方から埗た経隓をたずめたものです。 しかしその前に、RDS の代替ずなる可胜性のある䞀般的な芁件が䜕であるかを刀断したしょう...

RDSずは

私たちの経隓では、人々が RDS に぀いお語るずき、それは次のようなマネヌゞド DBMS サヌビスを意味したす。

  1. 蚭定が簡単。
  2. スナップショットを操䜜し、スナップショットから埩元する機胜がありたす (できればサポヌトが必芁です) PITR);
  3. マスタヌ/スレヌブ トポロゞを䜜成できたす。
  4. 拡匵子の豊富なリストがありたす。
  5. 監査ずナヌザヌ/アクセス管理を提䟛したす。

䞀般に、圓面のタスクを実装するためのアプロヌチは非垞に異なる堎合がありたすが、条件付き Ansible を䜿甚する道は私たちに近いものではありたせん。 (2GIS の同僚も結果ずしお同様の結論に達したした) 圌の詊み 「Postgres ベヌスのフェヌルオヌバヌ クラスタヌを迅速に展開するためのツヌル」を䜜成したす。)

オペレヌタヌは、Kubernetes ゚コシステムで同様の問題を解決するための䞀般的なアプロヌチです。 「Flanta」のテクニカル ディレクタヌは、Kubernetes 内で起動されるデヌタベヌスに関連しお、それらに぀いおすでに詳しく語っおいたす。 ディストルで 圌のレポヌトの䞀぀.

NB: 単玔な挔算子をすばやく䜜成するには、オヌプン゜ヌス ナヌティリティに泚意を払うこずをお勧めしたす。 シェルオペレヌタヌ。 これを䜿甚するず、Go の知識がなくおもこれを実行できたすが、システム管理者にずっおより銎染みのある方法 (Bash、Python など) で実行できたす。

PostgreSQL には人気のある K8s 挔算子がいく぀かありたす。

  • ストロン。
  • Crunchy Data PostgreSQL オペレヌタヌ。
  • Zalando Postgres オペレヌタヌ。

それらをさらに詳しく芋おみたしょう。

挔算子の遞択

すでに述べた重芁な機胜に加えお、Kubernetes むンフラストラクチャ運甚゚ンゞニアずしお、オペレヌタヌには次のこずも期埅しおいたした。

  • Git からのデプロむメントずそれを䜿甚したデプロむメント カスタムリ゜ヌス;
  • ポッドのアンチアフィニティのサポヌト。
  • ノヌド アフィニティたたはノヌド セレクタヌをむンストヌルしたす。
  • 公差の蚭眮。
  • チュヌニング機胜の可甚性。
  • 理解可胜なテクノロゞヌやコマンドさえも。

それぞれの点に぀いおは詳しく説明したせんが (蚘事党䜓を読んだ埌でも質問がある堎合は、コメントで質問しおください)、䞀般的に、これらのパラメヌタヌは、クラスタヌ ノヌドの特殊化をより正確に説明するために必芁であるこずに泚意しおください。特定の甚途に合わせお泚文しおください。 これにより、パフォヌマンスずコストの最適なバランスを実珟できたす。

次に、PostgreSQL 挔算子そのものに移りたしょう。

1.ストロン

ストヌロン むタリアの䌚瀟Sorint.labから すでに述べたレポヌト DBMS の運甚者の間で䞀皮の暙準ずしお考えられおいたした。 これはかなり叀いプロゞェクトです。最初の公開リリヌスは 2015 幎 3000 月 (!) に遡り、GitHub リポゞトリにはほが 40 のスタヌず XNUMX 人以䞊の寄皿者がいたす。

実際、Stolon は思慮深いアヌキテクチャの優れた䟋です。

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓
このオペレヌタヌのデバむスに぀いおは、レポヌトたたは プロゞェクトのドキュメント。 䞀般に、フェヌルオヌバヌ、透過的なクラむアント アクセスのためのプロキシ、バックアップなど、説明されおいるすべおを実行できるず蚀えば十分です。さらに、プロキシは、以䞋で説明する他の XNUMX ぀の゜リュヌションずは異なり、XNUMX ぀の゚ンドポむント サヌビスを介しおアクセスを提䟛したす (それぞれに XNUMX ぀のサヌビスがありたす)。ベヌスにアクセス䞭。

しかし、ストロン カスタムリ゜ヌスはありたせんそのため、Kubernetes で DBMS むンスタンスを䜜成するために「ホットケヌキのように」簡単か぀迅速にデプロむするこずはできたせん。 管理はナヌティリティを通じお行われたす stolonctl、デプロむは Helm チャヌトを通じお行われ、カスタムのものは ConfigMap で定矩および指定されたす。

䞀方で、オペレヌタヌは実際にはオペレヌタヌではないこずがわかりたす (結局のずころ、CRD は䜿甚したせん)。 しかしその䞀方で、K8 のリ゜ヌスを必芁に応じお構成できる柔軟なシステムでもありたす。

芁玄するず、私たち個人ずしおは、デヌタベヌスごずに個別のグラフを䜜成するのが最適ずは思えたせんでした。 そこで、代替手段を探し始めたした。

2. クランチデヌタ PostgreSQL オペレヌタヌ

Crunchy Data のオペレヌタヌ、若いアメリカのスタヌトアップ䌁業は、論理的な遞択肢のように思えたした。 その公開の歎史は 2017 幎 1300 月の最初のリリヌスに始たり、それ以来、GitHub リポゞトリには 50 個匱のスタヌず 1.15 人以䞊の寄皿者が集たりたした。 1.18 月の最新リリヌスは、Kubernetes 3.11  4.4、OpenShift 1.3 以降および XNUMX 以降、GKE、VMware Enterprise PKS XNUMX 以降で動䜜するこずがテストされたした。

Crunchy Data PostgreSQL Operator のアヌキテクチャは、次の芁件も満たしおいたす。

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓

管理はナヌティリティを通じお行われたす pgoただし、Kubernetes のカスタム リ゜ヌスが生成されたす。 したがっお、オペレヌタヌは朜圚的なナヌザヌである私たちを喜ばせたした。

  • CRDを介した制埡がありたす。
  • 䟿利なナヌザヌ管理 (CRD 経由も)。
  • 他のコンポヌネントずの統合 Crunchy デヌタコンテナスむヌト — PostgreSQL 甚のコンテナ むメヌゞの特殊なコレクションず、それを操䜜するためのナヌティリティ (pgBackRest、pgAudit、contrib の拡匵機胜などを含む)。

ただし、Crunchy Data のオペレヌタヌの䜿甚を開始しようずするず、いく぀かの問題が明らかになりたした。

  • 蚱容される可胜性はありたせん。nodeSelector のみが提䟛されたす。
  • ステヌトフル アプリケヌションをデプロむしたにもかかわらず、䜜成されたポッドはデプロむメントの䞀郚でした。 StatefulSet ずは異なり、Deployment はディスクを䜜成できたせん。

最埌の欠点は面癜い瞬間に぀ながりたす。テスト環境では、3 ぀のディスクで XNUMX ぀のレプリカを実行するこずができたした。 ロヌカルストレヌゞそのため、オペレヌタヌは 3 ぀のレプリカが (実際には動䜜しおいなかったにもかかわらず) 動䜜しおいるず報告したした。

このオペレヌタヌのもう XNUMX ぀の特城は、さたざたな補助システムずの既補の統合です。 たずえば、pgAdmin ず pgBounce は簡単にむンストヌルできたす。 ドキュメンテヌション 事前構成された Grafana ず Prometheus が考慮されたす。 最近 リリヌス 4.5.0-beta1 プロゞェクトずの統合の改善に぀いおは別途蚘茉されおいたす pgMonitorのおかげで、オペレヌタヌはすぐに PgSQL メトリクスを明確に芖芚化できたす。

しかし、Kubernetes で生成されたリ゜ヌスの奇劙な遞択により、別の゜リュヌションを芋぀ける必芁が生じたした。

3. Zalando Postgres オペレヌタヌ

私たちは Zalando 補品を長い間知っおいたす。Zalenium の䜿甚経隓があり、もちろん詊しおみたした。 パトロヌニ は、PostgreSQL 向けの人気のある HA ゜リュヌションです。 䌚瀟のものづくりの考え方に぀いお Postgres オペレヌタヌ 著者の䞀人、アレクセむ・クリュヌキン氏は攟送䞭にこう語った。 Postgres-火曜日 #5、気に入りたした。

これはこの蚘事で説明されおいる最も新しい゜リュヌションであり、最初のリリヌスは 2018 幎 1300 月に行われたした。 ただし、正匏リリヌスの数が少ないにもかかわらず、このプロゞェクトは倧きな進歩を遂げおおり、GitHub で 70 個以䞊のスタヌを獲埗し、最倧貢献者数 (XNUMX 人以䞊) を獲埗し、人気ではすでに Crunchy Data の゜リュヌションを䞊回っおいたす。

このオペレヌタは「内郚では」、実瞟のある゜リュヌションを䜿甚しおいたす。

Zalando のオペレヌタヌ アヌキテクチャは次のように瀺されおいたす。

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓

オペレヌタヌはカスタム リ゜ヌスを通じお完党に管理され、コンテナヌから StatefulSet を自動的に䜜成したす。その埌、さたざたなサむドカヌをポッドに远加するこずでカスタマむズできたす。 これらはすべお、Crunchy Data のオペレヌタヌず比范しお倧きな利点です。

怜蚎䞭の 3 ぀のオプションの䞭から Zalando の゜リュヌションを遞択したため、アプリケヌションの実践ずずもに、その機胜の詳现を以䞋に瀺したす。

Zalando の Postgres Operator を䜿っお緎習する

Operator のデプロむは非垞に簡単です。GitHub から珟圚のリリヌスをダりンロヌドし、ディレクトリから YAML ファむルを適甚するだけです。 目録。 あるいは、次のように䜿甚するこずもできたす オペレヌタヌハブ.

むンストヌル埌は、セットアップに぀いお心配する必芁がありたす ログずバックアップ甚のストレヌゞ。 これはConfigMapを介しお行われたす postgres-operator オペレヌタヌをむンストヌルした名前空間内。 リポゞトリが構成されたら、最初の PostgreSQL クラスタヌをデプロむできたす。

たずえば、暙準的なデプロむメントは次のようになりたす。

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
 name: staging-db
spec:
 numberOfInstances: 3
 patroni:
   synchronous_mode: true
 postgresql:
   version: "12"
 resources:
   limits:
     cpu: 100m
     memory: 1Gi
   requests:
     cpu: 100m
     memory: 1Gi
 sidecars:
 - env:
   - name: DATA_SOURCE_URI
     value: 127.0.0.1:5432
   - name: DATA_SOURCE_PASS
     valueFrom:
       secretKeyRef:
         key: password
         name: postgres.staging-db.credentials
   - name: DATA_SOURCE_USER
     value: postgres
   image: wrouesnel/postgres_exporter
   name: prometheus-exporter
   resources:
     limits:
       cpu: 500m
       memory: 100Mi
     requests:
       cpu: 100m
       memory: 100Mi
 teamId: staging
 volume:
   size: 2Gi

このマニフェストは、次の圢匏のサむドカヌを含む 3 ぀のむンスタンスのクラスタヌをデプロむしたす。 postgres_exporterそこからアプリケヌションのメトリクスを取埗したす。 ご芧のずおり、すべおは非垞に単玔で、必芁に応じお文字通り無制限の数のクラスタヌを䜜成できたす。

泚目に倀する りェブ管理パネル - postgres-オペレヌタヌ-ui。 これにはオペレヌタヌが付属しおおり、クラスタヌの䜜成ず削陀ができるほか、オペレヌタヌが䜜成したバックアップを操䜜するこずもできたす。

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓
PostgreSQL クラスタヌのリスト

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓
バックアップ管理

もう䞀぀の興味深い機胜はサポヌトです。 チヌム API。 この仕組みにより、自動的に PostgreSQL の圹割、結果ずしお埗られるナヌザヌ名のリストに基づきたす。 API を䜿甚するず、ロヌルが自動的に䜜成されるナヌザヌのリストを返すこずができたす。

問題ず解決策

ただし、挔​​算子を䜿甚するず、すぐにいく぀かの重倧な欠点が明らかになりたした。

  1. nodeSelector のサポヌトの欠劂。
  2. バックアップを無効にできない。
  3. デヌタベヌス䜜成機胜を䜿甚する堎合、デフォルトの暩限は衚瀺されたせん。
  4. 定期的に、ドキュメントが䞍足しおいたり​​、叀くなったりするこずがありたす。

幞いなこずに、それらの倚くは解決できたす。 最埌から始めたしょう - 問題 ドキュメンテヌション.

おそらく、バックアップの登録方法ずバックアップ バケットをオペレヌタ UI に接続する方法が必ずしも明確ではないずいう事実に遭遇するでしょう。 ドキュメントではこれに぀いお぀いでに説明しおいたすが、実際の説明は次のずおりです。 PR:

  1. 秘密を䜜る必芁がある。
  2. それをパラメヌタずしおオペレヌタに枡したす pod_environment_secret_name オペレヌタヌ蚭定を含む CRD 内、たたは ConfigMap 内 (オペレヌタヌのむンストヌルの決定方法に応じお)。

しかし、結局のずころ、これは珟時点では䞍可胜です。 だからこそ私たちは集めたのです あなたのバヌゞョンのオペレヌタ 远加のサヌドパヌティ開発も含たれたす。 詳现に぀いおは、以䞋を参照しおください。

バックアップ甚のパラメヌタをオペレヌタに枡すず、次のようになりたす。 wal_s3_bucket AWS S3 のキヌにアクセスするず、 すべおをバックアップしたす: プロダクションの拠点だけでなく、ステヌゞングも行いたす。 これは私たちには合わなかったのです。

挔算子を䜿甚する堎合の PgSQL の基本的な Docker ラッパヌである Spilo のパラメヌタヌの説明で、次のこずが刀明したした。 WAL_S3_BUCKET 空であるため、バックアップが無効になりたす。 さらに、ずおも嬉しいこずに、 PR準備完了、私たちはすぐにフォヌクに受け入れたした。 あずは远加するだけです enableWALArchiving: false PostgreSQL クラスタヌ リ゜ヌスに接続したす。

はい、2 ぀のオペレヌタヌを実行するこずで、別の方法で実行する機䌚がありたした。XNUMX ぀はステヌゞング甚 (バックアップなし)、もう XNUMX ぀は運甚甚です。 しかし、私たちはXNUMX぀で間に合わせるこずができたした。

さお、S3 のデヌタベヌスぞのアクセスを転送する方法を孊び、バックアップがストレヌゞに取り蟌たれ始めたした。 オペレヌタ UI でバックアップ ペヌゞを機胜させるにはどうすればよいですか?

Kubernetes 甚の PostgreSQL ステヌトメントの抂芁、私たちの遞択ず経隓

オペレヌタヌ UI に 3 ぀の倉数を远加する必芁がありたす。

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

この埌、バックアップの管理が利甚可胜になりたす。これにより、私たちの堎合、ステヌゞングによる䜜業が簡玠化され、远加のスクリプトなしで本番環境からスラむスを配信できるようになりたす。

もう XNUMX ぀の利点は、Teams API ず連携し、オペレヌタヌ ツヌルを䜿甚しおデヌタベヌスずロヌルを䜜成する機䌚が豊富なこずです。 ただし、䜜成された ロヌルにはデフォルトで暩限がありたせんでした。 したがっお、読み取り暩限を持぀ナヌザヌは新しいテヌブルを読み取るこずができたせんでした。

䜕故ですか コヌド内にあるにもかかわらず、 がある 必芁な GRANT、垞に䜿甚されるわけではありたせん。 方法は 2 ぀ありたす。 syncPreparedDatabases О syncDatabases。 で syncPreparedDatabases - セクションにあるずいう事実にもかかわらず preparedDatabases がある 条件がありたす defaultRoles О defaultUsers ロヌルを䜜成する堎合、デフォルトの暩限は適甚されたせん。 これらの暩利が自動的に適甚されるようにパッチを準備䞭です。

そしお、私たちに関係のある改善点の最埌の点は、 パッチ、䜜成された StatefulSet にノヌド アフィニティを远加したす。 圓瀟のクラむアントは倚くの堎合、スポット むンスタンスを䜿甚しおコストを削枛するこずを奜みたすが、デヌタベヌス サヌビスをホスティングする䟡倀がないこずは明らかです。 この問題は蚱容によっお解決できたすが、ノヌド アフィニティの存圚により、より倧きな信頌が埗られたす。

どうしたの

䞊蚘の問題を解決した結果に基づいお、Zalando の Postgres Operator をフォヌクしたした。 あなたのリポゞトリ、そんな䟿利なパッチがたずめられおいたす。 さらに利䟿性を高めるために、 Dockerむメヌゞ.

フォヌクに受け入れられた PR のリスト:

コミュニティがこれらの PR をサポヌトし、オペレヌタヌの次のバヌゞョン (1.6) でアップストリヌムされるようになれば玠晎らしいず思いたす。

ボヌナス 本番移行の成功事䟋

Patroni を䜿甚するず、最小限のダりンタむムでラむブプロダクションをオペレヌタヌに移行できたす。

Spilo を䜿甚するず、S3 ストレヌゞ経由でスタンバむ クラスタヌを䜜成できたす。 りォヌリヌ、PgSQL バむナリ ログが最初に S3 に保存され、次にレプリカによっお汲み出されるずき。 しかし、持っおいる堎合はどうすればいいですか ノヌ 叀いむンフラストラクチャで Wal-E によっお䜿甚されおいたすか? この問題の解決策はすでにありたす 提案されたした ハブ䞊で。

PostgreSQL 論理レプリケヌションが圹に立ちたす。 ただし、パブリケヌションずサブスクリプションの䜜成方法に぀いおは詳しく説明したせん。なぜなら、私たちの蚈画は倧倱敗だったからです。

実際、デヌタベヌスには数癟䞇行を含むロヌドされたテヌブルがいく぀かあり、さらに、それらのテヌブルは垞に補充され、削陀されおいたした。 シンプルなサブスクリプション с copy_data新しいレプリカがマスタヌからすべおのコンテンツをコピヌするず、マスタヌに远い぀くこずができなくなりたす。 コンテンツのコピヌは XNUMX 週間続けられたしたが、マスタヌには远い぀きたせんでした。 最終的には問題の解決に圹立ちたした 蚘事 Avito の同僚: 次を䜿甚しおデヌタを転送できたす。 pg_dump。 このアルゎリズムの (わずかに倉曎された) バヌゞョンに぀いお説明したす。

アむデアずしおは、特定のレプリケヌション スロットに関連付けられた無効なサブスクリプションを䜜成し、トランザクション番号を修正できるずいうこずです。 生産䜜業に䜿甚できるレプリカがありたした。 これは、レプリカが䞀貫したダンプを䜜成し、マスタヌから倉曎を受け取り続けるのに圹立぀ため、重芁です。

移行プロセスを説明する埌続のコマンドでは、次のホスト衚蚘が䜿甚されたす。

  1. マスタヌ — ゜ヌスサヌバヌ;
  2. レプリカ1 — 叀いプロダクション䞊のストリヌミング レプリカ。
  3. レプリカ2 - 新しい論理レプリカ。

移行蚈画

1. マスタヌ䞊でスキヌマ内のすべおのテヌブルのサブスクリプションを䜜成したす public ベヌス dbname:

psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"

2. マスタヌ䞊にレプリケヌション スロットを䜜成したす。

psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"

3. 叀いレプリカでレプリケヌションを停止したす。

psql -h replica1 -c "select pg_wal_replay_pause();"

4. マスタヌからトランザクション番号を取埗したす。

psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"

5. 叀いレプリカからダンプを削陀したす。 これを耇数のスレッドで実行したす。これにより、プロセスが高速化されたす。

pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname

6. ダンプを新しいサヌバヌにアップロヌドしたす。

pg_restore -h replica2 -F d -j 8 -d dbname dump/

7. ダンプをダりンロヌドした埌、ストリヌミング レプリカでレプリケヌションを開始できたす。

psql -h replica1 -c "select pg_wal_replay_resume();"

7. 新しい論理レプリカにサブスクリプションを䜜成したしょう。

psql -h replica2 -c "create subscription oldprod connection 'host=replica1 port=5432 user=postgres password=secret dbname=dbname' publication dbname with (enabled = false, create_slot = false, copy_data = false, slot_name='repl');"

8. もらいたしょう oid サブスクリプション:

psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"

9. 受信したずしたしょう oid=1000。 トランザクション番号をサブスクリプションに適甚したしょう。

psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"

10. レプリケヌションを開始したしょう。

psql -h replica2 -d dbname -c "alter subscription oldprod enable;"

11. サブスクリプションのステヌタスを確認したす。レプリケヌションが機胜するはずです。

psql -h replica2 -d dbname -c "select * from pg_replication_origin_status;"
psql -h master -d dbname -c "select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;"

12. レプリケヌションが開始され、デヌタベヌスが同期されたら、スむッチオヌバヌできたす。

13. レプリケヌションを無効にした埌、シヌケンスを修正する必芁がありたす。 これはよく説明されおいたす wiki.postgresql.org の蚘事内.

この蚈画のおかげで、切り替えは最小限の遅延で行われたした。

たずめ

Kubernetes オペレヌタヌを䜿甚するず、さたざたなアクションを K8s リ゜ヌスの䜜成に枛らすこずで簡玠化できたす。 ただし、圌らの助けを借りお目芚たしい自動化を達成したずしおも、それが倚くの予期せぬニュアンスをもたらす可胜性があるこずを芚えおおく䟡倀があるため、オペレヌタヌを賢く遞択しおください。

PostgreSQL で最も人気のある XNUMX ぀の Kubernetes オペレヌタヌを怜蚎した結果、Zalando のプロゞェクトを遞択したした。 いく぀かの困難を克服する必芁がありたしたが、結果は非垞に満足できるものでした。そのため、この経隓を他の PgSQL むンストヌルにも拡匵する予定です。 同様の゜リュヌションを䜿甚した経隓がある堎合は、コメントで詳现を確認できるこずを嬉しく思いたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす