原文链接: Patroni + Etcd 实现高可用之一: 安装部署
PostgreSQL 至今都没有特别流行的高可用方案,之前介绍过两种高可用方案,如下:
- Pgpool-II方案: PostgreSQL 流复制 + Pgpool-II 实现高可用 HA
- Keepalived方案:Keepalived + PostgreSQL 流复制方式实现高可用 HA
以上两种方案都能实现基本的 PostgreSQL 高可用,当主库宕机时,备库能正常接管,但存在一些不足。
Pgpool-II方案 - 故障切换时并不会判断备库与主库存在的数据差异,这块逻辑需要自定义。 - 性能下降明显,根据之前的只读场景测试,大概降幅有20%,详见Pgpool-II 流复制模式压力测试。 - 自动化程度不高,例如备库实例挂掉后不会自动拉起,主备切换后,需人工介入将老的主库进行角色转换。
Keepalived方案 - 程序移值性不好,不方便部署和安装。 - 自动化程度不高,例如备库实例挂掉后不会自动拉起,主备切换后,需人工介入将老的主库进行角色转换。
Patroni + Etcd 方案优点
最近在在看基于 Patroni + Etcd 的高可用方案,此方案使用Patroni管理本地库,并结合Etcd作为数据存储和主节点选举,具有以下优势:
- 健壮性: 使用分布式key-value数据库作为数据存储,主节点故障时进行主节点重新选举,具有很强的健壮性。
- 支持多种复制方式: 基于内置流复制,支持同步流复制、异步流复制、级联复制。
- 支持主备延迟设置: 可以设置备库延迟主库WAL的字节数,当备库延迟大于指定值时不做故障切换。
- 自动化程度高: 1)支持自动化初始PostgreSQL实例并部署流复制; 2)当备库实例关闭后,支持自动拉起; 3)当主库实例关闭后,首先会尝试自动拉起; 4)支持switchover命令,能自动将老的主库进行角色转换。
- 避免脑裂: 数据库信息记录到 ETCD 中,通过优化部署策略(多机房部署、增加实例数)可以避免脑裂。
Patroni 简介
Patroni基于Python开发的模板,结合DCS(例如 ZooKeeper, etcd, Consul )可以定制PostgreSQL高可用方案。
Patroni并不是一套拿来即用的PostgreSQL高可用组件,涉及较多的配置和定制工作。
Patroni接管PostgreSQL数据库的启停,同时监控本地的PostgreSQL数据库,并将本地的PostgreSQL数据库信息写入DCS。
Patroni的主备端是通过是否能获得 leader key 来控制的,获取到了leader key的Patroni为主节点,其它的为备节点。
Etcd 简介
Etcd是一款基于Raft算法和协议开发的分布式 key-value 数据库,基于Go语言编写,Patroni监控本地的PostgreSQL状态,并将相关信息写入Etcd,每个Patroni都能读写Etcd上的key,从而获取外地PostgreSQL数据库信息。
当Etcd的leader节点不可用时,Etcd会一致性的选择一个合适的节点作为主节点,新的Etcd主节点将获取leader key,因此建议Etcd集群为三个以上且为奇数的节点,不建议部署在同一个机房,有条件话尽量部署在三个机房。
一个标准的3节点etcd集群,最大容许1个节点故障。
部署规划
为了演示方便,使用笔记本上的三台虚机作为演示环境,软件版本规划如下:
操作系统: CentOS Linux 7.7
数据库: PostgreSQL 12.2
Python: Python 3.8.2
Etcd: etcd-v3.4.7
Patroni: patroni 1.6.5
部署规划如下:
环境准备
虽然Patroni支持自动化初始化PostgreSQL数据库并部署流复制,这两块工作个人建议还是手工来做比较好。
部署一主两从PostgreSQL流复制,主机ydtf01部署主库,ydtf02、ydtf03部署从库,流复制的部署可参考 PostgreSQL:使用 pg_basebackup 搭建流复制环境。
为了演示方便,关闭ydtf01、ydtf02、ydtf03主机上的防火墙,如下:
# systemctl stop firewalld.service
# systemctl disable firewalld.service
由于本文的部分工具需要通 epel源安装,安装 epel 源,如下:
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
安装python3,如下:
# wget -c https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
# ./configure
# make
# make install
创建软链接,如下:
rm -f /usr/bin/python ln -s /usr/local/bin/pytho