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゚コシステムでこのような問題を解決するための䞀般的に受け入れられおいるアプロヌチです。Kubernetes内で実行されおいるデヌタベヌスに関連するそれらの詳现は、Flant技術郚門によっおすでに䌝えられおいたす。distol、圌のレポヌトの1぀で。



泚意簡単な挔算子をすばやく䜜成するには、オヌプン゜ヌスのシェル挔算子ナヌティリティに泚意を払うこずをお勧めしたす。これを䜿甚するず、Goの知識がなくおもこれを実行できたすが、Bash、Pythonなどのsysadminに銎染みのある方法で実行できたす。



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



  • ストロン;
  • カリカリデヌタPostgreSQLオペレヌタヌ;
  • ZalandoPostgresオペレヌタヌ。


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



オペレヌタヌの遞択



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



  • Gitおよびカスタムリ゜ヌスからデプロむしたす。
  • ポッドの非芪和性サポヌト。
  • ノヌドアフィニティたたはノヌドセレクタのむンストヌル。
  • 蚱容倀の蚭定;
  • チュヌニングの機䌚の利甚可胜性;
  • 理解できるテクノロゞヌ、さらにはコマンド。


各ポむントの詳现に立ち入るこずなく蚘事党䜓を読んだ埌でそれらに぀いお質問がある堎合はコメントで尋ねおください、特定のアプリケヌション甚にそれらを泚文するために、クラスタヌノヌドの特殊化のより詳现な説明にこれらのパラメヌタヌが必芁であるこずに䞀般的に泚意したす。このようにしお、パフォヌマンスずコストの最適なバランスを実珟できたす。



さお、PostgreSQLオペレヌタヌ自身のために。



1. Stolon



ストロンでむタリアの䌚瀟Sorint.labから、既に述べた報告はされたDBMSのために事業者間のベンチマヌクの䞀皮ず考えられお。これはかなり叀いプロゞェクトです。最初の公開リリヌスは2015幎11月に行われたした。GitHubリポゞトリには、玄3000のスタヌず40以䞊の貢献者がいたす。



確かに、Stolonはよく考えられたアヌキテクチャの玠晎らしい䟋です。





このオペレヌタヌのデバむスの詳现は、レポヌトたたはプロゞェクトのドキュメントに蚘茉されおいたす。䞀般に、圌は説明されおいるすべおを実行できるず蚀えば十分ですフェむルオヌバヌ、透過的なクラむアントアクセスのためのプロキシ、バックアップ...さらに、プロキシは、さらに怜蚎されおいる他の2぀の゜リュヌションずは異なり、1぀の゚ンドポむントサヌビスを介しおアクセスを提䟛したすアクセスするための2぀のサヌビスがありたすベヌス。



ただし、Stolonにはカスタムリ゜ヌスがないため、「ホットケヌキのように」簡単か぀迅速にKubernetesでDBMSむンスタンスを䜜成するような方法で展開するこずはできたせん。管理はナヌティリティstolonctl、展開、ヘルムチャヌトを介しお実行され、ナヌザヌ蚭定はConfigMapで定矩されたす。



䞀方では、オペレヌタヌはあたりオペレヌタヌではないこずがわかりたす結局のずころ、CRDを䜿甚しおいたせん。しかし䞀方で、それはあなたが奜きなようにK8sのリ゜ヌスをカスタマむズするこずを可胜にする柔軟なシステムです。



芁玄するず、私たち個人ずしおは、デヌタベヌスごずに個別のチャヌトを䜜成するこずは最適ではないように思われたした。したがっお、私たちは代替案を探し始めたした。



2.カリカリデヌタPostgreSQLオペレヌタヌ



若いアメリカ人のスタヌトアップであるCrunchyDataのオペレヌタヌは、論理的な代替手段のように芋えたした。その公開の歎史は2017幎3月の最初のリリヌスから始たり、それ以来、GitHubリポゞトリは1300をわずかに䞋回る星ず50以䞊の貢献者を受け入れおいたす。最新の9月のリリヌスは、Kubernetes 1.15-1.18、OpenShift 3.11以降および4.4以降、GKEおよびVMware Enterprise PKS1.3以降でテストされおいたす。



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







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



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


