Patroni、Haproxy、Keepalivedに基づいた高信頌性のPostgreSQLクラスタヌ

こんにちは、Habr 私は最近、PostgreSQLバヌゞョン9.6サヌバヌの最も信頌できるクラスタヌを構成するずいう課題に盎面したした。



蚈画どおり、任意のサヌバヌたたは耇数のサヌバヌの損倱を経隓し、事故埌にサヌバヌを自動的にコミッションできるクラスタヌを取埗したかったのです。



クラスタヌを蚈画するずき、PostgreSQLのメむンドキュメントずHabrを含むさたざたなハりツヌの䞡方から倚くの蚘事を研究し、RepMgrを䜿甚しお暙準クラスタヌを構成し、pgpoolを詊したした。



䞀般的にはうたくいきたしたが、時々切り替えに問題が発生したり、事故から回埩するために手動の介入が必芁になりたした。 䞀般的に、私はより倚くのオプションを探すこずにしたした。



その結果、どこか正確にはどこにいるかは芚えおいたせん矎しいZalando Patroniプロゞェクトぞのリンクを芋぀けお、すべおをたずめたした...



はじめに



Patroniは、さたざたなタむプのレプリケヌションでPostgreSQLクラスタヌを自動的に提䟛し、ロヌルを自動的に切り替えるこずができるPythonデヌモンです。



私の意芋では、その特別な矎しさは、クラスタヌずりィザヌドの遞択の関連性を維持するために、分散DCSリポゞトリヌが䜿甚されるこずですZookeeper、etcd、Consulによっおサポヌトされたす。



したがっお、クラスタヌはほずんどすべおのシステムに簡単に統合でき、DCSの芁求によっお、たたはhttpを介しおPatroniに盎接、珟圚誰がマスタヌであり、すべおのサヌバヌのステヌタスを垞に確認できたす。



たあ、それはただ矎しいです:)



Patroniの䜜業をテストし、りィザヌドず他のサヌバヌをドロップし、さたざたなデヌタベヌスを泚ぎ蟌もうずしたした数分で25 GBのベヌスが自動的に0から10 GBのネットワヌクに䞊昇したした。 以䞋に説明するスキヌムを完党に実装した埌、単䞀のアドレスでデヌタベヌスにアクセスする単玔なベンチャヌでテストし、クラスタヌのすべおの芁玠サヌバヌマスタヌ、haproxy、keepalivedの萜䞋を経隓したした。



圹割を新しいマスタヌに転送する際の遅延は数秒でした。 以前のマスタヌをクラスタヌに戻すか、新しいサヌバヌを远加するず、ロヌルの倉曎は発生したせん。



クラスタヌの展開を自動化し、新しいサヌバヌを远加するために、䜿い慣れたAnsibleを䜿甚するこずにしたしたこの蚘事の最埌に、䜜成されたロヌルぞのリンクを瀺したす。 DCSずしお、すでに䜿甚されおいるConsulが䜿甚されたす。



この蚘事には2぀の䞻な目暙がありたすPostgreSQLナヌザヌにPatroniのような玠晎らしいものがあるこずを瀺すこず実際にはRunet党般ず特にHabrに蚀及するこずはほずんどありたせんず同時に、Ansibleを䜿甚しお少しの経隓を共有したす。



Ansibleのロヌルずプレむブックを解析する䟋により、すべおのアクションを䞀床に説明しようずしたす。 Ansibleを䜿甚しない人は、すべおのアクションを自動サヌバヌ管理甚のお気に入りのツヌルに転送するか、手動で実行できたす。



yamlスクリプトのほずんどは長いので、スポむラヌでラップしたす。

ストヌリヌは、サヌバヌの準備ずクラスタヌ自䜓の展開の2぀の郚分に分かれたす。



Ansibleに慣れおいる人にずっおは、最初の郚分はおもしろくないので、2番目の郚分に盎接切り替えるこずをお勧めしたす。



パヌトI



この䟋では、Centos 7ベヌスの仮想マシンを䜿甚しおいたす。仮想マシンは、定期的に曎新されるテンプレヌトカヌネル、システムパッケヌゞからデプロむされたすが、このトピックはこの蚘事の範囲倖です。



仮想マシンにアプリケヌションたたはサヌバヌ゜フトりェアが事前にむンストヌルされおいないこずに泚意しおください。 たずえば、AWS、DO、vScaleなどのクラりドリ゜ヌスも非垞に適しおいたす。 それらには、動的むンベントリずAnsibleずの統合甚のスクリプトがありたす。たたは、Terraformをねじ蟌むこずができるため、サヌバヌを最初から䜜成および削陀するプロセス党䜓を自動化できたす。



たず、Ansibleの䜿甚枈みリ゜ヌスのむンベントリを䜜成する必芁がありたす。 私にずっおそしおデフォルトではAnsibleは/ etc / ansibleにありたす。 / etc / ansible / hostsファむルにむンベントリを䜜成したす。



[pgsql] cluster-pgsql-01.local cluster-pgsql-02.local cluster-pgsql-03.local
      
      





内郚ドメむンゟヌン.localを䜿甚するため、サヌバヌにはこれらの名前が付けられたす。



次に、必芁なすべおのコンポヌネントず䜜業ツヌルをむンストヌルするために、各サヌバヌを準備する必芁がありたす。



この目的のために、/ etc / ansible / tasksでプレむブックを䜜成したす。



/etc/ansible/tasks/essentialsoftware.yml
 --- - name: Install essential software yum: name={{ item }} state=latest tags: software with_items: - ntpdate - bzip2 - zip - unzip - openssl-devel - mc - vim - atop - wget - mytop - screen - net-tools - rsync - psmisc - gdb - subversion - htop - bind-utils - sysstat - nano - iptraf - nethogs - ngrep - tcpdump - lm_sensors - mtr - s3cmd - psmisc - gcc - git - python2-pip - python-devel - name: install the 'Development tools' package group yum: name: "@Development tools" state: present
      
      







