高可用的PostgreSQL集群使用Patroni和HAProxy
作者:Dmitry Romanoff, @JFrog的技术主管
2022年8月22日
11分钟阅读

作品简介:
高可用性是当今体系结构和现代系统的重要组成部分。本文描述了一种使用Patroni和HAProxy创建高可用性PostgreSQL集群的方法。高可用性允许PostgreSQL DB节点在出现故障时自动将工作重新路由到另一个可用的PostgreSQL DB节点。值得注意的是,这个博客与JFrog产品无关,而是与我的个人经历有关。hth华体会最新官方网站
描述:
这篇文章是关于如何使用Patroni和HAProxy创建一个高可用的PostgreSQL集群架构的一步一步的指南。
Patroni是一个开源的python包,用于管理Postgres配置。可以将其配置为处理复制、备份和恢复等任务。
Etcd是一个容错的分布式键值存储,用于存储Postgres集群的状态。使用Patroni,所有Postgres节点都使用etcd来保持Postgres集群正常运行。在生产中,使用更大的etcd集群是有意义的,这样如果一个etcd节点发生故障,也不会影响Postgres服务器。
设置好Postgres集群后,我们需要一种方法来连接到主服务器,而不管集群中的哪个服务器是主服务器。这就是HAProxy的用武之地。所有Postgres客户端/应用程序将连接到HAProxy, HAProxy将提供到集群中的主节点的连接。
HAProxy是一种面向TCP和HTTP应用程序的开源、高性能负载平衡器和反向代理。HAProxy可以用来分配负载,提高网站和应用程序的性能。
模式:

