本文主要从以下几个方面介绍PostgreSQL高可用集群在360的落地实战
为什么选择Patroni + Etcd + PostgreSQL高可用集群方案
PostgreSQL高可用集群在360的落地实战 Patroni + Etcd 高可用集群架构解析
Patroni + Etcd + PostgreSQL 部署实战
Patroni 日常运维管理
PostgreSQL 监控实现
PostgreSQL 应用连接方式
PostgreSQL 备份恢复方式选择
背景
最近线上重要业务容器云的镜像仓库需要部署一套postgresql 高可用集群,涉及到数据库选型,最终选择了postgresql,为什么不选择mysql呢,postgresql是功能最强大的开源数据库,主要考虑postgresql支持使用函数索引和条件索引,text 没有限制,可以索引,还可以全文检索,不用再接一套es,并且postgresql 开源协议好,开源软件原生支持好,特别对开发来说比较友好,最重要的是kube-bench 只支持postgresql。
为什么选择Patroni + Etcd 方案
PostgreSQL 比较流行的高可用解决方案有很多,常用的主要包含repmgr和patroni等,也是github star前几的高可用组件,并且文档更新比较及时,都可最高支持postgresql 13,repmgr 相对来说功能没有patroni全面以及不能检测备机是否被错误配置为未知或不存在的节点、不能检测远程节点的状态(不具备分布式解决方案)和不能处理单个节点的恢复,本文主要基于patroni 实现。
此方案使用Patroni管理本地库,并结合Etcd作为数据存储和主节点选举,具有以下优势:
健壮性: 使用分布式key-value数据库作为数据存储,主节点故障时进行主节点重新选举,具有很强的健壮性
支持多种复制方式: 基于内置流复制,支持同步流复制、异步流复制、级联复制
支持主备延迟设置: 可以设置备库延迟主库WAL的字节数,当备库延迟大于指定值时不做故障切换
自动化程度高:
支持自动化初始PostgreSQL实例并部署流复制
当备库实例关闭后,支持自动拉起
当主库实例关闭后,首先会尝试自动拉起
支持switchover命令,能自动将老的主库进行角色转换
避免脑裂: 数据库信息记录到ETCD 中,通过优化部署策略(多机房部署、增加实例数)可以避免脑裂
Patroni + Etcd 高可用架构
Patroni 是一个开源工具套件,它是用 Python编写的,可确保 PostgreSQL HA 集群的端到端设置,包括流复制。它的功能通过REST API显示,也通过一个名为 Patronictl 的命令行实用程序显示。它通过使用其运行状况检查API来处理负载平衡来支持与 HAProxy 的集成。在此 HA 解决方案中,etcd 用于分布式配置存储 (DCS),以实现最大的可访问性,下面是官方高可用集群方案的架构图展示,我们基于此完成postgresql 高可用架构集群方案设计,不过并没有使用HAproxy 进行负载均衡,而是使用公司内部的LVS 来实现的,一主两副本,副本部署在不同的idc 实现异地灾备,etcd 也是三节点集群分别部署在三台机器, 如果资源有限,也可以和postgresql/patroni部署在相同机器。
Etcd、Patroni 和PostgreSQL是如何一起工作的
etcd/patroni/postgresql 都是部署的3节点集群
Etcd: 分布式的Key-Value数据库
etcd1、etcd2、 etcd3作为分布式的Key-Value数据库,被partroni1、 patroni2、 patroni3读/写,用于共享/传递信息。每一个 Patroni都能读/写etcd中的数据。
Paroni: 控制/监控本地的PostgreSQL, 把本地PostgreSQL信息/状态写入etcd
每一个 Patroni实例监控/控制本地的PostgreSQL,把本地本地PostgreSQL信息/状态写入etcd , 一个Patroni实例能够通过读取etcd获取外地PostgreSQL的信息/状态。
PostreSQL主节点的选举
Patroni判断本地PostgreSQL是否可以作为Primary库。如果可以,Paroni试图选举本地PostgreSQL作为Primary(Leader) , 选举方式是:把etcd中的某个key更新成为本地PostgreSQL的名字, 如果多个Paroni同时更改同一个key,只有一个能改成功,然后成为Primary(Leader)。
部署篇
系统/软件/版本
· CentOS 7.4
· PostgreSQL 12.6
· etcd: 3.2.18
· python: Python 3.6.5
· Patroni: 2.1.0
主机信息
10.16.75.17 pg12/patroni
10.16.75.15 pg12/patroni
10.16.78.53 pg12/patroni
10.24.13.9 etcd
10.24.13.10 etcd
10.24.13.11 etcd
这里用了6台机器,也可以用3台机器组件全部安装在一起
Python3 安装
# 安装依赖
yum install wget gcc make zlib-devel openssl openssl-devel
wget "https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz"
tar -xvJf Python-3.6.5.tar.xz
# 编译
cd Python-3.6.5 && ./configure prefix=/usr/local/python3
make && make install
ln -fs /usr/local/python3/bin/python3 /usr/bin/python3
ln -fs /usr/local/python3/bin/pip3 /usr/bin/pip3
# virtualenv
pip3 inst