Postgres主从(3)各种问题场景处理

本文详细介绍了在不同故障场景下,如何利用Repmgr工具进行PostgreSQL集群的故障恢复和角色切换,包括主从服务器宕机、网络故障等场景的具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Repmgrd宕机

主从上的Repmgrd宕机不影响服务运行,及时启动即可

仅在repmgrd宕机后发生再发生PG或服务器宕机,则无法正常切换

从服务器宕机

前置状态

  • 3为主服务器
  • 2为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景

2服务器宕机

通过停止reboot操作系统模拟该场景

预期结果

主和VIP能够正常访问和写入数据

检查VIP状态

通过VIP6访问PG,验证是否正常

后续手动操作

1启动数据库
2检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
3注册为从

在从2和主3上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | standby |   running | emppgs03 | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

从数据库服务宕机,服务器正常

前置状态

  • 3为主服务器
  • 2为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景

从2数据库服务宕机,服务器正常

通过停止数据库模拟该场景

预期结果

主和VIP能够正常访问和写入数据

检查VIP状态

通过VIP6访问PG,验证是否正常

后续手动操作

1启动数据库

启动从2数据库服务

2检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
3注册为从

在从2和主3上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | standby |   running | emppgs03 | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

从服务器网络故障

前置状态

  • 3为主服务器
  • 2为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景1

3服务器与外界网络断开

通过防火墙或腾讯云安全组模拟
3服务器只允许访问22端口入站,不限制任何出站
2服务器不限制任何出入站

预期结果1

2由于和3网络不通,认为3宕机,认为自己成为主,但由于无法从3拿到VIP,实际上无法对外提供服务

实际上仍然由3作为主,并具有VIP

模拟场景2

3服务器与外界网络断开后恢复正常

预期结果2

仍然由3作为主,并具有VIP

检查VIP状态

通过VIP6访问PG,验证是否正常

恢复后续手动操作

手动将2变为从并跟随主3

1从主3克隆数据到2

2的数据库实例必须先关闭

删除数据库实例data下所有数据

注意不要删除/data/pgdata10文件夹,否则重新创建该文件夹并给postgres用户授权