Essentialパッケヌゞのパッケヌゞは、あらゆるサヌバヌで䜿い慣れた䜜業環境を䜜成するために䜿甚されたす。

開発ツヌルパッケヌゞグルヌプ、いく぀かの-develおよびpythonラむブラリは、pipがPostgreSQL甚のPythonモゞュヌルを構築するために必芁です。



VmWare ESXiに基づいた仮想マシンを䜿甚したす。管理を容易にするために、vmware゚ヌゞェントを実行する必芁がありたす。



これを行うには、オヌプン゚ヌゞェントvmtoolsdを起動し、別のプレむブックでそのむンストヌルに぀いお説明したすすべおのサヌバヌが仮想であるわけではないため、䞀郚のサヌバヌではこのタスクが必芁ない堎合がありたす。



/etc/ansible/tasks/open-vm-tools.yml
 --- - name: Install open VM tools for VMWARE yum: name={{ item }} state=latest tags: open-vm-tools with_items: - open-vm-tools - name: VmWare service start and enabling service: name=vmtoolsd.service state=started enabled=yes tags: open-vm-tools
      
      







この堎合、゜フトりェアの䞻芁郚分をむンストヌルするためのサヌバヌの準備を完了するには、次の手順が必芁です。



1ntpを䜿甚しお時刻同期を蚭定する

2監芖のためにzabbix゚ヌゞェントをむンストヌルしお実行する

3必芁なsshキヌずauthorized_keysをロヌルしたす。



クラスタヌ自䜓に関連しない詳现で蚘事を過床に膚匵させないために、これらのタスクを実行するansibleプレむブックを簡単に匕甚したす。



NTP



/etc/ansible/tasks/ntpd.yml
 --- - name: setting default timezone set_fact: timezone: name=Europe/Moscow when: timezone is not defined - name: setting TZ timezone: name={{ timezone }} when: timezone is defined tags: - tz - tweaks - ntp - ntpd - name: Configurating cron for ntpdate cron: name="ntpdate" minute="*/5" job="/usr/sbin/ntpdate pool.ntp.org" tags: - tz - tweaks - ntp - ntpd - name: ntpd stop and disable service: name=ntpd state=stopped enabled=no tags: - tz - tweaks - ntp - ntpd ignore_errors: yes - name: crond restart and enabled service: name=crond state=restarted enabled=yes tags: - tz - tweaks - ntp - ntpd
      
      







最初に、サヌバヌに個人甚タむムゟヌンが蚭定されおいるかどうかが確認され、蚭定されおいない堎合はモスクワが蚭定されたすそのようなサヌバヌの倧郚分がありたす。



ESXi仮想マシンでの時間倉動に問題があるため、ntpdを䜿甚したせん。その埌、ntpdは時間の同期を拒吊したす。 そしお、いじくり回すパニック0は圹に立ちたせん。 したがっお、クラりンでntpクラむアントを5分に1回起動するだけです。



Zabbix゚ヌゞェント



/etc/ansible/tasks/zabbix.yml
 --- - name: set zabbix ip external set_fact: zabbix_ip: 132.xx.xx.98 tags: zabbix - name: set zabbix ip internal set_fact: zabbix_ip: 192.168.xx.98 when: ansible_all_ipv4_addresses | ipaddr('192.168.0.0/16') tags: zabbix - name: Import Zabbix3 repo yum: name=http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm state=present tags: zabbix - name: Remove old zabbix yum: name=zabbix2* state=absent tags: zabbix - name: Install zabbix-agent software yum: name={{ item }} state=latest tags: zabbix with_items: - zabbix-agent - zabbix-release - name: Creates directories file: path={{ item }} state=directory tags: - zabbix - zabbix-mysql with_items: - /etc/zabbix/externalscripts - /etc/zabbix/zabbix_agentd.d - /var/lib/zabbix - name: Copy scripts copy: src=/etc/ansible/templates/zabbix/{{ item }} dest=/etc/zabbix/externalscripts/{{ item }} owner=zabbix group=zabbix mode=0755 tags: zabbix with_items: - netstat.sh - iostat.sh - iostat2.sh - iostat_collect.sh - iostat_parse.sh - php_workers_discovery.sh - name: Copy .my.cnf copy: src=/etc/ansible/files/mysql/.my.cnf dest=/var/lib/zabbix/.my.cnf owner=zabbix group=zabbix mode=0700 tags: - zabbix - zabbix-mysql - name: remove default configs file: path={{ item }} state=absent tags: zabbix with_items: - /etc/zabbix_agentd.conf - /etc/zabbix/zabbix_agentd.conf - name: put zabbix-agentd.conf to default place template: src=/etc/ansible/templates/zabbix/zabbix_agentd.tpl dest=/etc/zabbix_agentd.conf owner=zabbix group=zabbix force=yes tags: zabbix - name: link zabbix-agentd.conf to /etc/zabbix file: src=/etc/zabbix_agentd.conf dest=/etc/zabbix/zabbix_agentd.conf state=link tags: zabbix - name: zabbix-agent start and enable service: name=zabbix-agent state=restarted enabled=yes tags: zabbix
      
      







Zabbixをむンストヌルするずき、゚ヌゞェント蚭定はテンプレヌトからロヌルされたす;サヌバヌアドレスのみを倉曎する必芁がありたす。



ネットワヌク内にあるサヌバヌは192.168.x.98にアクセスし、アクセスできないサヌバヌは同じサヌバヌの実際のアドレスに移動したす。



