KingbaseES V8R6 集群中复制槽非活跃状态的可能原因
背景
此问题环境是一主五备物理集群,其中node1是主节点,node2,3是集群同步节点,node4,5是集群异地异步节点,由于异地和主节点不同网段,网速非常慢。
kdts-plus工具纯迁数据,每分钟3G数据左右,单机迁移到集群主库再同步到备库。
问题现象:node4,5的复制槽active字段非活跃状态,lsn_lag过大,大于650GB且延迟间隙还在增长,restart_lsn过于陈旧。

备库有如下报错:
could not receive data from WAL stream: ERROR: requested WAL segment 0000000B000003C40000005E has already been removed
可能原因:
1、迁移过程中主库产生大量wal日志导致磁盘满,经了解前端人员手工删除wal日志,这个误操作导致流复制中断,repmgr cluster show命令查看 node4,5异地节点和集群主库失去通讯,从而导致复制槽失效非活跃状态。
2、设置了wal_keep_segments,由于备库同步速度很慢,导致备库落后于主库设置的wal_keep_segments保留的wal日志,则主库可能就删除备库需要的wal日志,导致备库node4,5节点流复制中断。
主备流复制关键参数说明和复制槽说明
wal_keep_segments:设置为较大值,保证pg_wal目录下保留较多的wal日志,主库上wal日志留存越多,允许备库宕机的时间越长,设置此参数需要注意不要将pg_wal目录撑满。或者在主库上开启归档,如果没有足够的硬盘空间保留wal归档,至少在备库停机维护时临时开启主库归档。如果备库落后主库wal_keep_segments数量的wal,则主库可能会删除备用服务器仍需要的wal,这种情况下,流复制就会中断。
hot_standby_feedback:备库定时将最小活跃事务ID(xmin)告诉master,使得 master在执行vacuum 时对备库还需要的tuple进行保留,但这样可能会导致主库膨胀,在每个wal_receiver_status_interval定义的周期内发送的频率不超过一次,并且此设置不会覆盖在主数据库上的old_snapshot_threshold行为。当设置这个参数后,pg_replication_slots视图可以看到xmin值,表示备库进行查询的快照版本。
max_standby_streaming_delay:通常会将一些执行时间较长的分析任务、统计SQL跑在备库上。在备库上执行长时间的查询,由于涉及的记录有可能在主库上被更新或删除,主库上对更新或删除数据的老版本进行vacuum后,备库上也会执行这个操作,从而与备库上的当前查询产生冲突。此参数默认为30s,当备库执行SQL时,有可能与正在应用的WAL发生冲突,此查询如果30s没有执行完就被中止,注意30s不是备库上单个查询允许的最大执行时间,是指当备库上应用WAL时允许的最大WAL延迟应用时间,因此备库上查询的执行时间有可能不到这个值就被中止了,此参数可以设置为-1,表示当从库上的WAL应用进程与从库上执行的查询冲突时,WAL日志一直等待直到从库查询执行完成。这个参数不好计量。
old_snapshot_threshold:单位为min,最大可以设置为60天,当vacuum回收垃圾时,遇到垃圾记录的xmax大于数据库中现存的最早未提交事务xmin时,不会对其进行回收。因此当数据库中存在很久为结束的事务时,可能会导致数据库膨胀。此参数意义是强制删除为过老的事务快照保留的死元组。这会导致长事务无法读取已被删除的事务快照。
vacuum_defer_cleanup_age:指定vacuum延迟清理死亡元组的事务数,vacuum会延迟清除无效的记录,延迟的事务个数通过vacuum_defer_cleanup_age参数进行设置。默认为0,在主库上设置一个稍大的值也可以减少冲突的发生,但是这个参数并不好计量设置多大。
max_standby_archive_delay:备库因为处理归档的wal日志产生查询冲突而取消查询之前的等待时间,和上面的参数类似。
recovery_min_apply_delay:延迟备库设置备库延迟重做WAL的时间,而备库依然及时接收主库发送的WAL日志流,只是不是一接收到WAL后就立即应用,而是等待此参数设置的值再应用。使用此功能将延迟hot_standby_feedback,当synchronous_commit设置为remote_apply时,同步复制也会受此设置的影响,每个commit都需要等待。
复制槽作用:
以上很多参数,只有在主备集群正常时才能起到作用,而replication slot能够确保在主备断连后主库的wal仍不被清理,因为replication slot的状态信息是持久化保存的,即使备库断掉或主库重启,这些信息仍然不会丢掉或失效。
replication slots主要是提供了一种自动化的方法来确保主库在所有的备库收到wal日志之前不会删除它们,并且主库也不会移除可能导致复制冲突的行(需要配合hot_standby_feedback使用),即使备库断开也是如此。
在没有启用replication slots的环境中,如果碰到 ERROR: requested WAL segment xxxx has already been removed 的错误,解决办法是要么提前开启了归档,要么重做备库,另外还可以在主库上设置wal_keep_segments 为更大的值。当然,如果备库停机时间太长,可能主库的WAL日志目录会被撑满,如果设置了复制槽,建议将WAL日志目录放在大容量硬盘上。
以上有些流复制有关的参数可能与本案无关,但这些都是需要掌握的,非常重要的参数。
解决措施
我们分析一下。如果把迁移速度降下来,复制槽重建,重新开始迁移并传输,这种情况同步的wal日志速度要快于迁移产生的wal速度,假如wal日志传输速度很慢,则又会出现主库产生大量wal导致磁盘满,因为未同步的wal日志在主库保留。
所以网络问题没有解决的前提,这个方案行不通,因为异地的同步速度太慢了。目前看lsn_lag有800GB以上。
换个解决方案
停掉异地备库node4,5节点,迁移完再克隆备库。这样就不会由于网络原因导致主库wal日志占用的磁盘空间满。node2,3节点是集群同网段,不存在网络延迟,所以理论上可以跟得上迁移速度。主库会根据检查点自动清理wal日志,不能手工删除wal日志。
复制槽视图sys_replication_slots中restart_lsn意思就是主库checkpoint的时候不会删除这个lsn之后的wal日志,以及过早的归档出去,为备库保留着。
如果restart_lsn不变了就说明没收到备库的reply,复制槽不活动,造成主库会一直保留本地日志,可能导致日志磁盘满。如果发现wal日志不同步了,node4,5的节点和主库失去连接。这时需要查看备库集群日志和主库失去连接的原因,node4,5的数据库日志。
可与i设置较小的wal_sender_timeout,默认为60s,及早发现备库断掉的情况。
总结
1.可以增加wal日志个数的监控,当wal日志数量超过正常值则告警,不要手工删除主库wal日志。
2.做好对每个复制槽同步状态的监控,出现某个槽同步状态异常要及时处理,同步异常会造成lsn不向前推进,导致主库wal堆积。
3.增加pg_replication_slot视图中restart_lsn的监控,对于落后较大和长期不推进的lsn进行告警,说明主库wal堆积。
KingbaseES V8R6 集群中复制槽非活跃状态的可能原因的更多相关文章
- KingbaseES V8R6集群维护之--修改数据库服务端口案例
案例说明: 对于KingbaseES数据库单实例环境,只需要修改kingbase.conf文件的'port'参数即可,但是对于KingbaseES V8R6集群中涉及到多个配置文件的修改,并且在应 ...
- KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例
案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...
- KingbaseES V8R6集群维护案例之---停用集群node_export进程
案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...
- KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障
案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...
- kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份
案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...
- KingbaseES V8R6集群外部备份案例
案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...
- KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例
案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...
- KingbaseES V8R6 集群环境wal日志清理
案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
- KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)
案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...
随机推荐
- Laravel入坑指南(7)——中间件Middleware
Laravel框架中引入了"中间件"这个概念,笔者觉得不是太合适.这里的Middleware和Java Servlet中的过滤器(Filter)就是一个东西,但是想比之下Filte ...
- HTML前置知识
1.概念 HTML:超文本标记语言 (英语:Hypertext Markup Language,简称:HTML ) 创建网页的标准标记语言 后缀:html,htm(两者没有区别) html语法对大小写 ...
- centos7 搭建snmpv3靶场
安装文件 yum install net-snmp net-snmp-utils -y 关闭服务创建用户 systemctl stop snmpd # 添加一个用户 如 root net-snmp-c ...
- Apipost参数描述的填写和参数描述库的使用
请求参数的描述填写 对于header.query以及form-data和urlencode的body参数,我们在如下地方填写参数描述: 如图中所示,对于一个填写过的参数,我们可以在新建接口可以通过点击 ...
- kubernetes(k8s)大白学习01-kubernetes是什么?有什么用?
kubernetes(k8s)大白基础学习-kubernetes是什么? 一.认识 Docker Docker 是什么 先来看看 Docker 的图标: 一条鲸鱼背上驮着四方形块的物品,就像一条海运船 ...
- 如何避免Git合并远程分支时出现可读性差的日志
问题及现象 当某一分支(假设为main)的本地仓库和远程仓库都基于同一个提交进行了修改,并分别创建了新的提交时,在本地执行git push origin main会提示先要执行git pull合并远程 ...
- 用Docker搭建DNS服务器
0.准备工作 如果是全新安装的服务器,先要给root账户设置密码,命令是 sudo passwd root 然后切换到root账户 su root 上述过程屏幕输出如下 1.Docker-Compos ...
- SSH不对称密钥自动登入服务器
SSH不对称密钥自动登入服务器 1.先在自己的电脑上创建密钥对 ssh-keygen -t rsa Windows下生成SSH密钥 $ ssh-keygen -t rsa -C "youre ...
- 第123篇: JS函数属性与方法
好家伙,本篇为<JS高级程序设计>第十章"函数"学习笔记 ECMAScript 中的函数是对象,因此有属性和方法. 1.函数属性 每个函数都有两个属性:length 和 ...
- JS中Date和时间戳转换
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...