日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgresql 高可用 etcd + patroni 之二 patroni

發(fā)布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postgresql 高可用 etcd + patroni 之二 patroni 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

os: centos 7.4
postgresql: 9.6.9
etcd: 3.2.18
patroni: 1.4.4

patroni + etcd 是在一個postgrsql 開源大會上 亞信的一個哥們講解的高可用方案。
依然是基于 postgreql stream replication。

ip規(guī)劃
192.168.56.101 node1 master
192.168.56.102 node2 slave
192.168.56.103 node3 slave

安裝postgresql并配置好stream

node1、node2、node3 節(jié)點上注意設(shè)置如下幾個參數(shù)

synchronous_commit = on full_page_writes = on wal_log_hints = on synchronous_standby_names = '*' max_replication_slots = 10

主要是為了使用 pg_rewind,盡量不用 synchronous 方式復(fù)制數(shù)據(jù),性能影響太大。

node1上創(chuàng)建復(fù)制槽,至關(guān)重要,patroni 用到了這個玩意

postgres=# create user replicator replication login encrypted password '1qaz2wsx';postgres=# select * from pg_create_physical_replication_slot('pgsql96_node1'); postgres=# select * from pg_create_physical_replication_slot('pgsql96_node2'); postgres=# select * from pg_create_physical_replication_slot('pgsql96_node3');

node2、node3 配置stream replication