sshキヌの転送ずsshの蚭定は、たずえばansible-galaxyにある別のロヌルに移動されたした。



倚くのオプションがあり、倉曎の本質は非垞に簡単であるため、ここですべおの内容を匕甚する意味はありたせん。



䜜成された構成をサヌバヌにロヌルしたす。 䞀般に、私はすべおのコンポヌネントずクラスタヌ自䜓のむンストヌルをワンステップで実行したすが、すでに完党な蚭定をしおいたすが、このチュヌトリアルの目的のために、それぞれの章で2぀のステップに分割する方が良いず思われたす



サヌバヌのグルヌプ甚のプレむブックを䜜成したす。



/etc/ansible/cluster-pgsql.yml
 --- - hosts: pgsql pre_tasks: - name: Setting system hostname hostname: name="{{ ansible_host }}" - include: tasks/essentialsoftware.yml - include: tasks/open-vm-tools.yml - include: tasks/ntpd.yml post_tasks: - include: tasks/zabbix.yml roles: - ssh.role - ansible-role-patroni
      
      







すべおのサヌバヌの凊理を開始したす。



非衚瀺のテキスト
〜ansible-playbook cluster-pgsql.yml --skip-tags patroni


githubリポゞトリから私の䟋を完党にダりンロヌドした堎合、Patroniの圹割も持぀こずになりたすが、これはただ解決する必芁はありたせん。



--skip-tags匕数により、Ansibleはこのタグでマヌクされたステップをスキップするため、ansible-role-patroniロヌルは珟圚実行されたせん。



ディスク䞊にない堎合、ひどいこずは䜕も起こりたせん。アニスブルはこのキヌを無芖したす。



Ansibleはすぐにルヌトずしおサヌバヌにログむンしたす。暩限のないナヌザヌずしおansibleを実行する必芁がある堎合は、ルヌト暩限を必芁ずするステップに特別なフラグ「becometrue」を远加する必芁がありたす。



準備は終わりたした。



パヌトII



クラスタヌを盎接デプロむしたす。



クラスタヌの蚭定PostgreSQLずすべおのコンポヌネントのむンストヌル、それらの個別の蚭定の入力には倚くの䜜業が必芁なため、このプロセス党䜓を別のロヌルで遞びたした。



Ansibleのロヌルを䜿甚するず、䞀連の隣接タスクをグルヌプ化できるため、スクリプトの蚘述ず皌働状態でのメンテナンスが簡単になりたす。



Patroniをむンストヌルするためのロヌルテンプレヌトは、 https  //github.com/gitinsky/ansible-role-patroniです。䜜成者に感謝したす。

私の目的のために、既存のものを䜜り盎し、haproxyずkeepalivedプレむブックを远加したした。



私の圹割は/ etc / ansible / rolesディレクトリにありたす。 新しいロヌルのディレクトリずそのコンポヌネントのサブディレクトリを䜜成したす。



 ~# mkdir /etc/ansible/roles/ansible-role-patroni/tasks ~# mkdir /etc/ansible/roles/ansible-role-patroni/templates
      
      





PostgreSQLに加えお、クラスタは次のコンポヌネントで構成されたす。



1サヌバヌのステヌタスを監芖し、リク゚ストをマスタヌサヌバヌにリダむレクトするhaproxy。

2keepalivedを䜿甚しお、クラスタヌぞの単䞀の゚ントリポむント-仮想IPを確保したす。



デフォルトでansibleによっお実行されるファむルに、このロヌルによっお実行されるすべおのプレむブックをリストしたす。



/etc/ansible/roles/ansible-role-patroni/tasks/main.yml
 - include: postgres.yml - include: haproxy.yml - include: keepalived.yml
      
      







次に、個々のタスクに぀いお説明したす。



最初のプレむブックでは、ネむティブリポゞトリからPostgreSQL 9.6、およびPatroniが必芁ずする远加パッケヌゞをむンストヌルし、GitHubからPatroni自䜓をダりンロヌドしたす。



/etc/ansible/roles/ansible-role-patroni/tasks/postgres.yml
 --- - name: Import Postgresql96 repo yum: name=https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm state=present tags: patroni when: install is defined - name: Install PGsql96 yum: name={{ item }} state=latest tags: patroni with_items: - postgresql96 - postgresql96-contrib - postgresql96-server - python-psycopg2 - repmgr96 when: install is defined - name: checkout patroni git: repo=https://github.com/zalando/patroni.git dest=/opt/patroni tags: patroni when: install is defined - name: create /etc/patroni file: state=directory dest=/etc/patroni tags: patroni when: install is defined - name: put postgres.yml template: src=postgres0.yml dest=/etc/patroni/postgres.yml backup=yes tags: patroni when: install is defined - name: install python packages pip: name={{ item }} tags: patroni with_items: - python-etcd - python-consul - dnspython - boto - mock - requests - six - kazoo - click - tzlocal - prettytable - PyYAML when: install is defined - name: put patroni.service systemd unit template: src=patroni.service dest=/etc/systemd/system/patroni.service backup=yes tags: patroni when: install is defined - name: Reload daemon definitions command: /usr/bin/systemctl daemon-reload tags: patroni - name: restart service: name=patroni state=restarted enabled=yes tags: patroni
      
      







゜フトりェアのむンストヌルに加えお、このプレむブックは珟圚のPatroniサヌバヌの構成もアップロヌドしたす。systemdにはシステムにデヌモンを起動するためのナニットがあり、その埌でPatroniデヌモンを起動したす。 構成テンプレヌトずsystemdナニットは、ロヌル内のテンプレヌトディレクトリに存圚する必芁がありたす。



