PostgreSQL 流复制的主备切换

概述

流复制的主库和备库的角色不是静态存在的,在维护过程中可以对二者进行角色切换。例如当主库硬件故障或主库需要调整参数需要重启系统时,通常要进行流复制的主备切换。

如何判断主备角色

在通常的主备架构下(一主多备,级联除外)有以下五种方法判断主备角色

  • 1 操作系统上查看wal发送进程或wal接收线程

  • 2 数据库中查看pg_stat_replication表

  • 3 通过系统函数查看
    f说明是主库,t说明是备库

postgres=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)
  • 4 查看数据库控制信息
    通过pg_controldata命令,查看 Database cluster state一栏
    如果是in production ,说明是主库
Database cluster state:               in production
  • 5 通过recovery.conf 文件判断
    一般的,备库才有recovery.conf,主库一般没有或是改名为recovery.done

文件触发方式切换

在备库启动时在 recovery.conf 文件中加入一个触发文件的路径(新加则需要重启备库)

trigger_file='/pgdata/.postgresql.trigger.2019'

关闭主库

[postgres@GuangFa_PG9 pgdata]$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

在备库上创建那个刚刚新加的文件

[postgres@localhost pgdata]$ touch /pgdata/.postgresql.trigger.2019

可以看到备库上的recovery文件已经成为done了

-rw-rw-r--. 1 postgres postgres   239 Dec 25 21:50 recovery.done

此时备库已经被激活为主库,可以直接做读写操作了

[postgres@localhost pgdata]$ pg_controldata |grep cluster
Database cluster state:               in production

现在我们把原来的主库当做备库重新开始搭建主备,方法和之前一样
准备recovery.conf文件
指向原来的备库,再重启数据库即可

pg_ctl promote方式切换

在文件触发方式下,需要配置参数和创建文件,比较繁琐。自PG9.1版本以后有了一个命令支持主备切换,就是pg_ctl promote命令

切换步骤如下:
1)关闭主库,建议使用-m fast 模式关闭
2)在备库上使用pg_ctl promote命令,直接将备库切为主库
3)在老主库上配置recovery.conf 文件,启动
4)查看主备状态并查看进程

如下:

[postgres@GuangFa_PG9 pgdata]$ pg_ctl promote
server promoting
[postgres@GuangFa_PG9 pgdata]$ pg_controldata |grep cluster
Database cluster state:               in production

pg_rewind命令

首先我们先确认一下,使用这个命令的前提条件之一:

  • postgresql.conf 配置文件wal_log_hints参数值设为on
  • 数据库安装时通过initdb初始化数据库时使用了–data-checksums 选项

我们再来看一下这个命令的应用场景,在上述的两种方式的切换中,第二步都是关闭原主库,而且是强制关闭,因为关闭会有一个checkpoint的点。备库同步完成后,两边的数据是同样的一致性状态。这样原来的主很容易就能做新主的备库

但是如果在执行的过程中忘记了关闭主库,主库一直处于运行状态,那么这个旧主和新主在数据时间线上就不是一致的了。就会导致后续搭建备库失败

这个命令就是通过新主去同步旧主,使这两个库处于一致性的状态。类似于PG旧主的一次向前回滚。

是为了防止库级别太大,重搭建库过于麻烦。而出的一个命令

[postgres@GuangFa_PG9 pgdata]$ pg_rewind --help
pg_rewind resynchronizes a PostgreSQL cluster with another copy of the cluster.

Usage:
  pg_rewind [OPTION]...

Options:
  -D, --target-pgdata=DIRECTORY  existing data directory to modify
      --source-pgdata=DIRECTORY  source data directory to synchronize with
      --source-server=CONNSTR    source server to synchronize with
  -n, --dry-run                  stop before modifying anything
  -P, --progress                 write progress messages
      --debug                    write a lot of debug messages
  -V, --version                  output version information, then exit
  -?, --help                     show this help, then exit

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Docker PostgreSQL12 复制主从同步的配置和切换步骤: 1. 首先,在主数据中修改 postgresql.conf 和 pg_hba.conf 文件,分别设置复制相关参数和允许从服务器连接。 postgresql.conf 文件中需要设置以下参数: ``` wal_level = replica max_wal_senders = 5 wal_keep_segments = 32 ``` pg_hba.conf 文件中需要添加以下规则: ``` host replication all <从服务器IP地址>/32 md5 ``` 2. 重启动主服务器,使配置生效。 3. 在从服务器中创建一个空的目标数据,并且在 postgresql.conf 文件中设置以下参数: ``` hot_standby = on ``` 4. 使用 pg_basebackup 命令将主服务器上的数据复制到从服务器上: ``` pg_basebackup -h <主服务器IP地址> -U <用户名> -D /var/lib/postgresql/data -P --xlog-method=stream ``` 5. 在从服务器中创建一个 recovery.conf 文件,指定复制配置参数: ``` standby_mode = on primary_conninfo = 'host=<主服务器IP地址> port=<主服务器端口> user=<用户名> password=<密码>' ``` 6. 启动从服务器。 7. 可以使用 pg_ctl 命令来检查主从同步状态: ``` pg_ctl status -D /var/lib/postgresql/data ``` 8. 如果需要切换主从角色,需要在从服务器上执行以下步骤: - 在主服务器上停止 PostgreSQL 服务; - 在从服务器上编辑 recovery.conf 文件,修改 primary_conninfo 参数为从服务器的连接信息; - 在从服务器上启动 PostgreSQL 服务; - 验证从服务器是否已成为的主服务器。 希望这些步骤能够帮助到你,如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值