Patroni是PostgreSQL可选的高可用方案中接受度最广的一种,特别是在2.0之后,Patroni可以使用raft协议来解决分布式的一致性问题,减少了对etcd或zookeeper的依赖,大大简化了安装和运维, 本篇介绍如何基于raft来构建一个最简单的HA集群。
patroni安装和准备
用pip来安装patroni,因为使用raft来进行分布式集群管理,所以依赖选择patroni[raft], 如果使用consul则用patroni[consul], 以此类推。
pip install patroni[raft]
因为是以非root用户安装,patroni及patronictl安装在 $HOME/.local/bin
加载softdog内核模块,避免出现类似错误信息 no such file or directory /dev/watchdog
sudo modprobe softdog
目录创建和权限修改
PostgreSQL数据目录
mkdir -p /tmp/patroni_raft/{inst_01,inst_02,inst_03}
cd /tmp/patroni_raft
chmod -R 0700 inst_01 inst_02 inst_03
raft数据目录
mkdir -p /tmp/raft/{inst_01,inst_02,inst_03}
patroni配置文件
scope: my-ha-cluster
name: pg-1
restapi:
listen: 0.0.0.0:8008
connect_address: 127.0.0.1:8008
raft:
data_dir: /tmp/raft/inst_01
self_addr: 127.0.0.1:5010
partner_addrs: ['127.0.0.1:5011','127.0.0.1:5012']
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
hot_standby: "on"
wal_keep_segments: 8
max_wal_senders: 5
max_replication_slots: 5
checkpoint_timeout: 30
initdb:
- encoding: UTF8
pg_hba:
- host all dba all md5
- host replication repl all md5
users:
dba:
password: yourcode
options:
- createrole
- createdb
repl:
password: yourcode
options:
- replication
postgresql:
listen: 0.0.0.0:5432
connect_address: 127.0.0.1:5432
data_dir: /tmp/patroni_raft/inst_01
config_dir: /tmp/patroni_raft/inst_01
bin_dir: /usr/local/pgsql/bin
authentication:
replication:
username: repl
password: secret
superuser:
username: dba
password: secret
parameters:
unix_socket_directories: '/tmp/patroni_raft/inst_01'
patroni运行
cp pg-1.yml pg-2.yml
cp pg-1.yml pg-3.yml
先把pg-2.yml和pg-3.yml中相应的配置修改一下,主要是节点名称和监听地址以及数据目录。
修改结束之后,用patroni拉起集群
cd /tmp/patroni_raft
~/.local/bin/patroni ./pg-1.yml
~/.local/bin/patroni ./pg-2.yml
~/.local/bin/patroni ./pg-3.yml
patroni状态检查
如果一切顺利,集群会被正常拉起, 为进一步确认集群状态,运行如下指令验证。
cd /tmp/patroni_raft
./local/bin/patronictl -c ./pg-1.yml list
正常的话,会显示如下信息
+ Cluster: my-ha-cluster (7016961673110130148) ----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+--------+----------------+---------+---------+----+-----------+
| pg-1 | 127.0.0.1:5432 | Replica | running | 1 | 0 |
| pg-2 | 127.0.0.1:5433 | Replica | running | 1 | 0 |
| pg-3 | 127.0.0.1:5434 | Leader | running | 1 | |
+--------+----------------+---------+---------+----+-----------+
连接PostgreSQL
在上面的输出中显示, master是pg-3,监听的端口是5434, 接下来可以连接到master并创建表写入数据进行测试
psql -Udba -dpostgres -h localhost -p 5434