PostgreSQL数据库主备切换(switchover和failover)
pg数据库主备切换,两种方式,switchover和failover
一.Switchover
对于Oracle来说,切换主备的过程叫switchover,命令比较复杂,PostgreSQL数据库切换的操作比较简单
• 先停主库,再停备库
• 在原主库的数据目录中见文件 “standby.signal”(如果是PostgreSQL12之前的版本是recover.conf),并配置连接新主库的流复制参数。
• 把源备库数据目录下的文件“standby.signal”重命名或者删除
• 启动原备库,这时变成了新主库
• 启动原主库,这时变成了新备库
演示切换过程
主库停库
pg_ctl stop
备库停库
pg_ctl stop
主库上建文件standby.signal
touch $PGDATA/standby.signal
主库在 postgresql.conf中添加如下内容 这里ip写新主库的ip
primary_conninfo = 'user=postgres password=postgres host=192.168.1.218 port=5432 sslmode=prefer sslcompression=0'
如果是PostgreSQL12之前的版本,需要创建 recovery.conf 文件,内容如下
standby_mode = 'on'
primary_conninfo = 'user=postgres password=postgres host=192.168.1.218 port=5432 sslmode=disable sslcompression=1'
把备库的 standby.signal 重命名或删除(这里进行了重命名,方面后续切换回去)
mv standby.signal bak.standby.signal
新主库启动数据库
pg_ctl start
查看该数据库是否是主库 f是主库 t是备库
select pg_is_in_recovery();
重新查看视图,查看新备库过来的连接
select client_addr,state,sync_state from pg_stat_replication;
二.Failover
通常故障切换成为 Failover。异步复制时,如果主库出现了问题,可以激活备库作为主库提供服务。在9.1版本之前是在 recovery.conf 中配置一个trigger文件,当备库检测到该文件时,就自动把自己激活成主库,9.1版本之后提供了命令 pg_ctl promote来激活备库,所以现在很少有人配置trigger文件的方式激活备库了
原主库出现问题后,通常这些故障并没有导致数据丢失,如宕机、机器重启的故障。当故障解决之后,通常我们会把原主库转换成新主库的Standby备库,该转换一般来说需要重新搭建备库。这是因为原主库的一些数据没有同步过去就把备库激活了,备库相当于丢失了一些数据。而重新搭建备库的话,如果数据库很大,基础备份会执行很长时间,为了解决这个问题,从PostgreSQL9.5版本开始提供pg_rewind命令,不需要复制太多的数据就可以把原主库转换成新主库的备库。该命令相当于把原主库的数据“回滚”到新主库激活时的状态,当然这里所说的“回滚”不是真的“回滚”,只是为了让我们更好地理解pg_rewind的作用。
使用pgrewind命令要求主库必须把参数“wal_log_hints”设置成“on”或主库在建数据库实例时打开了checksum,这样配置的主库在出现故障时才能使用pg_rewind命令。当然这样做之后,数据库会产生更多的WAL日志,所以数据库默认是没有打开checksum参数的,数据库实例打开checksum参数的方法是,在用initdb命令初始化数据库实例时使用“k”“–data-checksums”参数。
如果我们没有把参数“wal log hints”或“checksum”打开,运行pg rewind时会报错
接下来演示pg_rewind的使用方法。
现在是主库是 192.168.1.218 备库是192.168.1.217
模拟主库宕机,直接关机。现在激活备库 在217上面执行命令
pg_ctl promote
现在217已经变成了主库,然后把原主库开机,在218上面执行pg_rewind命令
pg_rewind -D $PGDATA --source-server='host=192.168.1.217 user=postgres password=postgres'
pg_rewind执行完成后,手动建文件 standby.signal
touch $PGDATA/standby.signal
在 postgresql.conf中添加以下内容
primary_conninfo = 'user=postgres password=postgres host=192.168.1.217 port=5432 sslmode=prefer sslcompression=0'
启动数据库
pg_ctl start
更多推荐
所有评论(0)