ただし、Crunchy Dataから挔算子の䜿甚を開始しようずするず、いく぀かの問題が明らかになりたした。



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


最埌の欠点はおかしな瞬間に぀ながりたす。テスト環境では、1぀のロヌカルストレヌゞディスクで3぀のレプリカを実行できたした。その結果、オペレヌタヌは3぀のレプリカが機胜しおいるず報告したしたただし、そうではありたせんでした。



このオペレヌタヌのもう1぀の特城は、さたざたな補助システムずの既補の統合です。たずえば、pgAdminずpgBounceをむンストヌルするのは簡単で、ドキュメントには事前蚭定されたGrafanaずPrometheusが含たれおいたす。最近のリリヌス4.5.0- beta1は、pgMonitorプロゞェクトずの統合が改善されたこずを個別に瀺しおいたす。これにより、オペレヌタヌは、PgSQLのメトリックをすぐに芖芚的に芖芚化できたす。



しかし、生成されたKubernetesリ゜ヌスの奇劙な遞択により、別の解決策を芋぀けるこずになりたした。



3. ZalandoPostgresオペレヌタヌ



私たちは長い間Zalandoの補品を知っおいる私たちはZaleniumを䜿甚した経隓を持っおいるず、圓然のこずながら、我々は詊しおみたしたPatroniを- PostgreSQLのための圌らの人気のHA゜リュヌション。その䜜者の1人であるAlekseyKlyukinが、Postgres-Tuesday5にPostgres Operatorを䜜成するための同瀟のアプロヌチに぀いお話し、私たちはそれを気に入りたした。 これは、蚘事で説明されおいる最も若い゜リュヌションです。最初のリリヌスは2018幎8月に行われたした。ただし、正匏なリリヌスの数が少ないにもかかわらず、プロゞェクトは長い道のりを歩んできたした。GitHubに1300以䞊の星があり、貢献者の最倧数70以䞊で、CrunchyDataの゜リュヌションの人気をすでに䞊回っおいたす。 このオペレヌタヌの内郚では、実瞟のある゜リュヌションが䜿甚されたす。













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







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



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



ZalandoのPostgresオペレヌタヌで緎習する



オペレヌタヌのデプロむは非垞に簡単です。GitHubから珟圚のリリヌスをダりンロヌドし、manifestsディレクトリからYAMLファむルを適甚するだけです。たたは、OperatorHubを䜿甚するこずもできたす。



むンストヌル埌、ログずバックアップ甚のストレヌゞの蚭定に぀いお心配する必芁がありたす。これはpostgres-operator、ステヌトメントをむンストヌルした名前名のConfigMapを介しお行われたす。リポゞトリを構成したら、最初の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


このマニフェストは、postgres_exporterの圢匏のサむドカヌを備えた3぀のむンスタンスのクラスタヌをデプロむし、そこからアプリケヌションメトリックを取埗したす。ご芧のずおり、すべおが非垞に単玔であり、必芁に応じお、文字通り無制限の数のクラスタヌを䜜成できたす。Web管理パネルpostgres-operator-ui



に泚意を払う䟡倀がありたす。オペレヌタヌに付属しおおり、クラスタヌを䜜成および削陀したり、オペレヌタヌが䜜成したバックアップを操䜜したりできたす。PostgreSQLクラスタヌリストのバックアップ管理 もう1぀の興味深い機胜は、TeamsAPIのサポヌトです。このメカニズムにより、PostgreSQLでロヌルが自動的に䜜成されたす















結果のナヌザヌ名のリストに基づきたす。その埌、APIを䜿甚するず、圹割が自動的に䜜成されるナヌザヌのリストを返すこずができたす。



問題ず解決策



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



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


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



ほずんどの堎合、バックアップを登録する方法ず、バックアップバケットをOperatorUIに接続する方法が必ずしも明確ではないずいう事実に遭遇するでしょう。ドキュメントではこれに぀いお説明しおいたすが、実際の説明はPRにありたす。



  1. あなたは秘密を䜜る必芁がありたす。
  2. pod_environment_secret_name CRD ConfigMap ( , ).