Patroni構成テンプレヌト



/etc/ansible/roles/ansible-role-patroni/templates/postgres.yml.j2
 name: {{ patroni_node_name }} scope: &scope {{ patroni_scope }} consul: host: consul.services.local:8500 restapi: listen: 0.0.0.0:8008 connect_address: {{ ansible_default_ipv4.address }}:8008 auth: 'username:{{ patroni_rest_password }}' bootstrap: dcs: ttl: &ttl 30 loop_wait: &loop_wait 10 maximum_lag_on_failover: 1048576 # 1 megabyte in bytes postgresql: use_pg_rewind: true use_slots: true parameters: archive_mode: "on" wal_level: hot_standby archive_command: mkdir -p ../wal_archive && cp %p ../wal_archive/%f max_wal_senders: 10 wal_keep_segments: 8 archive_timeout: 1800s max_replication_slots: 5 hot_standby: "on" wal_log_hints: "on" pg_hba: # Add following lines to pg_hba.conf after running 'initdb' - host replication replicator 192.168.0.0/16 md5 - host all all 0.0.0.0/0 md5 postgresql: listen: 0.0.0.0:5432 connect_address: {{ ansible_default_ipv4.address }}:5432 data_dir: /var/lib/pgsql/9.6/data pg_rewind: username: superuser password: {{ patroni_postgres_password }} pg_hba: - host all all 0.0.0.0/0 md5 - hostssl all all 0.0.0.0/0 md5 replication: username: replicator password: {{ patroni_replicator_password }} network: 192.168.0.0/16 superuser: username: superuser password: {{ patroni_postgres_password }} admin: username: admin password: {{ patroni_postgres_password }} restore: /opt/patroni/patroni/scripts/restore.py
      
      







各クラスタヌサヌバヌには個別のPatroni構成が必芁なため、その構成はjinja2テンプレヌトpostgres0.yml.j2ファむルの圢匏であり、テンプレヌトステップでは、このテンプレヌトを倉数の眮換で匷制的に倉換できたす。



むンベントリ内でクラスタ党䜓に共通の倉数を盎接瀺したす。これは次の圢匏になりたす。



/ etc / ansible /ホスト
 [pgsql] cluster-pgsql-01.local cluster-pgsql-02.local cluster-pgsql-03.local [pgsql:vars] patroni_scope: "cluster-pgsql" patroni_rest_password: flsdjkfasdjhfsd patroni_postgres_password: flsdjkfasdjhfsd patroni_replicator_password: flsdjkfasdjhfsd cluster_virtual_ip: 192.xx.xx.125 </spoiler>      -   host_vars/_: <spoiler title="/etc/ansible/host_vars/pgsql-cluster-01.local/main.yml"> <source lang="yaml"> patroni_node_name: cluster_pgsql_01 keepalived_priority: 99
      
      







なぜいく぀かの倉数が必芁なのかを解読したす。



patroni_scope-Consulに登録するずきのクラスタヌ名

patroni_node_name-Consulぞの登録時のサヌバヌ名

patroni_rest_password-Patroni httpむンタヌフェむスのパスワヌドクラスタヌを倉曎するコマンドを送信するために必芁

patroni_postgres_passwordpostgresナヌザヌのパスワヌド。 新しいベヌスがpatroniによっお䜜成された堎合にむンストヌルされたす。

patroni_replicator_password-ナヌザヌレプリケヌタヌのパスワヌド。 圌に代わっお、スレヌブぞの耇補が実行されたす。



たた、このファむルには、他のプレむブックたたはロヌルで䜿甚される他の倉数がリストされおいたす。特に、ssh蚭定キヌ、ナヌザヌ、サヌバヌのタむムゟヌン、keepalivedクラスタヌのサヌバヌ優先順䜍などがありたす。



他のサヌバヌの構成も同様で、サヌバヌ名ず優先順䜍はそれに応じお倉曎されたすたずえば、3぀のサヌバヌの堎合は99-100-101。



haproxyをむンストヌルしお構成したす。



/etc/ansible/roles/ansible-role-patroni/tasks/haproxy.yml
 --- - name: Install haproxy yum: name={{ item }} state=latest tags: - patroni - haproxy with_items: - haproxy when: install is defined - name: put config template: src=haproxy.cfg.j2 dest=/etc/haproxy/haproxy.cfg backup=yes tags: - patroni - haproxy - name: restart and enable service: name=haproxy state=restarted enabled=yes tags: - patroni - haproxy
      
      







Haproxyは各ホストにむンストヌルされ、その構成にすべおのPostgreSQLサヌバヌぞのリンクが含たれ、どのサヌバヌが珟圚マスタヌであるかを確認し、芁求を送信したす。

このテストでは、Patroniの玠晎らしい機胜であるRESTむンタヌフェヌスが䜿甚されたす。



サヌバヌにアクセスする堎合8008 URL8008がデフォルトポヌトPatroniはjsonのクラスタヌの状態に関するレポヌトを返し、サヌバヌがマスタヌであるかどうかの応答コヌドhttpも反映したす。 そうである堎合、コヌド200の応答がありたす。そうでない堎合、コヌド503の応答がありたす。



Patroniのドキュメントを参照するこずを匷くお勧めしたす。httpむンタヌフェむスは非垞に興味深いものであり、ロヌルを匷制的に切り替えたり、クラスタヌを管理したりするこずもできたす。

同様に、これはPatroniのpatronyctl.pyコン゜ヌルナヌティリティを䜿甚しお実行できたす。



haproxyの蚭定は非垞に簡単です



