postgresql13主从切换

1.主库(10.124.50.13)故障,停掉主库
systemctl stop pgsql.service

2.从库(10.124.50.14)提到主库

su - postgres

pg_ctl promote -D /data/pgsql-13.11/data

提升从库为主库之后,可以看到,后台进程中不再有startup recovering,以及walreceiver streaming进程了,同时多了postgres: walwriter 写进程;

$PGDATA/standby.signal文件自动消失了. 这是告诉PostgreSQL,我现在不再是备库了,我的身份是主库了

3.新主库(10.124.50.14)删除primary_conninfo条目

原来的主从状态

postgres=# show primary_conninfo;

primary_conninfo ------------------------------------------------------------

user=replica password=replica host=10.124.50.13 port=5432

(1 row)

然后将之前主从同步的信息删除掉,$PGDATA/postgresql.auto.conf文件中的primary_conninfo

systemctl reload pgsql.service

重载配置后后主从状态如下即可

postgres=# show primary_conninfo;

primary_conninfo ------------------

(1 row)

4.通过原主库(10.124.50.13)上nginx四层代理新主库(10.124.50.14)的地址,保持对外的地址不变,便于服务重连

此步骤结束后,服务即可恢复

5.新主库(10.124.50.14)修改pg_hba.conf文件,在其中添加允许新备库(原主库10.124.50.13)可以通过replica用户访问数据库的条目信息。

host replication all 10.124.50.13/32 md5

若之前就是以网段的方式开通的话,可以不需要修改,如下:

host replication replica 10.124.50.0/24 md5

systemctl reload pgsql.service

6.原主库清空data目录,重新同步数据

pg_basebackup -U replica -h 10.124.50.14 -p 5432 -F p -X s -v -P -R -D /data/pgsql-13.11/data/

7.手动启动新从库(10.124.50.14)

/data/pgsql-13.11/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300

会有如下报错,不用管它,第一次启动会进行数据初始化,时间非常久,观察端口和日志正常,等待数据初始化结束即可

2023-12-21 16:26:24.711 CST 1623307 00000LOG: redirecting log output to logging collector process

2023-12-21 16:26:24.711 CST 1623307 00000HINT: Future log output will appear in directory "pg_log".

pg_ctl: server did not start in time

8.修改原主库(10.124.50.13)的端口,启动数据库并检查主从状态

systemctl start pgsql.service

show primary_conninfo;

### PostgreSQL 主从架构在故障情况下的自动切换机制与配置方法 PostgreSQL主从架构通过流复制(Streaming Replication)实现数据同步,但在主节点发生故障时,需要一种机制来自动将从节点提升为主节点以保证服务的高可用性。这种机制通常依赖于外部工具或脚本来完成,例如使用 **Pgpool-II** 或 **Replication Manager** 等工具[^1]。 #### 1. 使用 Pgpool-II 实现主从自动切换 Pgpool-II 是一个中间件工具,可以管理 PostgreSQL 的连接池和高可用性。它支持主从切换,并且可以通过配置文件实现自动故障检测和切换。 - **配置关键点**: - 在 `pgpool.conf` 中启用 `health_check_period` 和 `failover_command` 参数。 - 设置 `failover_command` 来定义当主节点不可用时执行的命令,该命令会将某个从节点提升为主节点[^2]。 ```bash # pgpool.conf 配置示例 health_check_period = 10 # 每10秒检查一次主节点状态 failover_command = '/path/to/failover_script.sh %d %h %p %D %m %H' # 故障切换脚本 ``` - **故障切换脚本**: 编写一个脚本用于提升从节点为主节点。以下是一个简单的示例: ```bash #!/bin/bash # $1: failed node id # $2: failed node hostname # $3: failed node port # $4: database name # $5: new master node id # $6: new master node hostname # 将指定的从节点提升为主节点 psql -h $6 -c "SELECT pg_promote();" ``` #### 2. 使用 Patroni 实现主从自动切换 Patroni 是一个基于 Zookeeper、etcd 或 Consul 的高可用解决方案,专为 PostgreSQL 设计。它通过分布式协调系统来管理主从切换过程。 - **配置关键点**: - 在 Patroni 的配置文件中定义主从关系和故障切换策略。 - 使用 DCS(Distributed Configuration Store)来存储集群状态信息。 ```yaml # patroni.yml 示例 scope: postgres_cluster namespace: /db/ name: postgres0 restapi: listen: 0.0.0.0:8008 connect_address: 192.168.1.10:8008 etcd: host: 127.0.0.1:2379 postgresql: name: postgres0 scope: postgres_cluster listen: 0.0.0.0:5432 connect_address: 192.168.1.10:5432 data_dir: /data/postgres/9.6 pg_hba: - host replication replicator 192.168.1.0/24 md5 - host all all 0.0.0.0/0 md5 parameters: max_connections: 100 shared_buffers: 1GB wal_level: hot_standby max_wal_senders: 6 wal_keep_segments: 10240 archive_mode: 'on' archive_command: 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' ``` - **工作原理**: 当主节点不可用时,Patroni 会根据配置选择一个健康的从节点,并将其提升为主节点[^3]。 #### 3. 手动切换作为补充方案 在某些情况下,手动切换可能是更安全的选择。以下是手动切换的基本步骤: 1. 确认主节点已完全不可用。 2. 在从节点上执行 `pg_controldata` 命令检查其状态。 3. 使用 `pg_promote()` 函数将从节点提升为主节点。 ```sql SELECT pg_promote(); ``` 4. 更新客户端连接配置,指向新的主节点。 #### 4. 最佳实践 - **监控与告警**:使用监控工具(如 Prometheus 和 Grafana)对主从节点的状态进行实时监控,并设置告警规则。 - **定期测试**:定期测试主从切换流程,确保在实际故障发生时能够顺利切换。 - **备份策略**:即使有主从复制,也需要定期进行完整备份以防止数据丢失[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值