1.概述
该文档主要记录PG的高可用方案patroni + etcd + pg 的环境部署实施。
2.方案简介
2.2Patroni 简介
Patroni基于Python开发的模板,结合DCS(例如 ZooKeeper, etcd, Consul )可以定制PostgreSQL高可用方案。
Patroni并不是一套拿来即用的PostgreSQL高可用组件,涉及较多的配置和定制工作。
Patroni接管PostgreSQL数据库的启停,同时监控本地的PostgreSQL数据库,并将本地的PostgreSQL数据库信息写入DCS。
Patroni的主备端是通过是否能获得 leader key 来控制的,获取到了leader key的Patroni为主节点,其它的为备节点。
2.3Etcd 简介
Etcd是一款基于Raft算法和协议开发的分布式 key-value 数据库,基于Go语言编写,Patroni监控本地的PostgreSQL状态,并将相关信息写入Etcd,每个Patroni都能读写Etcd上的key,从而获取外地PostgreSQL数据库信息。
当Etcd的leader节点不可用时,Etcd会一致性的选择一个合适的节点作为主节点,新的Etcd主节点将获取leader key,因此建议Etcd集群为三个以上且为奇数的节点,不建议部署在同一个机房,有条件话尽量部署在三个机房。
一个标准的3节点etcd集群,最大容许1个节点故障。
3. patroni + etcd + pg 环境部署
3.1 环境资源规划
主机:CentOS 7.4 ,2C4G (测试环境,生产根据实际规划),3台腾讯云云服务器。
数据库:PostgreSQL 12.7
Python:3.6.8
Etcd:etcd-v3.4.7
Patroni:patroni 2.1.0
3.2 部署规划
主机 |
IP |
组件 |
备注 |
---|---|---|---|
master | 10.1.1.10 | PostgreSQL、Patroni、Etcd | 主节点 |
slave1 | 10.1.1.8 | PostgreSQL、Patroni、Etcd | 备节点1 |
slave2 | 10.1.1.16 | PostgreSQL、Patroni、Etcd | 备节点2 |
3.3 环境准备
3.3.1 修改3台主机名称并编辑hosts文件
3台主机分别执行:
#hostnamectl set-hostname master
#hostnamectl set-hostname slave1
#hostnamectl set-hostname slave2
3台主机/etc/hosts文件添加:
10.1.1.10 master
10.1.1.8 slave1
10.1.1.16 slave2
3.3.2 关闭主机防火墙
# systemctl stop firewalld.service
# systemctl disable firewalld.service
3.3.3 yum安装依赖包
#yum install python3 gcc python3-devel epel-release -y
3.4 安装配置PG主从环境
以下步骤3台主机节点执行
3.4.1 创建系统用户postgres
useradd postgres && echo "postgres" | passwd --stdin postgres
3.4.2 安装PG软件
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql12-server postgresql12-contrib
3.4.3 创建数据目录
mkdir /data1/pg_{data,bin,logs