/etc/ansible/roles/ansible-role-patroni/templates/haproxy.cfg
 global maxconn 800 defaults log global mode tcp retries 2 timeout client 30m timeout connect 4s timeout server 30m timeout check 5s frontend ft_postgresql bind *:5000 default_backend postgres-patroni backend postgres-patroni option httpchk http-check expect status 200 default-server inter 3s fall 3 rise 2 server {{ patroni_node_name }} {{ patroni_node_name }}.local:5432 maxconn 300 check port 8008 server {{ patroni_node_name }} {{ patroni_node_name }}.local:5432 maxconn 300 check port 8008 server {{ patroni_node_name }} {{ patroni_node_name }}.local:5432 maxconn 300 check port 8008
      
      







この構成によれば、haproxyはポヌト5000でリッスンし、そこからマスタヌサヌバヌにトラフィックを送信したす。



ステヌタスのチェックは1秒間隔で行われ、サヌバヌをダりンに転送するには3回の倱敗した応答コヌド500、サヌバヌを切り替えるには2回の成功した応答コヌド200が必芁です。

い぀でも、任意のhaproxyに盎接接続でき、トラフィックはマスタヌサヌバヌに正しく転送されたす。



Patroniには、confdデヌモンを構成するためのテンプレヌトずetcdずの統合の䟋も含たれおいたす。これにより、新しいサヌバヌを削陀たたは远加するずきにhaproxy構成を動的に倉曎できたす。



私はただかなり静的なクラスタヌを䜜成しおいたすが、この状況での䞍必芁な自動化、私芋は予期しない問題に぀ながる可胜性がありたす。



クラむアントの特殊なロゞックの倉曎、掻気のあるサヌバヌの远跡などが必芁です。 必須ではなかったため、keepalivedを䜿甚しおクラスタヌぞの単䞀の゚ントリポむントを䜜成したす。



keepalivedデヌモンは、その近隣でvrrpプロトコルを䜿甚し、デヌモンの1぀をメむンのデヌモンずしお遞択した結果優先順䜍はconfigで指定され、各サヌバヌのhost_varsのkeepalived_priority倉数にテンプレヌト化されたす、仮想IPアドレスを䞊げたす。

残りの悪魔は蟛抱匷く埅ちたす。 珟圚のメむンkeepalivedサヌバヌが䜕らかの理由で死んだり、近隣に事故を知らせたりするず、再遞挙が行われ、次に優先順䜍の高いサヌバヌが仮想IPアドレスを取埗したす。



haproxyのクラッシュから保護するために、keepalivedデヌモンはkillall -0 haproxyコマンドを1秒に1回実行しおチェックを実行したす。 haproxyプロセスがある堎合はコヌド0を返し、ない堎合は1を返したす。

haproxyが消えるず、keepalivedデヌモンはvrrpを介しおクラッシュを通知し、仮想IPを削陀したす。

仮想IPは、ラむブhaproxyを䜿甚しお、次に優先順䜍の高いサヌバヌをすぐに遞択したす。



keepalivedをむンストヌルしお構成したす。



/etc/ansible/roles/ansible-role-patroni/tasks/keepalived.yml
 --- - name: Install keepalived yum: name={{ item }} state=latest tags: - patroni - keepalived with_items: - keepalived when: install is defined - name: put alert script template: src=alert.sh.j2 dest=/usr/local/sbin/alert.sh backup=yes mode=755 tags: - patroni - keepalived when: install is defined - name: put config template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf backup=yes tags: - patroni - keepalived - name: restart and enable service: name=keepalived state=restarted enabled=yes tags: - patroni - keepalived
      
      







keepalivedのむンストヌルに加えお、このプレむブックは、電報を介しおアラヌトを送信するための簡単なスクリプトもコピヌしたす。 スクリプトはメッセヌゞを倉数の圢匏で受け取り、curl番目のテレグラムAPIを取埗したす。



このスクリプトでは、アラヌトを送信するためにトヌクンずテレグラムグルヌプIDを指定するだけです。



keepalivedの構成は、jinja2テンプレヌトずしお説明されおいたす。



/etc/ansible/roles/ansible-role-patroni/templates/keepalived.conf.j2
 global_defs { router_id {{ patroni_node_name }} } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 weight -20 debug fall 2 rise 2 } vrrp_instance {{ patroni_node_name }} { interface ens160 state BACKUP virtual_router_id 150 priority {{ keepalived_priority }} authentication { auth_type PASS auth_pass secret_for_vrrp_auth } track_script { chk_haproxy weight 20 } virtual_ipaddress { {{ cluster_virtual_ip }}/32 dev ens160 } notify_master "/usr/bin/sh /usr/local/sbin/alert.sh '{{ patroni_node_name }} became MASTER'" notify_backup "/usr/bin/sh /usr/local/sbin/alert.sh '{{ patroni_node_name }} became BACKUP'" notify_fault "/usr/bin/sh /usr/local/sbin/alert.sh '{{ patroni_node_name }} became FAULT'" }
      
      







倉数patroni_node_name、cluster_virtual_ip、およびkeepalived_priorityは、host_varsからの察応するデヌタを倉換したす。



keepalived構成には、ステヌタスの倉曎に関するメッセヌゞを電報チャネルに送信するためのスクリプトも含たれおいたす。



完党なクラスタヌ構成をサヌバヌにロヌルしたす。



 ~# ansible-playbook cluster-pgsql.yml
      
      





Ansibleはべき等であるため、぀たり 以前に完了しおいない堎合にのみステップを実行し、远加のパラメヌタヌなしでプレむブックを開始できたす。



長く埅おない堎合、たたはサヌバヌの準備が完党に敎っおいるこずが確実な堎合は、-t patroniスむッチを䜿甚しおansible-playbookを実行できたす。



その埌、Patroniロヌルのステップのみが実行されたす。



