PG高可用集群之Patroni + etcd + HAProxy + keepalived + Prometheus + Grafana监控 部署
Tags: etcdGrafanaHAProxykeepalivedPatroniPGPrometheus高可用
简介
使用postgresql + etcd + patroni + haproxy + keepalived可以实现PG的高可用集群,其中,以postgresql做数据库,Patroni监控本地的PostgreSQL状态,并将本地PostgreSQL信息/状态写入etcd来存储集群状态,所以,patroni与etcd结合可以实现数据库集群故障切换(自动或手动切换),而haproxy可以实现数据库读写分离+读负载均衡(通过不同端口实现),keepalived实现VIP跳转,对haproxy提供了高可用,防止haproxy宕机。
Etcd用于Patroni节点之间共享信息。Patroni监控本地的PostgreSQL状态。如果主库(Primary)故障,Patroni把一个从库(Standby)拉起来,作为新的主(Primary)数据库, 如果一个故障PostgreSQL被抢救过来了,能够重新自动或手动加入集群。
Patroni基于Python开发的模板,结合DCS(Distributed Configuration Store,例如 ZooKeeper, etcd, Consul )可以定制PostgreSQL高可用方案。Patroni接管PostgreSQL数据库的启停,同时监控本地的PostgreSQL数据库,并将本地的PostgreSQL数据库信息写入DCS。Patroni的主备端是通过是否能获得 leader key 来控制的,获取到了leader key的Patroni为主节点,其它的为备节点。
其中Patroni不仅简单易用而且功能非常强大。
支持自动failover和按需switchover
支持一个和多个备节点
支持级联复制
支持同步复制,异步复制
支持同步复制下备库故障时自动降级为异步复制(功效类似于MySQL的半同步,但是更加智能)
支持控制指定节点是否参与选主,是否参与负载均衡以及是否可以成为同步备机
支持通过
pg_rewind
自动修复旧主支持多种方式初始化集群和重建备机,包括
pg_basebackup
和支持wal_e
,pgBackRest
,barman
等备份工具的自定义脚本支持自定义外部callback脚本
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!支持REST API
支持通过watchdog防止脑裂
支持k8s,docker等容器化环境部署
支持多种常见DCS(Distributed Configuration Store)存储元数据,包括etcd,ZooKeeper,Consul,Kubernetes
架构规划
部署规划如下:
主机 | IP | 组件 | 备注 |
---|---|---|---|
lhrpgpatroni71 | 172.72.6.71 | PostgreSQL 13.3 + Patroni 2.1.2 | 主节点,yum安装PG,pip3安装Patroni |
lhrpgpatroni72 | 172.72.6.72 | PostgreSQL 13.3 + Patroni 2.1.2 | 备节点1,yum安装PG,pip3安装Patroni |
lhrpgpatroni73 | 172.72.6.73 | PostgreSQL 13.3 + Patroni 2.1.2 | 备节点2,yum安装PG,pip3安装Patroni |
lhretcd74 | 172.72.6.74 | etcd 3.3.11 | leader,yum安装etcd |
lhretcd75 | 172.72.6.75 | etcd 3.3.11 | follower,yum安装etcd |
lhretcd76 | 172.72.6.76 | etcd 3.3.11 | follower,yum安装etcd |
lhrhaproxyka77 | 172.72.6.77 | HAProxy 1.5.18 + keepalived 1.3.5 | yum安装HAProxy + keepalived主节点 |
lhrhaproxyka78 | 172.72.6.78 | HAProxy 1.5.18 + keepalived 1.3.5 | yum安装HAProxy + keepalived备节点 |
lhrmonitor | 172.72.6.79 | Prometheus + Grafana + etcd brower | 已内置普罗米修斯监控软件,需要配置监控PG和HAProxy,etcd浏览 |
172.72.6.70 | VIP | 虚拟IP,在172.72.6.77和172.72.6.78之间进行漂移,附着于eth0网卡 |
架构图如下:
拓扑图如下:
本文包括如下几个部分:
1、搭建1主2从的PG流复制环境
2、搭建3节点的etcd集群,并配置etcd-browser WEB可视化界面
3、patroni安装及配置实现switchover和failover故障切换
4、配置HAProxy和Keepalived实现负载均衡+读写分离
5、配置普罗米修斯(prometheus+grafana)监控PG+HAproxy+etcd集群
6、高可用测试
如果配置防火墙,需要开放的端口:
程序 | 端口 | 用途 |
---|---|---|
PostgreSQL | 5432 | 数据库监听端口 |
Patroni | 8008 | restapi监听端口 |
etcd | 2379/2380 | 客户端访问端口和服务监听端口 |
haproxy | 1080/5000/5001 | Web访问端口和数据库对外服务端口 |
grafana | 3000 | Web登录端口 |
prometheus | 9090 | Web登录端口 |
node_exporter | 9100 | 对外服务端口 |
postgres_exporter | 9187 | 对外服务端口 |
haproxy_exporter | 9101 | 对外服务端口 |
环境准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | -- 网卡 docker network create --subnet=172.72.6.0/24 pg-network -- pg + Patroni docker rm -f lhrpgpatroni71 docker run -d --name lhrpgpatroni71 -h lhrpgpatroni71 \ --net=pg-network --ip 172.72.6.71 \ -p 64371:5432 -p 18008:8008 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgall:2.0 \ /usr/sbin/init docker rm -f lhrpgpatroni72 docker run -d --name lhrpgpatroni72 -h lhrpgpatroni72 \ --net=pg-network --ip 172.72.6.72 \ -p 64372:5432 -p 28008:8008 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgall:2.0 \ /usr/sbin/init docker rm -f lhrpgpatroni73 docker run -d --name lhrpgpatroni73 -h lhrpgpatroni73 \ --net=pg-network --ip 172.72.6.73 \ -p 64373:5432 -p 38008:8008 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrpgall:2.0 \ /usr/sbin/init -- etcd docker rm -f lhretcd74 docker run -d --name lhretcd74 -h lhretcd74 \ --net=pg-network --ip 172.72.6.74 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:8.5 \ /usr/sbin/init docker rm -f lhretcd75 docker run -d --name lhretcd75 -h lhretcd75 \ --net=pg-network --ip 172.72.6.75 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:8.5 \ /usr/sbin/init docker rm -f lhretcd76 docker run -d --name lhretcd76 -h lhretcd76 \ --net=pg-network --ip 172.72.6.76 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:8.5 \ /usr/sbin/init -- HAProxy + keepalived docker rm -f lhrhaproxyka77 docker run -d --name lhrhaproxyka77 -h lhrhaproxyka77 \ --net=pg-network --ip 172.72.6.77 \ -p 11080:1080 -p 15000-15001:5000-5001 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:8.5 \ /usr/sbin/init docker rm -f lhrhaproxyka78 docker run -d --name lhrhaproxyka78 -h lhrhaproxyka78 \ --net=pg-network --ip 172.72.6.78 \ -p 21080:1080 -p 25000-25001:5000-5001 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrcentos76:8.5 \ /usr/sbin/init -- 监控 docker rm -f lhrmonitor docker run -d --name lhrmonitor -h lhrmonitor \ --net=pg-network --ip 172.72.6.79 \ -p 23389:3389 -p 29090:9090 -p 29093:9093 -p 23000:3000 -p 28000:8000 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/lhrprometheus:1.0 \ /usr/sbin/init |
笔耕不辍,我辈学习楷模。