架构:
操作系统:Ubuntu 20.04
Postgres版本:12
机:node1知识产权:< node1_ip >角色:Postgresql, Patroni
机:node2知识产权:< node2_ip >角色:Postgresql, Patroni
机:node3知识产权:< node3_ip >角色:Postgresql, Patroni
机:etcdnode知识产权:< etcdnode_ip >角色:etcd
机:haproxynode知识产权:< haproxynode_ip >角色:HA Proxy
分步指导
步骤1 -设置node1, node2, node3:
sudo apt update sudo hostnamectl set-hostname nodeN sudo apt install net-tools sudo apt install postgresql postgresql-server-dev-12 sudo systemctl stop postgresql sudo ln -s /usr/lib/postgresql/12/bin/* /usr/sbin/ sudo apt -y install python python3-pip sudo apt install python3-test2022世界杯阿根廷预选赛赛程resources sudo pip3 install——upgrade setuptools sudo pip3 install psycopg2 sudo pip3 install patroni sudo pip3 install python-etcd
步骤2 -设置etcdnode:
Sudo apt update Sudo hostnamectl set-hostname etcdnode Sudo apt install net-tools Sudo apt -y install etcd
步骤3 -设置haproxynode:
Sudo apt update Sudo hostnamectl set-hostname haproxynode Sudo apt install net-tools Sudo apt -y install haproxy
步骤4 -在etcdnode上配置etcd:
sudo vi /etc/default/etcd ETCD_LISTEN_PEER_URLS = " http:// < etcdnode_ip >: 2380”ETCD_LISTEN_CLIENT_URLS = " http://localhost: 2379, http:// < etcdnode_ip >: 2379”ETCD_INITIAL_ADVERTISE_PEER_URLS = " http:// < etcdnode_ip >: 2380”ETCD_INITIAL_CLUSTER =“默认= http:// < etcdnode_ip >: 2380年,“ETCD_ADVERTISE_CLIENT_URLS = " http:// < etcdnode_ip >: 2379”ETCD_INITIAL_CLUSTER_TOKEN =“etcd-cluster ETCD_INITIAL_CLUSTER_STATE”=“新”sudo systemctl重启etcd sudo systemctl地位etcd curl http:// < etcdnode_ip >: 2380 /成员
步骤5 -在node1、node2和node3上配置Patroni:
Sudo vi /etc/patroni.yml scope: postgres namespace: /db/ name: node1 restapi: listen: :8008 connect_address: :8008 etcd: host:< etcdnode_ip >:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true use_slots: true parameters: initdb: - encoding: UTF8 - data-checksum pg_hba: - host replication replicator 127.0.0.1/32 md5 - host replication replicator /0 md5 - host replication replicator /0 md5 - host replication replicator /0 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options:—createrole—createdb postgresql:listen: :5432 connect_address: :5432 data_dir: /data/patroni pgpass: /tmp/pgpass authentication: replication: username: replicator password: ************ superuser: username: postgres password: ************ parameters: unix_socket_directories: `。标签:nofailover: false noloadbalance: false clonefrom: false nosync: false sudo mkdir -p /data/patroni sudo chown postgres:postgres /data/patroni sudo chmod 700 /data/patroni sudo vi /etc/systemd/system/patroni. . txtservice[单位]说明=高可用性PostgreSQL集群后=syslog. service[单位]说明=高可用性目标网络。target [Service] Type=simple User=postgres Group=postgres ExecStart=/usr/local/bin/patroni /etc/patroni. . targetyml KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.targ . yml KillMode=process TimeoutSec=30 Restart=no
步骤6 -在node1、node2和node3上启动Patroni服务:
Sudo systemctl start patroni Sudo systemctl status patroni
dmi@node1:~$ sudo systemctl status patroni●patroni。PostgreSQL集群加载:加载(/etc/systemd/system/patroni.service;禁用;供应商预设:已启用)激活:活动状态(运行)美国东部时间周二2022-06-28 06:20:08;主PID: 3430 (patroni)任务:13(限制:2319)内存:95.9M CGroup: /system.slice/patroni。Service├─3430 /usr/bin/python3 /usr/local/bin/patroni /etc/patroni.yml├─4189 postgres -D /data/patroni——config-file=/data/patroni/postgresql.conf——listen_addresses=192.168.1.139——port=5432——cluster_name=postgres——wal_level=replica——h>├─4197 postgres: postgres: checkpointer├─4198 postgres: postgres: background writer├─4199 postgres: postgres: walwriter├─4200 postgres: postgres: autovacuum launcher├─4201 postgres: postgres: stats collector├─4204 postgres: postgres: logical replication launcher├─4204 postgres: postgres: logical replication launcher├─4204 postgres: postgres: logical replication launcherpostgres postgres 192.168.1.139(50256) idle Jun 28 06:43:46 node1 patroni[3430]: 2022-06-28 06:43:46,405 INFO:锁定所有者:node1;我是node1 Jun 28 06:43:46 node1 patroni[3430]: 2022-06-28 06:43:46,410 INFO: no action。6月28日06:43:56 node1 patroni[3430]: 2022-06-28 06:43:56,450 INFO:锁的所有者:node1;我是node1 Jun 28 06:43:56 node1 patroni[3430]: 2022-06-28 06:43:56,455 INFO: no action。6月28日06:44:06 node1 patroni[3430]: 2022-06-28 06:44:06,409 INFO:锁的所有者:node1;我是node1 Jun 28 06:44:06 node1 patroni[3430]: 2022-06-28 06:44:06,414 INFO: no action。6月28日06:44:16 node1 patroni[3430]: 2022-06-28 06:44:16404 INFO:锁的所有者:node1; I am node1 Jun 28 06:44:16 node1 patroni[3430]: 2022-06-28 06:44:16,407 INFO: no action. i am the leader with the lock Jun 28 06:44:26 node1 patroni[3430]: 2022-06-28 06:44:26,404 INFO: Lock owner: node1; I am node1 Jun 28 06:44:26 node1 patroni[3430]: 2022-06-28 06:44:26,408 INFO: no action. i am the leader with the lock
步骤7—在haproxynode节点上配置HA代理。
sudo vi /etc/haprox /haproxy.cfg将其上下文替换为:global maxconn 100 log 127.0.0.1 local2 defaults log global mode tcp retries 2 timeout client 30m timeout connect 4s timeout server 30m timeout check 5s listen stats mode http bind *:7000 stats enable stats uri / listen postgres bind *:5000 option httpchk http-check expect status 200 default-server inter 3s fall 3 rise 2 on-标记-down shutdown-sessions server node1< node1_ip >:5432 maxconn 100 check port 8008 server node2< node2_ip >:5432 maxconn 100 check port 8008 server node3< node3_ip >5432 maxconn 100 check port 8008 sudo systemctl restart haproxy sudo systemctl status haproxy
●haproxy。(/lib/systemd/system/ HAProxy .service;启用;供应商预设:已启用)激活:活动状态(运行)美国东部时间周二2022-06-28 06:54:22;7s ago Docs: man:haproxy(1) file:/usr/share/doc/haproxy/configuration.txt.gz进程:1736 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $EXTRAOPTS (code=exited,status=0/SUCCESS)主PID: 1751 (haproxy)任务:3个(limit: 2319)内存:2.1M CGroup: /system.slice/haproxy。service├─1751 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy. cfg /run/haproxy. cfgpid -S /run/haproxy-master。袜子├─1753 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy. cfgpid -S /run/haproxy-master。sock Jun 28 06:54:22 haproxynode systemd[1]: Starting HAProxy Load Balancer…june 28 06:54:22 haproxynode haproxy[1751]:[通知]254/065422(1751):新的worker #1 (1753) fork Jun 28 06:54:22 haproxynode systemd[1]:启动haproxy负载均衡器。6月28日06:54:23 haproxynode haproxy[1753]: [WARNING] 254/065423 (1753): Server postgres/node2 is DOWN, reason: Layer7 wrong status, code: 503, info: "HTTP status check returned code <3C>503<3E>"> 6月28日06:54:24 haproxynode haproxy[1753]: [WARNING] 254/065424 (1753): Server postgres/node3 is DOWN, reason: Layer7 wrong status, code: 503, info: "HTTP status check returned code <3C>503<3E>">
步骤8 -测试PostgreSQL的高可用性集群设置:
http:// < haproxynode_ip >: 7000 / >

模拟node1崩溃:
Sudo systemctl stop patroni
在这种情况下,第二台Postgres服务器被提升为主服务器。

步骤9 -连接Postgres客户端到HAProxy IP地址:
psql -h -p 5000 -U postgres dmi@dmi-mac ~ % psql -h 192.168.1.115 -p 5000 -U postgres postgres用户密码:psql(12.4)输入“help”进行帮助。postgres=# dmi@dmi-mac ~ % psql -h 192.168.1.115 -p 5000 -U some_db用户some_user的密码:psql(12.4)输入“help”进行帮助。Some_db => dmi@node1:~$ patronictl -c /etc/patroni.yml列表+集群:postgres (6871178537652191317 ) ---+----+-----------+ | 员| TL | | | |主机角色状态滞后MB | +--------+---------------+---------+---------+----+-----------+ | node1 | 192.168.1.139 |复制运行| 2 | 0 | | | node2 | 192.168.1.110 |领袖运行| 2 | | | | node3 | 192.168.1.146 | | | 2 | 0运行复制品 | +--------+---------------+---------+---------+----+-----------+ dmi@node1: ~ $
步骤10 -故障转移测试:
在其中一个节点上运行:
Sudo systemctl stop patroni

简介:
在这篇文章中,演示了如何使用Patroni和HAProxy部署一个高可用的PostgreSQL集群。它检查了高可用性的PostgreSQL集群设置,将PostgreSQL客户端连接到HAProxy IP地址,并测试了故障转移。这个关键概念可以很容易地应用到PostgreSQL集群中更多数量的节点上。提高系统可用性的另一个可能步骤是向etcd添加节点,并添加用于IP故障转移的HAProxy服务器。