前面介绍了 PostgreSQL 执行计划、视图与触发器、存储过程、索引、分区分表、事务与并发控制、主从复制、高可用方案相关的知识点,今天我将详细的为大家介绍 PostgreSQL 基于 Patroni 高可用架构相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
PostgreSQL 高可用
PostgreSQL 是一款功能,性能,可靠性都可以和国际上成熟的商业数据库相媲美的开源数据库。而且PostgreSQL的许可和生态完全开放,不被任何一个单一的公司或国家所操控,保证了使用者没有后顾之忧。国内越来越多的企业开始用PostgreSQL代替原来昂贵的国外商业数据库。
在部署PostgreSQL到生产环境中时,选择适合的高可用方案是一项必不可少的工作。本文介绍基于Patroni的PostgreSQL高可用的部署方法,供大家参考。
PostgreSQL的开源HA工具有很多种,下面几种算是比较常用的:
-
PAF(PostgreSQL Automatic Failomianver)
-
repmgr
-
Patroni
它们的比较可以参考: https://scalegrid.io/blog/managing-high-availability-in-postgresql-part-1/
其中 Patroni 不仅简单易用而且功能非常强大。今天就来详细介绍下基于 Patroni 实现的 PostgreSQL 的高可用架构部署及故障切换等。
Patroni 功能特性
-
支持自动failover和按需switchover
-
支持一个和多个备节点
-
支持级联复制
-
支持同步复制,异步复制
-
支持同步复制下备库故障时自动降级为异步复制(功效类似于MySQL的半同步,但是更加智能)
-
支持控制指定节点是否参与选主,是否参与负载均衡以及是否可以成为同步备机
-
支持通过
pg_rewind
自动修复旧主 -
支持多种方式初始化集群和重建备机,包括
pg_basebackup
和支持wal_e
,pgBackRest
,barman
等备份工具的自定义脚本 -
支持自定义外部callback脚本
-
支持REST API
-
支持通过watchdog防止脑裂
-
支持k8s,docker等容器化环境部署
-
支持多种常见DCS(Distributed Configuration Store)存储元数据,包括etcd,ZooKeeper,Consul,Kubernetes
因此,除非只有2台机器没有多余机器部署DCS的情况,Patroni是一款非常值得推荐的PostgreSQL高可用工具。下面将详细介绍基于Patroni搭建PostgreSQL高可用环境的步骤。更多关于 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。
实验环境
主要软件
-
CentOS 7.8
-
PostgreSQL 12
-
Patroni 1.6.5
-
etcd 3.3.25
机器和VIP资源
-
PostgreSQL
-
node1:192.168.234.201
-
node2:192.168.234.202
-
node3:192.168.234.203
-
-
etcd
-
node4:192.168.234.204
-
-
VIP
-
读写VIP:192.168.234.2
-
只读VIP:192.168.234.211
-
环境准备
所有节点设置时钟同步
yum install -y ntpdate
ntpdate time.windows.com && hwclock -w
如果使用防火墙需要开放postgres,etcd和patroni的端口。
-
postgres:5432
-
patroni:8008
-
etcd:2379/2380
更简单的做法是将防火墙关闭
setenforce 0
sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
systemctl disable firewalld.service
systemctl stop firewalld.service
iptables -F
etcd 部署
因为本文的主题不是etcd的高可用,所以只在node4上部署单节点的etcd用于实验。生产环境至少需要部署3个节点,可以使用独立的机器也可以和数据库部署在一起。etcd的部署步骤如下
安装需要的包
yum install -y gcc python-devel epel-release
安装etcd
yum install -y etcd
编辑etcd配置文件/etc/etcd/etcd.conf
, 参考配置如下
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.234.204:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.234.204:2379"
ETCD_NAME="etcd0"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.234.204:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.234.204:2379"
ETCD_INITIAL_CLUSTER="etcd0=http://192.168.234.204:2380"
ETCD_INITIAL_CLUSTER_TOKEN="cluster1"
ETCD_INITIAL_CLUSTER_STATE="new"
启动etcd
systemctl start etcd
设置etcd自启动
systemctl enable etcd
PostgreSQL + Patroni HA部署
在需要运行PostgreSQL的实例上安装相关软件
安装PostgreSQL
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
安装Patroni
yum install -y gcc epel-release
yum install -y python-pip python-psycopg2 python-devel
pip install --upgrade pip
pip install --upgrade setuptools
pip install patroni[etcd]
创建PostgreSQL数据目录
mkdir -p /pgsql/data
chown postgres:postgres -R /pgsql
chmod -R 700 /pgsql/data
创建Partoni service配置文件/etc/systemd/system/patroni.service
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target
[Service]
Type=simple
User=postgres
Group=postgres
#StandardOutput=syslog
ExecStart=/usr/bin/patroni /etc/patroni.yml
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
TimeoutSec=30
Restart=no
[Install]
WantedBy=multi-user.target
创建Patroni配置文件/etc/patroni.yml
,以下是node1的配置示例
scope: pgsql
names