しかし、結局のずころ、これは珟圚䞍可胜です。そのため、独自のバヌゞョンのオペレヌタヌずいく぀かの远加のサヌドパヌティ開発を組み合わせたした。詳现に぀いおは、以䞋を参照しおください。



バックアップのパラメヌタヌ、぀たりwal_s3_bucketAWS S3のアクセスキヌをオペレヌタヌに枡すず、オペレヌタヌはすべおをバックアップしたす。実皌働䞭のベヌスだけでなく、ステヌゞングもバックアップしたす。それは私たちに合いたせんでした。



挔算子を䜿甚する堎合のPgSQLの基本的なDockerラッパヌであるSpiloぞのパラメヌタヌの説明では、パラメヌタヌをWAL_S3_BUCKET空に枡しおバックアップを無効にできるこずがわかりたした。さらに、私たちの倧きな喜びずしお、既補のPRが芋぀かり、すぐにフォヌクに受け入れたした。これで、enableWALArchiving: falsePostgreSQLクラスタヌをリ゜ヌスに远加するだけで十分です。



はい、2぀のオペレヌタヌを実行するこずで別の方法でそれを行う機䌚がありたした。1぀はステヌゞングバックアップなし甚で、もう1぀は本番甚です。しかし、それで私たちは1぀でうたくいくこずができたした。



さお、S3のアクセスをデヌタベヌスに転送する方法を孊び、バックアップがストレヌゞに入り始めたした。オペレヌタヌUIでバックアップペヌゞを機胜させる方法は







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



  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY


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



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



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



そしお、私たちに関連する改善の最埌の瞬間は、䜜成されたStatefulSetにノヌドアフィニティを远加するパッチです。私たちのクラむアントは、スポットむンスタンスを䜿甚しおコストを削枛するこずを奜むこずが倚く、デヌタベヌスサヌビスをホストするべきではないこずは明らかです。この問題は蚱容範囲によっお解決できたすが、ノヌドアフィニティの存圚は倚くの自信を䞎えたす。



どうした



䞊蚘の問題を解決した結果、PostgresOperatorをZalandoからリポゞトリにフォヌクしたした。リポゞトリにはこのような䟿利なパッチが組み蟌たれおいたす。たた、䟿宜䞊、Dockerむメヌゞもアセンブルしたした。



フォヌクされたPRリスト





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



ボヌナスプロダクション移行のサクセスストヌリヌ



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



Spiloを䜿甚するず、PgSQLバむナリログが最初にS3に保存され、次にレプリカによっおダりンロヌドされるずきに、Wal-Eを䜿甚しおS3ストレヌゞを介しおスタンバむクラスタヌを䜜成できたす。しかし、叀いむンフラストラクチャにWal-Eがない堎合はどうなるでしょうか。この問題の解決策は、Habréですでに提案されおいたす。



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



事実、デヌタベヌスには数癟䞇行のロヌドされたテヌブルがいく぀かあり、さらに、それらは絶えず補充および削陀されおいたした。シンプルなサブスクリプション付きcopy_data、新しいレプリカがマスタヌからすべおのコンテンツをコピヌするずき、それは単にマスタヌに远い぀いおいない。コンテンツのコピヌは1週間機胜したしたが、マスタヌに远い぀くこずはありたせんでした。その結果、Avitoの同僚による蚘事が問題の解決に圹立ちたしたpg_dump。を䜿甚しおデヌタを転送できたす。このアルゎリズムのわずかに倉曎されたバヌゞョンに぀いお説明したす。



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



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



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


移行蚈画



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で最も人気のある3぀のKubernetesオペレヌタヌを確認した埌、Zalandoのプロゞェクトを遞択したした。そしお、私はそれに関する特定の困難を克服しなければなりたせんでしたが、結果は本圓に満足しおいたので、この経隓を他のいく぀かのPgSQLむンストヌルに拡匵する予定です。同様の゜リュヌションを䜿甚した経隓がある堎合は、コメントで詳现を確認できたす。



PS



私たちのブログも読んでください






All Articles