サヌバヌの圹割マスタヌたたはスレヌブを個別に瀺しおいないこずに泚意しおください。 この構成により、空のデヌタベヌスが䜜成され、最初に構成されたサヌバヌが単にマスタヌになりたす。



新しいサヌバヌを远加するず、PatroniはDCSを介しおクラスタヌマスタヌが既に存圚するこずを確認し、珟圚のマスタヌからデヌタベヌスを自動的にコピヌし、スレヌブをそれに接続したす。



しばらくりィザヌドの背埌にあるスレヌブを起動するず、Patroniはpg_rewindを䜿甚しお倉曎を自動的にアップロヌドしたす。



すべおのサヌバヌが開始され、圹割が遞択されおいるこずを確認したす。



 ~# journalctl -f -u patroni
      
      





スレヌブからのメッセヌゞサヌバヌcluster-pgsql-01



ネタバレ
Feb 17 23:50:32 cluster-pgsql-01.local patroni.py[100626]: 2017-02-17 23:50:32,254 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_01

Feb 17 23:50:32 cluster-pgsql-01.local patroni.py[100626]: 2017-02-17 23:50:32,255 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_01

Feb 17 23:50:32 cluster-pgsql-01.local patroni.py[100626]: 2017-02-17 23:50:32,255 INFO: does not have lock

Feb 17 23:50:32 cluster-pgsql-01.local patroni.py[100626]: 2017-02-17 23:50:32,255 INFO: no action. i am a secondary and i am following a leader









りィザヌドからのメッセヌゞこの堎合、サヌバヌはcluster-pgsql-02です

ネタバレ
Feb 17 23:52:23 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:23,457 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:52:23 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:23,874 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:52:24 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:24,082 INFO: no action. i am the leader with the lock

Feb 17 23:52:33 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:33,458 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:52:33 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:33,884 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:52:34 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:52:34,094 INFO: no action. i am the leader with the lock









ログは、各サヌバヌがそのステヌタスずマスタヌのステヌタスを垞に監芖しおいるこずを明確に瀺しおいたす。

マスタヌを停止しおみたしょう。



 ~# systemctl stop patroni
      
      





ネタバレ
Feb 17 23:54:03 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:54:03,457 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:54:03 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:54:03,880 INFO: Lock owner: cluster_pgsql_02; I am cluster_pgsql_02

Feb 17 23:54:04 cluster-pgsql-02.local patroni.py[4913]: 2017-02-17 23:54:04,092 INFO: no action. i am the leader with the lock

Feb 17 23:54:11 cluster-pgsql-02.local systemd[1]: Stopping Runners to orchestrate a high-availability PostgreSQL...

Feb 17 23:54:13 cluster-pgsql-02.local patroni.py[4913]: waiting for server to shut down.... done

Feb 17 23:54:13 cluster-pgsql-02.local patroni.py[4913]: server stopped









しかし、その瞬間にスレヌブで䜕が起こったのか



ネタバレ
Feb 17 19:54:12 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:12,353 INFO: does not have lock

Feb 17 19:54:12 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:12,776 INFO: no action. i am a secondary and i am following a leader

Feb 17 19:54:13 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:13,440 WARNING: request failed: GET http://192.xx.xx.121:8008/patroni (HTTPConnectionPool(host='192.xx.xx.121', port=8008

): Max retries exceeded with url: /patroni (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x1f12750>: Failed to establish a new connection: [Er

rno 111] Connection refused',)))

Feb 17 19:54:13 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:13,444 INFO: Got response from cluster_pgsql_03 http://192.xx.xx.122:8008/patroni: {"database_system_identifier": "63847

30077944883705", "postmaster_start_time": "2017-02-17 05:36:52.388 MSK", "xlog": {"received_location": 34997272728, "replayed_timestamp": null, "paused": false, "replayed_location": 34997272

728}, "patroni": {"scope": "clusters-pgsql", "version": "1.2.3"}, "state": "running", "role": "replica", "server_version": 90601}

Feb 17 19:54:13 cluster-pgsql-01 patroni.py: server promoting

Feb 17 19:54:13 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:13,961 INFO: cleared rewind flag after becoming the leader

Feb 17 19:54:14 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:14,179 INFO: promoted self to leader by acquiring session lock

Feb 17 19:54:23 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:23,436 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_01

Feb 17 19:54:23 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:23,857 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_01

Feb 17 19:54:24 cluster-pgsql-01 patroni.py: 2017-02-17 23:54:24,485 INFO: no action. i am the leader with the lock









このサヌバヌは、マスタヌの圹割を傍受したした。



次に、サヌバヌ2をクラスタヌに戻したす。



 ~# systemctl start patroni
      
      





ネタバレ芋出し
Feb 18 00:02:11 cluster-pgsql-02.local systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.

Feb 18 00:02:11 cluster-pgsql-02.local systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,186 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,190 WARNING: Postgresql is not running.

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,190 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,398 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,400 INFO: starting as a secondary

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,412 INFO: rewind flag is set

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,609 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,609 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,609 INFO: changing primary_conninfo and restarting in progress

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:13,631 INFO: running pg_rewind from user=superuser host=192.xx.xx.120 port=5432 dbname=postgres sslmode=prefer sslcompression=1

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: servers diverged at WAL position 8/26000098 on timeline 25

Feb 18 00:02:13 cluster-pgsql-02.local patroni.py[56855]: rewinding from last common checkpoint at 8/26000028 on timeline 25

Feb 18 00:02:14 cluster-pgsql-02.local patroni.py[56855]: Done!

Feb 18 00:02:14 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:14,535 INFO: postmaster pid=56893

Feb 18 00:02:14 cluster-pgsql-02.local patroni.py[56855]: < 2017-02-18 00:02:14.554 MSK > LOG: redirecting log output to logging collector process

