安装Patroni
前提条件1
升级python2.7到3.x
前提条件2
升级Pip到pip3:yum -y install python3-pip
前提条件3
后续的pip install 修改为pip3 install
1 主要软件
CentOS 7.8
PostgreSQL 13
Patroni 2.0
etcd 3.3.11
2 机器和VIP资源
PostgreSQL
node1:172.16.1.4
node2:172.16.1.5
etcd
node3:172.16.1.6
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://172.16.1.6:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://172.16.1.6:2379"
ETCD_NAME="etcd0"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.1.6:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.1.6:2379"
ETCD_INITIAL_CLUSTER="etcd0=http://172.16.1.6:2380"
ETCD_INITIAL_CLUSTER_TOKEN="cluster1"
ETCD_INITIAL_CLUSTER_STATE="new"
复制
启动etcd
systemctl start etcd
设置etcd自启动
systemctl enable etcd
4 PostgreSQL + Patroni HA部署
在需要运行PostgreSQL的实例上安装相关软件
安装PostgreSQL 13
此处省略
安装patroni
yum install -y gcc epel-release
yum install -y python3-pip python3-psycopg2 python3-devel
pip3 install --upgrade pip
pip3 install --upgrade setuptools
pip3 install patroni[etcd]复制
创建PostgreSQL数据目录
参考:
mkdir -p pgsql/data
chown postgres:postgres -R pgsql
chmod -R700 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/local/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: pgsql2 #这里为cluster的名字,所有节点一致
namespace: service/
name: pg1
restapi:
listen: 0.0.0.0:8008
connect_address: 172.16.1.4:8008
etcd:
host: 172.16.1.6:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
master_start_timeout: 300
synchronous_mode: false
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
listen_addresses: "0.0.0.0"
port: 5432
wal_level: logical
hot_standby: "on"
wal_keep_segments: 100
max_wal_senders: 10
max_replication_slots: 10
wal_log_hints: "on"
initdb:
- encoding: UTF8
- locale: C
- lc-ctype: zh_CN.UTF-8
- data-checksums
pg_hba:
- host replication repl 0.0.0.0/0 md5
- host all all 0.0.0.0/0 md5
postgresql:
listen: 0.0.0.0:5432
connect_address: 172.16.1.4:5432
data_dir: var/lib/pgsql/13/data
bin_dir: usr/pgsql-13/bin
authentication:
replication:
username: repl
password: "123456"
superuser:
username: postgres
password: "123456"
basebackup:
max-rate: 100M
checkpoint: fast
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
复制
其他PG节点的patroni.yml需要相应修改下面3个参数
name
node1~node2分别设置pg1~pg2
restapi.connect_address
根据各自节点IP设置
postgresql.connect_address
根据各自节点IP设置
启动Patroni
node1上启动Patroni
systemctl start patroni
初次启动Patroni时,Patroni会初始创建PostgreSQL实例和用户。这里要注意
[postgres@mdw ~]$ systemctl status patroni
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
Loaded: loaded (/etc/systemd/system/patroni.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2021-06-21 15:46:35 CST; 1h 10min ago
Main PID: 42203 (patroni)
Tasks: 15
CGroup: system.slice/patroni.service
├─42203 /usr/bin/python3 /usr/local/bin/patroni /etc/patroni.yml
├─42262 /usr/pgsql-13/bin/postgres -D /var/lib/pgsql/13/data --config-file=/var/lib/pgsql/13/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5432 --cluster_nam...
├─42263 postgres: pgsql2: logger
├─42268 postgres: pgsql2: checkpointer
├─42269 postgres: pgsql2: background writer
├─42270 postgres: pgsql2: stats collector
├─42274 postgres: pgsql2: postgres postgres 127.0.0.1(53198) idle
├─82780 postgres: pgsql2: walwriter
├─82781 postgres: pgsql2: autovacuum launcher
├─82782 postgres: pgsql2: logical replication launcher
└─83615 postgres: pgsql2: walsender repl 172.16.1.5(12810) streaming 0/30BC730
复制
node2上启动Patroni
node2将作为replica加入集群,自动从leader拷贝数据并建立复制。
[postgres@sdw1 ~]$ systemctl status patroni
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
Loaded: loaded (/etc/systemd/system/patroni.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2021-06-21 16:19:09 CST; 39min ago
Main PID: 105100 (patroni)
Tasks: 13
CGroup: /system.slice/patroni.service
├─105100 /usr/bin/python3 /usr/local/bin/patroni /etc/patroni.yml
├─105135 /usr/pgsql-13/bin/postgres -D /var/lib/pgsql/13/data --config-file=/var/lib/pgsql/13/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5432 --cluster_na...
├─105136 postgres: pgsql2: logger
├─105137 postgres: pgsql2: startup recovering 000000050000000000000003
├─105139 postgres: pgsql2: checkpointer
├─105140 postgres: pgsql2: background writer
├─105141 postgres: pgsql2: stats collector
├─105147 postgres: pgsql2: postgres postgres 127.0.0.1(63424) idle
└─105278 postgres: pgsql2: walreceiver streaming 0/30BC730
复制
查看集群状态
[postgres@sdw1 ~]$ patronictl -c /etc/patroni.yml list
Cluster: pgsql2 (6976148972338622213) --+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+--------+------------+---------+---------+----+-----------+
| pg1 | 172.16.1.4 | Leader | running | 5 | |
| pg2 | 172.16.1.5 | Replica | running | 5 | 0 |
+--------+------------+---------+---------+----+-----------+
复制
设置patronictl环境变量
echo'export PATRONICTL_CONFIG_FILE=/etc/patroni.yml' >/etc/profile.d/patroni.sh
复制
将 . /etc/profile.d/patroni.sh写入postgres的.bash_profile
成功完成!
报错处理
pip3 install patroni[etcd]的时候报错
psutil/_psutil_common.c:9:20: fatal error: Python.h:
No such file or directory compilation termi复制
需要安装依赖
yum install python3-devel复制
启动patronni报错:waiting for leader to bootstrap
Jun 21 15:35:35 sdw1 patroni: 2021-06-21 15:35:35,366 INFO: Lock owner: None; I am pg2
Jun 21 15:35:35 sdw1 patroni: 2021-06-21 15:35:35,372 INFO: waiting for leader to bootstrap复制
因为pg1 pg2这两个库我以前有搭建postgres13,上面有数据。所以需要把$PGDATA目录下的文件删除。
依次删除data目录,然后依次启动则正常。