rm -rf /data/pgdata10/*

测试能否使用主服务器进行clone

su postgres

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --dry-run

如果未出现Error,执行Clone

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --fast-checkpoint

注:pgdat下所有文件如postgresql.conf, postgresql.auto.conf, pg_hba.conf和pg_ident.conf都将被拷贝,可能需要手动修改其中的配置

修改完PostgreSQL的配置文件后,启动3的PG服务

2检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
3注册为从
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register

如果因节点已存在而失败,强制注册

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register --force

在从2和主3上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | standby |   running | emppgs03 | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2


4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

主服务器宕机

前置状态

  • 3为主服务器
  • 2为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景

3服务器宕机

通过停止reboot操作系统模拟该场景

预期结果

30秒后2自动提升为主并对外服务

1.检查集群节点状态

在新主2服务器上检查

su postgres
# 查询集群节点状态
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  cluster show

预期结果:

2服务器 role为primary,status为* running,例如

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | primary | * running |          | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | - failed  |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

2.检查VIP状态

通过VIP6访问PG,验证是否正常

后续手动操作

手动将老主3变为从并跟随新主2

1从新主2克隆数据到旧主3

旧主3的数据库实例必须先关闭

删除数据库实例data下所有数据

注意不要删除/data/pgdata10文件夹,否则重新创建该文件夹并给postgres用户授权

rm -rf /data/pgdata10/*

测试能否使用主服务器进行clone

su postgres

repmgr -h 10.8.1.2 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --dry-run

如果未出现Error,执行Clone

repmgr -h 10.8.1.2 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --fast-checkpoint

注:pgdat下所有文件如postgresql.conf, postgresql.auto.conf, pg_hba.conf和pg_ident.conf都将被拷贝,可能需要手动修改其中的配置

修改完PostgreSQL的配置文件后,启动3的PG服务

2检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
3注册为从
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register

如果因节点已存在而失败,强制注册

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register --force

在从3和主2上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | primary | * running |          | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | standby |   running | emppgs02 | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

主数据库宕机,服务器正常

前置状态

  • 2为主服务器
  • 3为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景

2数据库宕机后,2服务器正常

通过停止pg服务模拟该场景

预期结果

30秒后3自动提升为主并对外服务

1.检查集群节点状态

在新主3服务器上检查

su postgres
# 查询集群节点状态
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  cluster show

预期结果:

3服务器 role为primary,status为* running,例如

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | primary | - failed  |          | default  | host=emppgs02 user=repmgr dbname=repmgr                  
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

2.检查VIP状态

通过VIP6访问PG,验证是否正常

后续手动操作

手动将老主变为从并跟随新主

1从新主3克隆数据到旧主2

旧主2的数据库实例必须先关闭

删除数据库实例data下所有数据

注意不要删除/data/pgdata10文件夹,否则重新创建该文件夹并给postgres用户授权

rm -rf /data/pgdata10/*

测试能否使用主服务器进行clone

su postgres

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --dry-run

如果未出现Error,执行Clone

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --fast-checkpoint

注:pgdat下所有文件如postgresql.conf, postgresql.auto.conf, pg_hba.conf和pg_ident.conf都将被拷贝,可能需要手动修改其中的配置

修改完PostgreSQL的配置文件后,启动2的PG服务

2检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
3注册为从
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register

如果因节点已存在而失败,强制注册

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register --force

在从2和主3上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | standby |   running | emppgs03 | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2

4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

主服务器网络故障

前置状态

  • 2为主服务器
  • 3为从服务器
  • VIP为6,主服务器才能具备VIP

模拟场景

  • 2服务器与外界网络断开

    通过防火墙或腾讯云安全组模拟
    2服务器只允许访问22端口入站,不限制任何出站
    3服务器不限制任何出入站

  • 2服务器与3之间断开。2和3可以正常访问其他主机

预期结果

30秒后3自动提升为主并对外服务

1.检查集群节点状态

在新主3服务器上检查

su postgres
# 查询集群节点状态
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  cluster show

预期结果:

3服务器 role为primary,status为* running,例如

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | primary | - failed  |          | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2


2.检查VIP状态

通过VIP6访问PG,验证是否正常

恢复后续手动操作

手动将老主2变为从并跟随新主3

从新主3克隆数据到旧主2

旧主2的数据库实例必须先关闭

删除数据库实例data下所有数据

注意不要删除/data/pgdata10文件夹,否则重新创建该文件夹并给postgres用户授权

rm -rf /data/pgdata10/*

测试能否使用主服务器进行clone

su postgres

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --dry-run

如果未出现Error,执行Clone

repmgr -h 10.8.1.3 -U repmgr -d repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf standby clone --fast-checkpoint

注:pgdat下所有文件如postgresql.conf, postgresql.auto.conf, pg_hba.conf和pg_ident.conf都将被拷贝,可能需要手动修改其中的配置

修改完PostgreSQL的配置文件后,启动3的PG服务

检查复制状态

主3服务器查询

SELECT * FROM pg_stat_replication;

从2服务器查询

SELECT * FROM pg_stat_wal_receiver
2注册为从
repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register

如果因节点已存在而失败,强制注册

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf  standby register --force

在从2和主3上查询状态

repmgr -f /opt/repmgr/4.0.5/etc/repmgr.conf cluster show

应看到类似如下信息

 ID | Name     | Role    | Status    | Upstream | Location | Connection string                                        
----+----------+---------+-----------+----------+----------+-----------------------------------------------------------
 2  | emppgs02 | standby |   running | emppgs03 | default  | host=10.8.1.2 user=repmgr dbname=repmgr connect_timeout=2
 3  | emppgs03 | primary | * running |          | default  | host=10.8.1.3 user=repmgr dbname=repmgr connect_timeout=2


4检查repmgrd状态

检查

ps -ef | grep repmgrd

如果进程不存在,启动repmgrd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值