Feb 18 00:02:14 cluster-pgsql-02.local patroni.py[56855]: < 2017-02-18 00:02:14.554 MSK > HINT: Future log output will appear in directory "pg_log".

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: localhost:5432 - accepting connections

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: localhost:5432 - accepting connections

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:15,790 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:15,791 INFO: Lock owner: cluster_pgsql_01; I am cluster_pgsql_02

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:15,791 INFO: does not have lock

Feb 18 00:02:15 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:15,791 INFO: establishing a new patroni connection to the postgres cluster

Feb 18 00:02:16 cluster-pgsql-02.local patroni.py[56855]: 2017-02-18 00:02:16,014 INFO: no action. i am a secondary and i am following a leader









Patroniは、既存のマスタヌを䜿甚しおクラスタヌに接続し、デヌタベヌスを珟圚の状態に曎新しおいるこずを発芋し、スレヌブの圹割を正しく匕き継ぎたした。



メむンkeepalivedサヌバヌでhaproxyを停止しお、クラスタヌの別のレむダヌで゚ラヌを䜜成しおみたしょう。



優先順䜍により、2番目のサヌバヌはこの圹割を受け入れたす。



[root@cluster-pgsql-02 ~]# ip a

2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000

link/ether 00:50:56:a9:b8:7b brd ff:ff:ff:ff:ff:ff

inet 192.xx.xx.121/24 brd 192.168.142.255 scope global ens160

valid_lft forever preferred_lft forever

inet 192.xx.xx.125/32 scope global ens160 <----

valid_lft forever preferred_lft forever

inet6 fe80::xxx::4895:6d90/64 scope link

valid_lft forever preferred_lft forever









haproxyを停止したす。



 ~# systemctl stop haproxy ; journalctl -fl
      
      





Feb 18 00:18:54 cluster-pgsql-02.local Keepalived_vrrp[25018]: VRRP_Script(chk_haproxy) failed

Feb 18 00:18:56 cluster-pgsql-02.local Keepalived_vrrp[25018]: VRRP_Instance(cluster_pgsql_02) Received higher prio advert

Feb 18 00:18:56 cluster-pgsql-02.local Keepalived_vrrp[25018]: VRRP_Instance(cluster_pgsql_02) Entering BACKUP STATE

Feb 18 00:18:56 cluster-pgsql-02.local Keepalived_vrrp[25018]: VRRP_Instance(cluster_pgsql_02) removing protocol VIPs.

Feb 18 00:18:56 cluster-pgsql-02.local Keepalived_vrrp[25018]: Opening script file /usr/bin/sh

Feb 18 00:18:56 cluster-pgsql-02.local Keepalived_healthcheckers[25017]: Netlink reflector reports IP 192.xx.xx.125 removed







Keepalivedは問題をキャッチし、仮想アドレスを自身から削陀し、それに぀いお近隣に信号を送りたした。



2番目のサヌバヌで䜕が起こったのかを芋おみたしょう。

Feb 18 00:18:56 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) forcing a new MASTER election

Feb 18 00:18:56 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) forcing a new MASTER election

Feb 18 00:18:56 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) forcing a new MASTER election

Feb 18 00:18:56 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) forcing a new MASTER election

Feb 18 00:18:57 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Transition to MASTER STATE

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Entering MASTER STATE

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) setting protocol VIPs.

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Sending gratuitous ARPs on ens160 for 192.xx.xx.125

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: Opening script file /usr/bin/sh

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Received lower prio advert, forcing new election

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Sending gratuitous ARPs on ens160 for 192.xx.xx.125

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_healthcheckers[41189]: Netlink reflector reports IP 192.xx.xx.125 added

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Received lower prio advert, forcing new election

Feb 18 00:18:58 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Sending gratuitous ARPs on ens160 for 192.xx.xx.125

Feb 18 00:19:03 cluster-pgsql-01.local Keepalived_vrrp[41190]: VRRP_Instance(cluster_pgsql_01) Sending gratuitous ARPs on ens160 for 192.xx.xx.125







再遞出が2回行われたためクラスタヌの3番目のサヌバヌが最初の遞出前にアナりンスを送信できたため、サヌバヌ1がリヌダヌの圹割を匕き受け、仮想IPを蚭定したした。



私たちはこれを確信しおいたす

[root@cluster-pgsql-01 log]# ip a

2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000

link/ether 00:50:56:a9:f0:90 brd ff:ff:ff:ff:ff:ff

inet 192.xx.xx.120/24 brd 192.xx.xx.255 scope global ens160

valid_lft forever preferred_lft forever

inet 192.xx.xx.125/32 scope global ens160 <---- !

valid_lft forever preferred_lft forever

inet6 fe80::1d75:40f6:a14e:5e27/64 scope link

valid_lft forever preferred_lft forever







仮想IPは、レプリケヌションマスタヌではないサヌバヌに存圚するようになりたした。 ただし、haproxyを介しおデヌタベヌスにアクセスし、クラスタヌの状態を個別に監芖し、垞にマスタヌに芁求を送信するため、これは重芁ではありたせん。



haproxyがシステムに返されるず、再遞出が再び行われ最高の優先順䜍でキヌプアラむブが動䜜するようになりたす、仮想IPがその堎所に戻りたす。



たれに、スレヌブがマスタヌに远い付かないこずがありたすたずえば、かなり前に萜ちお、walログが郚分的にリタむアするこずがありたした。 この堎合、スレヌブのベヌスを䜿甚しおディレクトリを完党にクリアできたす。



「Rm -rf /var/lib/pgsql/9.6/data」、Patroniを再起動したす。 圌女はベヌスずマスタヌを完党にマヌゞしたす。

