0x10 - PostgreSQL 安装之 CentOS7 + Patroni
PostgreSQL + CentOS7 + Patroni
背景
PostgreSQL 的高可用环境
环境
- CentOS 7
- pg01 (192.168.1.120)
- pg02 (192.168.1.121)
- pg03(192.168.1.122)
- PostgreSQL 11.2
- Patroni 1.6.0
- Python 2.7
- etcdctl version: 3.3.11,API version: 2
- 有效的时钟同步服务
安装配置 etcd 服务
在每个节点上安装服务,配置成集群模式。
参考内链:ETCD 集群安装
参考外链:ETCD 集群安装
安装配置 patroni 服务
- 注意:所有的操作都是在 root 用户下运行。
- 注意:在三个节点上都需要安装并进行配置。
准备数据目录
这个目录就是数据库存放数据的位置,根据实际需要进行配置。
mkdir -p /opt/data/patroni chown -R postgres:postgres /opt/data chmod -R 700 /opt/data
安装软件包
yum install -y gcc python-devel epel-release yum install -y python2-pip pip install --upgrade setuptools pip install psycopg2-binary pip install python-etcd pip install patroni
配置启动脚本
为 patroni 服务创建启动脚本:vi /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 ExecStart=/bin/patroni /etc/patroni.yml KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.targ
禁止 postgresql 的自启动,使用 patroni 来管理
# 关闭 postgresql 的自动启动配置 systemctl disable postgresql-11
配置启动文件
创建配置文件 vi /etc/patroni.yml ,这个文件控制 postgresql 实例的启动关闭等等。
- 留意配置文件上:password 的值需要加上单引号。
第一个节点的配置:192.168.1.120 - pg01
scope: postgres name: pg01 restapi: listen: 192.168.1.120:8008 connect_address: 192.168.1.120:8008 etcd: host: 192.168.1.120:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replica 127.0.0.1/32 md5 - host replication replica 192.168.1.120/0 md5 - host replication replica 192.168.1.121/0 md5 - host replication replica 192.168.1.122/0 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: 192.168.1.120:5432 bin_dir: /usr/pgsql-11/bin connect_address: 192.168.1.120:5432 data_dir: /opt/data/patroni pgpass: /tmp/pgpass authentication: replication: username: replica password: 'replica' superuser: username: postgres password: '123456' parameters: unix_socket_directories: '.' tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
第二个节点的配置:192.168.1.121 - pg02
scope: postgres name: pg02 restapi: listen: 192.168.1.121:8008 connect_address: 192.168.1.121:8008 etcd: host: 192.168.1.121:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replica 127.0.0.1/32 md5 - host replication replica 192.168.1.120/0 md5 - host replication replica 192.168.1.121/0 md5 - host replication replica 192.168.1.122/0 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: 192.168.1.121:5432 bin_dir: /usr/pgsql-11/bin connect_address: 192.168.1.121:5432 data_dir: /opt/data/patroni pgpass: /tmp/pgpass authentication: replication: username: replica password: 'replica' superuser: username: postgres password: '123456' parameters: unix_socket_directories: '.' tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
第三个节点的配置:192.168.1.122 - pg03
scope: postgres name: pg03 restapi: listen: 192.168.1.122:8008 connect_address: 192.168.1.122:8008 etcd: host: 192.168.1.122:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true initdb: - encoding: UTF8 - data-checksums pg_hba: - host replication replica 127.0.0.1/32 md5 - host replication replica 192.168.1.120/0 md5 - host replication replica 192.168.1.121/0 md5 - host replication replica 192.168.1.122/0 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: 192.168.1.122:5432 bin_dir: /usr/pgsql-11/bin connect_address: 192.168.1.122:5432 data_dir: /opt/data/patroni pgpass: /tmp/pgpass authentication: replication: username: replica password: 'replica' superuser: username: postgres password: '123456' parameters: unix_socket_directories: '.' tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
启动并验证服务
现在我们可以启动 patroni 服务,它会在后台创建新的数据库,根据配置文件( /etc/patroni.yml )里面的内容创建用户。
注意:这里建议不要设置开机自启动,因为不需要,手动调试的时候就手动启动,如果宕机了,需要手动处理之后再启动。
# 启动服务(会自动启动 pg 实例) systemctl start patroni # 关闭服务(会自动关闭 pg 实例) systemctl stop patroni # 查看集群状态 patronictl -c /etc/patroni.yml list [root@postgres0 patroni]# patronictl -c /etc/patroni.yml list +----------+--------+---------------+--------+---------+----+-----------+ | Cluster | Member | Host | Role | State | TL | Lag in MB | +----------+--------+---------------+--------+---------+----+-----------+ | postgres | pg01 | 192.168.1.120 | Leader | running | 1 | 0.0 | | postgres | pg02 | 192.168.1.121 | | running | 1 | 0.0 | | postgres | pg03 | 192.168.1.122 | | running | 1 | 0.0 | +----------+--------+---------------+--------+---------+----+-----------+
你可以在 /var/log/messages 里面看到启动信息,也可以通过命令查看启动信息()。
JDBC连接
PG的 jdbc 中有一个targetServerType参数,设置这里,它会自动寻找 master 节点,也就是可以写入数据的节点。
jdbc:postgresql://192.168.1.120:5432,192.168.1.121:5432,192.168.1.122:5432/test1?targetServerType=master&user=postgres&password=123456
Patroni 命令
# 可以查看命令的使用说明 patronictl --help # 查看版本号 patronictl -c /etc/patroni.yml version # 查看所有成员信息 patronictl -c /etc/patroni.yml list # 重新加载配置 patronictl -c /etc/patroni.yml reload # 移除集群,重新配置的时候使用 patronictl -c /etc/patroni.yml remove postgres # 重启数据库集群 patronictl -c /etc/patroni.yml restart postgres # 切换 Leader,将一个 slave 切换成 leader。 patronictl -c /etc/patroni.yml switchover
参考文档
利用Restful API 动态修改数据库属性
https://patroni.readthedocs.io/en/latest/dynamic_configuration.html#dynamic-configuration
官方文档
https://patroni.readthedocs.io/en/latest/
JDBC参数,如何使用HA环境。
https://jdbc.postgresql.org/documentation/head/connect.html
本文来自博客园,作者:duchaoqun,转载请注明原文链接:https://www.cnblogs.com/duchaoqun/p/12058010.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?