$ /usr/pgsql-9.6/bin/pg_ctl stop -m fast -D /var/lib/pgsql/9.6/main$ cd /var/lib/pgsql/9.6/main $ rm -rf ./* $ /usr/pgsql-9.6/bin/pg_basebackup -h 192.168.56.101 -D /var/lib/pgsql/9.6/main -U replicator -v -P -R$ vi recovery.conf recovery_target_timeline = 'latest' standby_mode = 'on' primary_conninfo = 'host=192.168.56.101 port=5432 user=replicator password=1qaz2wsx' primary_slot_name = 'pgsql96_node1' trigger_file = '/tmp/postgresql.trigger.5432'$ /usr/pgsql-9.6/bin/pg_ctl start -D /var/lib/pgsql/9.6/main -o "-c config_file=/etc/postgresql/9.6/main/postgresql.conf"

注意 recovery.conf 的 primary_slot_name 在不同節(jié)點值會不同。

添加復(fù)制功能條目 pg_hba.conf

$ vi pg_hba.conf# Database administrative login by Unix domain socket local all postgres peer# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections only local all all peer# IPv4 local connections: host all postgres 127.0.0.1/32 trust host all all 127.0.0.1/32 md5 host all all 192.168.56.0/24 md5# IPv6 local connections: host all all ::1/128 md5# Allow replication connections from localhost, by a user with the # replication privilege. local replication replicator peer host replication replicator 127.0.0.1/32 md5 host replication replicator ::1/128 md5host replication replicator 192.168.56.101/32 md5 host replication replicator 192.168.56.102/32 md5 host replication replicator 192.168.56.103/32 md5$ psql -c "select pg_reload_conf();"

查看復(fù)制狀態(tài)

postgres=# select client_addr,pg_xlog_location_diff(sent_location, write_location) as write_delay,pg_xlog_location_diff(sent_location, flush_location) as flush_delay,pg_xlog_location_diff(sent_location, replay_location) as replay_delay from pg_stat_replication;client_addr | write_delay | flush_delay | replay_delay ----------------+-------------+-------------+--------------192.168.56.102 | 0 | 0 | 0192.168.56.103 | 0 | 0 | 0 (2 row)

安裝etcd

參考上一篇blog安裝好etcd

下載、安裝 patroni

用戶也可以參考 https://www.linode.com/docs/databases/postgresql/create-a-highly-available-postgresql-cluster-using-patroni-and-haproxy/

個人覺得上篇文章中 etcd 做成單點不太合適,當(dāng)然作為參考完全沒有問題。

# cd /tmp # curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # python get-pip.py # pip install patroni[dependencies]

patroni的一些依賴

urllib3>=1.19.1,!=1.21 boto psycopg2>=2.5.4 PyYAML requests six>=1.7 kazoo>=1.3.1 python-etcd>=0.4.3,<0.5 python-consul>=0.7.0 click>=4.1 prettytable>=0.7 tzlocal python-dateutil psutil cdiff kubernetes>=2.0.0,<=6.0.0,!=4.0.*,!=5.0.*

patroni 的配置

# which patroni /usr/bin/patroni# patroni --help /usr/lib64/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.""") Usage: /usr/bin/patroni config.ymlPatroni may also read the configuration from the PATRONI_CONFIGURATION environment variable

錯誤提示 please use “pip install psycopg2-binary” instead

# pip install psycopg2-binary

patroni 配置文件

# mkdir -p /usr/patroni/conf # cd /usr/patroni/conf/# vi patroni_postgresql.ymlscope: pgsql96 namespace: /pgsql/ name: pgsql96_node1restapi:listen: 192.168.56.101:8008connect_address: 192.168.56.101:8008etcd:host: 192.168.56.101:2379bootstrap:# this section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster# and all other cluster members will use it as a `global configuration`dcs:ttl: 30loop_wait: 10retry_timeout: 10maximum_lag_on_failover: 1048576master_start_timeout: 300 # synchronous_mode: falsepostgresql:use_pg_rewind: trueuse_slots: trueparameters:listen_addresses: "*"port: 5432wal_level: logicalhot_standby: "on"wal_keep_segments: 1000max_wal_senders: 10max_replication_slots: 10wal_log_hints: "on" # archive_mode: "on" # archive_timeout: 1800s # archive_command: gzip < %p > /data/backup/pgwalarchive/%f.gz # recovery_conf: # restore_command: gunzip < /data/backup/pgwalarchive/%f.gz > %ppostgresql:listen: 0.0.0.0:5432connect_address: 192.168.56.101:5432data_dir: /var/lib/pgsql/9.6/databin_dir: /usr/pgsql-9.6/bin # config_dir:authentication:replication:username: replicatorpassword: 1qaz2wsxsuperuser:username: postgrespassword: 1qaz2wsx#watchdog: # mode: automatic # Allowed values: off, automatic, required # device: /dev/watchdog # safety_margin: 5tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: false

上面的配置和后面的輸出信息有細微差異,是因為當(dāng)時實驗完成后又對這個配置文件做了好幾次修正,方便大家直接copy使用。

手動啟動 patroni

參數(shù)將按以下順序應(yīng)用(運行時被賦予最高優(yōu)先級):

1、從文件加載參數(shù)postgresql.base.conf(或從自定義conf文件(如果已設(shè)置)
2、從文件加載參數(shù)postgresql.conf
3、從文件加載參數(shù)postgresql.auto.conf
4、運行時參數(shù)使用-o-name=value

node1、node2、node3 三個節(jié)點依次啟動

$ patroni /usr/patroni/conf/patroni_postgresql.yml

node1 的日志如下

2018-07-11 18:17:22,402 INFO: Lock owner: pg96_101; I am pg96_101 2018-07-11 18:17:22,430 INFO: no action. i am the leader with the lock 2018-07-11 18:17:32,403 INFO: Lock owner: pg96_101; I am pg96_101 2018-07-11 18:17:32,432 INFO: no action. i am the leader with the lock

node2 的日志如下

2018-07-11 18:17:22,421 INFO: Lock owner: pg96_101; I am pg96_102 2018-07-11 18:17:22,421 INFO: does not have lock 2018-07-11 18:17:22,435 INFO: no action. i am a secondary and i am following a leader 2018-07-11 18:17:32,426 INFO: Lock owner: pg96_101; I am pg96_102 2018-07-11 18:17:32,426 INFO: does not have lock 2018-07-11 18:17:32,436 INFO: no action. i am a secondary and i am following a leader

node3 的日志如下

2018-07-11 18:17:22,409 INFO: Lock owner: pg96_101; I am pg96_103 2018-07-11 18:17:22,410 INFO: does not have lock 2018-07-11 18:17:22,423 INFO: no action. i am a secondary and i am following a leader 2018-07-11 18:17:32,415 INFO: Lock owner: pg96_101; I am pg96_103 2018-07-11 18:17:32,415 INFO: does not have lock 2018-07-11 18:17:32,425 INFO: no action. i am a secondary and i am following a leader

查看集群狀態(tài)

查看 patroni 集群狀態(tài)

$ patronictl -c /usr/patroni/conf/patroni_postgresql.yml list pg96 +---------+----------+----------------+--------+---------+-----------+ | Cluster | Member | Host | Role | State | Lag in MB | +---------+----------+----------------+--------+---------+-----------+ | pg96 | pg96_101 | 192.168.56.101 | Leader | running | 0.0 | | pg96 | pg96_102 | 192.168.56.102 | | running | 0.0 | | pg96 | pg96_103 | 192.168.56.103 | | running | 0.0 | +---------+----------+----------------+--------+---------+-----------+$ patronictl -c /usr/patroni/conf/patroni_postgresql.yml show-config pg96 loop_wait: 10 maximum_lag_on_failover: 1048576 postgresql:parameters:listen_addresses: '*'port: 5432use_pg_rewind: true retry_timeout: 10 ttl: 30

查看 etcd 的 信息

$ etcdctl ls /pg96/pg96/ /pg96/pg96/members /pg96/pg96/initialize /pg96/pg96/leader /pg96/pg96/config /pg96/pg96/optime $ etcdctl get /pg96/pg96/members/pg96_101 {"conn_url":"postgres://192.168.56.101:5432/postgres","api_url":"http://127.0.0.1:8008/patroni","timeline":1,"state":"running","role":"master","xlog_location":50378640} $ etcdctl get /pg96/pg96/members/pg96_102 {"conn_url":"postgres://192.168.56.102:5432/postgres","api_url":"http://127.0.0.1:8008/patroni","timeline":1,"state":"running","role":"replica","xlog_location":50378640} $ etcdctl get /pg96/pg96/members/pg96_103 {"conn_url":"postgres://192.168.56.103:5432/postgres","api_url":"http://127.0.0.1:8008/patroni","timeline":1,"state":"running","role":"replica","xlog_location":50378640} $ etcdctl get /pg96/pg96/initialize 6576484813966394513 $ etcdctl get /pg96/pg96/leader pg96_101 $ etcdctl get /pg96/pg96/config {"ttl":30,"maximum_lag_on_failover":1048576,"retry_timeout":10,"postgresql":{"use_pg_rewind":true,"parameters":{"listen_addresses":"*","port":5432}},"loop_wait":10} $ etcdctl get /pg96/pg96/optime/leader 50378640

connction

using jdbc:

jdbc:postgresql://node1,node2,node3/postgres?targetServerType=master

libpq starting from postgresql 10:

postgresql://node1:port,node2:port,node3:port/?target_session_attrs=read-write

配置隨OS啟動

# vi /etc/rc.local su - postgres -c "/usr/bin/patroni /usr/patroni/conf/patroni_postgresql.yml >> /var/log/postgresql/patroni.log 2>&1 &"

或者配置成 patroni.service

# vi /etc/systemd/system/patroni.service[Unit] Description=Runners to orchestrate a high-availability PostgreSQL After=syslog.target network.target etcd.target[Service] Type=simpleUser=postgres Group=postgresExecStart=/usr/bin/patroni /usr/patroni/conf/patroni_postgresql.ymlKillMode=processTimeoutSec=30Restart=no[Install] WantedBy=multi-user.targ # systemctl status patroni # systemctl start patroni # systemctl enable patroni# systemctl status postgresql # systemctl disable postgresql# systemctl status etcd # systemctl enable etcd

禁止 postgresql 的自啟動,通過 patroni 來管理 postgresql。

總結(jié):
個人感覺 etcd + patroni 還是相當(dāng)不錯的,會繼續(xù)對patroni 研究下。

參考:
https://github.com/zalando/patroni
https://patroni.readthedocs.io/en/latest/
https://pypi.org/project/patroni/

https://github.com/zalando/patroni/blob/master/docs/replication_modes.rst
https://postgresconf.org/system/events/document/000/000/228/Patroni_tutorial_4x3-2.pdf

轉(zhuǎn)載于:https://www.cnblogs.com/ctypyb2002/p/9792939.html

總結(jié)

以上是生活随笔為你收集整理的postgresql 高可用 etcd + patroni 之二 patroni的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。