暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Linux的patroni搭建标准

原创 Digital Observer 2024-11-28
363

作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师

第一部分 说明

得益于PostgreSQL的开源特性,越来越多的第三方集群管理软件填补了PostgreSQL在集群方面的易用性和可靠性,patroni+etcd提供了一系列的集群管理方案。etcd负责集群状态信息的存放,用来联系各个节点,patroni负责为集群提供高可用服务,两者的集合为PostgreSQL集群提供了故障转移的高可用服务,它不仅配置简单,而且功能丰富:
 支持手动和自动故障转移
 支持一主多从、级联复制
 支持同步、异步模式
 支持使用watchdog防止脑裂

1.1 前期准备

本文使用3个节点的部署规划(一主两从):

主机名 IP 端口 备注
node1 192.168.22.128 5432 主节点
node2 192.168.22.129 5432 从节点
node3 192.168.22.130 5432 从节点

操作系统:centos 7.8
pg版本:13

第二部分 操作步骤

2.1 关闭防火墙

关闭主机防火墙

# systemctl stop firewalld.service # systemctl disable firewalld.service

2.2 部署PostgreSQL及流复制环境

省略搭建步骤

2.3 部署etcd

在各个节点安装必要的依赖包及etcd软件

# yum install -y gcc python-devel epel-release # yum install -y etcd

编辑配置文件(以下列出了需要修改的参数,并以主节点为例)

# vim /etc/etcd/etcd.conf #[Member] ETCD_DATA_DIR="/var/lib/etcd/node1.etcd" ETCD_LISTEN_PEER_URLS="http://192.168.22.128:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.22.128:2379,http://127.0.0.1:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.22.128:2380" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.22.128:2379" ETCD_INITIAL_CLUSTER="node1=http://192.168.22.128:2380,node2=http://192.168.22.129:2380, node3=http://192.168.22.130:2380"

启动etcd集群,并设置开机自启动

# systemctl start etcd # systemctl enable etcd

2.4 部署python3

在各个节点部署python3。需要使用高版本的python来使用patroni服务,一般的linux环境内置了2.7版本的python环境,因此我们需要升级python,这里采用源码编译安装方式安装

# wget -c https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz # ./configure # make # make install

删除原2.7版本的软连接,添加新的软链接以使用python3

# rm -f /usr/bin/python # ln -s /usr/local/bin/python3 /usr/bin/python

2.5 部署patroni

在各个节点上部署patroni。安装必要的依赖包和patroni软件

# pip3 install psycopg2-binary -i https://mirrors.aliyun.com/pypi/simple/ # pip3 install patroni -i https://mirrors.aliyun.com/pypi/simple/

修改patroni配置文件(以主节点为例)

# vim /etc/patroni.yml scope: pgsql namespace: /pgsql/ name: pgsql_node2 restapi: listen: 192.168.22.128:8008 connect_address: 192.168.22.128:8008 etcd: host: 192.168.22.128:2379 bootstrap: # this section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster # and all other cluster members will use it as a `global configuration` 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" # archive_mode: "on" # archive_timeout: 1800s # archive_command: gzip < %p > /data/backup/pgwalarchive/%f.gz # recovery_conf: # restore_command: gunzip < /data/backup/pgwalarchive/%f.gz > %p postgresql: listen: 0.0.0.0:5432 connect_address: 192.168.22.128:5432 data_dir: /pgdata/patr2 bin_dir: /usr/pgsql-12/bin # config_dir: /etc/postgresql/9.6/main authentication: replication: username: repl password: repl superuser: username: postgres password: postgres #watchdog: # mode: automatic # Allowed values: off, automatic, required # device: /dev/watchdog # safety_margin: 5 tags: nofailover: false noloadbalance: false clonefrom: false nosync: false

配置patroni服务单元

# vim /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服务

# systemctl start patroni

当然,我们也可以直接使用patroni命令来启动patroni服务,配置服务单元是为了更方便使用。

#/usr/local/bin/patroni /etc/patroni.yml > patroni.log 2>&1 &

第三部分 集群使用

3.1信息查看

查看集群内节点信息

# patronictl -c /etc/patroni.yml list + Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+---------------------+--------+---------+----+-----------+ | pgsql_node1 | 192.168.22.128:5432 | Leader | running | 3 | | | pgsql_node2 | 192.168.22.129:5432 | | running | 3 | 0 | | pgsql_node3 | 192.168.22.130:5432 | | running | 3 | 0 | +-------------+---------------------+--------+---------+----+-----------+

3.2手动切换主备

选择某一可用的从节点,使其成为主节点角色

# patronictl -c /etc/patroni.yml switchover Master [pgsql_node1]: pgsql_node1 Candidate ['pgsql_node2', 'pgsql_node3'] []: pgsql_node2 When should the switchover take place (e.g. 2021-06-20T11:42 ) [now]: now

查看集群状态

# patronictl -c /etc/patroni.yml list + Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+---------------------+--------+---------+----+-----------+ | pgsql_node1 | 192.168.22.128:5432 | | running | 3 | 0 | | pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3 | | | pgsql_node3 | 192.168.22.130:5432 | | running | 3 | 0 | +-------------+---------------------+--------+---------+----+-----------+

3.3自动切换主备

重启node1节点所在主机。查看集群状态,node2自动提升为主,如果只是关闭节点实例,则patroni会再将数据库服务自动拉起。

# patronictl -c /etc/patroni.yml list + Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+---------------------+--------+---------+----+-----------+ | pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3 | | | pgsql_node3 | 192.168.22.130:5432 | | running | 3 | 0 | +-------------+---------------------+--------+---------+----+-----------+

3.4初始化节点

当某一节点与主库不同步,或者节点异常运行时,可以使用此方法初始化节点信息以重新加入集群。

# patronictl -c /etc/patroni.yml reinit pgsql + Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+---------------------+--------+---------+----+-----------+ | pgsql_node1 | 192.168.22.128:5432 | | running | 3 | 0 | | pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3 | | | pgsql_node3 | 192.168.22.130:5432 | | running | 3 | 0 | +-------------+---------------------+--------+---------+----+-----------+ 选择以下需要添加的节点名称:pgsql_node3 你确定要重新初始化成员 pgsql_node3?[y/N]:y 成功:为成员pgsql_node3执行初始化

hhh6.jpg

最后修改时间:2024-11-28 14:26:07
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论