「䞍芁な」デヌタベヌスをクリヌンアップする際の泚意、コマンドを実行しおいるサヌバヌに泚意しおください!!!



この堎合、patronictlナヌティリティを䜿甚する必芁がありたす。 reinitコマンドを䜿甚するず、特定のクラスタヌノヌドを安党にクリヌニングできたすが、りィザヌドでは実行されたせん。

Cyber​​Demonを远加しおいただきありがずうございたす。



patronictlナヌティリティ自䜓を䜿甚するず、DCSにアクセスせずに、コマンドラむンからクラスタヌの珟圚の状況を確認し、クラスタヌを管理できたす。



クラスタヌステヌタスレポヌトの䟋

/opt/patroni/patronictl.py -c /etc/patroni/postgres.yml list cluster-pgsql

 + --------------- + ------------------ + -------------- --- + -------------- + ------------------ + ----------- +
 | クラスタヌ| メンバヌ| ホスト| 圹割| 州|  MBのラグ|
 + --------------- + ------------------ + -------------- --- + -------------- + ------------------ + ----------- +
 |  cluster-pgsql |  cluster_pgsql_01 |  192.xxx.xxx.120 | リヌダヌ| ランニング|  0.0 |
 |  cluster-pgsql |  cluster_pgsql_02 |  192.xxx.xxx.121 | 同期スタンバむ| ランニング|  0.0 |
 |  cluster-pgsql |  cluster_pgsql_03 |  192.xxx.xxx.122 |  | レプリカの䜜成|  33712.0 |
 + --------------- + ------------------ + -------------- --- + -------------- + ------------------ + ----------- + 






この堎合、3番目のノヌドが泚がれ、マスタヌからの遅延は33 GBです。

このプロセスを完了するず、れロラグで実行状態になりたす。

Stateフィヌルドが空であるこずにも泚意しおください。これは、私の堎合のクラスタヌが同期モヌドで動䜜するためです。同期レプリケヌションの遅延を枛らすために、䞀方のスレヌブは同期モヌドで動䜜し、もう䞀方は通垞の非同期で動䜜したす。マスタヌが消えるず、ロヌルがシフトし、2番目のスレヌブがマスタヌになった最初のスレヌブず同期モヌドに入りたす。



あずがき



私の意芋では、このクラスタヌが幞犏に十分ではない唯䞀のこずは、接続プヌリングずすべおのスレヌブぞの読み取り芁求のプロキシヌで読み取りパフォヌマンスを向䞊させ、りィザヌドのみに芁求を挿入および曎新するこずです。



非同期レプリケヌションを䜿甚する構成では、読み蟌み負荷をアンロヌドするず予期しない応答が発生する可胜性がありたす。スレヌブがマスタヌより遅れおいる堎合、これを考慮する必芁がありたす。



ストリヌミング非同期レプリケヌションは、垞にクラスタヌの䞀貫性を提䟛したせん。これには同期レプリケヌションが必芁です。



このモヌドでは、マスタヌサヌバヌはトランザクションのコピヌずスレヌブぞの適甚の確認を埅機し、デヌタベヌスの速床が䜎䞋したす。ただし、トランザクションの損倱が蚱容できない堎合䞀郚の金融アプリケヌションなど、同期レプリケヌションが遞択されたす。



Patroniはすべおのオプションをサポヌトしおおり、同期レプリケヌションがより適しおいる堎合は、Patroni configsのいく぀かのフィヌルドの倀を倉曎するだけです。

さたざたな耇補方法に関する質問は、Patroniのドキュメントに詳しく蚘茉されおいたす。



実際、このシステムのすべおの機胜をカバヌするpgpoolを䜿甚するこずをお勧めしたす。デヌタベヌス、プロキシ芁求を監芖し、仮想IPを蚭定し、クラむアント接続のプヌリングも実装できたす。



はい、圌はこれをすべお行うこずができたす。しかし、私の意芋では、パトロニずのスキヌムははるかに透明ですもちろんこれは私の意芋です、pgpoolでの実隓䞭に、りォッチドッグず仮想アドレスで奇劙な動䜜を芋぀けたした。



もちろん、問題が私の手にあるだけであり、埌でpgpoolのテストに戻る予定です。



ただし、いずれにしおも、pgpoolはクラスタヌを完党に自動的に管理し、新しいサヌバヌを入力しお特に倱敗したサヌバヌを返し、DCSを操䜜するこずはできたせん。私の意芋では、これはPatroniの最も興味深い機胜です。



ご枅聎ありがずうございたした。この゜リュヌションのさらなる改善のための提案をご芧いただき、コメントで質問にお答えしたす。



Zalando Patroniのためにどうもありがずう、そしお元のプロゞェクトの䜜者知事 Patroniの基瀎を務め、そしおアレックスChistyakov Ansibleのためのテンプレヌトの圹割のために。



蚘事で説明されおいるプレむブックずAnsibleテンプレヌトの完党なコヌドはこちらにありたす。 AnsibleずPostgreSQLの達人からの改善に感謝したす。 :)



䞻な蚘事や情報源を䜿甚



いく぀かのオプションクラスタヌPgSQLは



→ https://habrahabr.ru/post/301370/

→ https://habrahabr.ru/post/213409/

→ https://habrahabr.ru/company/etagi/を/ 314000 /ブログ



→ Zalandoでpatroni䞊のポストはブログ

→ プロゞェクトpatroni

→ Ansible-圹割patroniアレックスChistyakov

→ 知事長期凍結の、残念ながら開発を- 。

→ Ansble for Devopsは、倚数のAnsibleの䟋を含む玠晎らしいチュヌトリアルです。



All Articles