GaussDB xlog堆积故障处理
- 故障现象
单个或者多个DN xlog目录持续增大,长时间不回收,导致磁盘空间不足,当达到磁盘使用阈值时,DN会被自动设置为只读,业务不可用。
- 故障原因
可能原因有以下:
- xlog相关参数配置不合理。
- delay_xlog_recycle文件残留。
- 逻辑复制槽占用。
- 备份失败。
- 业务数据持续写入,xlog回收速率无法追赶上生成速率。
- 降副本后,被删除的副本还在复制槽列表中。
- 处理方法
步骤 1 登录DBS运维管理平台,
步骤 2 在实例管理-实例列表界面根据实例ID搜索到对应的实例,点击更多-实例监控,查看xlog数量监控指标。

如上图,展示全部节点的xlog数量监控指标。
步骤 3 登录故障的DN节点,进入到DN的数据目录,DN数据目录可通过查询集群状态获取,查看xlog个数。
cm_ctl query -Cvd

如上图,/opt/gaussdb/engine/data/dn_6001为dn_6001的数据目录。
ll /opt/gaussdb/engine/data/dn_6001/pg_xlog/ |wc -l

说明:
1. 公有云或者HCS场景进入数据目录需要进入沙箱或者数据目录前加/var/chroot。
2. /opt/gaussdb/engine/data/dn_6001/pg_xlog为示例DN数据目录,需根据实际情况修改。
步骤 4 gsql连接DN,查看集群当前xlog相关的参数。
gsql -d postgres -p 40000 -U user -W password -r -m
show checkpoint_segments;
show wal_keep_segments;
show max_size_for_xlog_prune;
show enable_xlog_prune;

参数说明:
checkpoint_segments:设置checkpoint_timeout周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。
wal_keep_segments:保留事务日志文件的最小数目。
当日志量达到一定量时,日志才会触发回收,该值的计算方式是:wal_keep_segments +checkpoint_segments * 2 + 1 ,假设checkpoint_segments设置128,wal_keep_segments设置128,日志量就是 (128 + 128 * 2 + 1)=385个。若该值设置很大,可能会导致磁盘占用过多。如果查询xlog数量不足该阈值且配置阈值过大,考虑调低以上参数。
max_size_for_xlog_prune:在enable_xlog_prune打开时生效,机制如下:
若有备机断连,当主机历史日志数量大于该参数值,会强制回收。
如果有任何一个备机正在build,那么该参数不会生效,主机日志会全量保留,防止build操作由于日志回收重复失败。
enable_xlog_prune:设置在任一备机断联时,主机是否根据xlog日志的大小超过参数max_size_for_xlog_prune的值而回收日志。
说明:
1. 分布式gsql连接DN,需要首先获取当前DN的端口号,集中式DN默认端口号为8000。
2. DN的端口号可通过cm_ctl query -Cvdp命令查询获取。
3. 如果连接备DN,需要gsql命令后需加“-m”参数。
若参数设置不合理,需重新设置参数,若需重新设置参数,联系华为技术支持。
若以上参数设置合理,继续执行以下步骤。
步骤 5 查看DN数据目录下是否有delay_xlog_recycle文件。
V500R001C10版本,当DN数据目录下有delay_xlog_recycle文件时,说明是备份失败导致,下一次备份成功,xlog回收会正常触发。
若非以上原因,继续执行以下步骤;
步骤 6 确认是否存在逻辑复制槽占用。
gsql -d postgres -p 40000 -U user -W password -r -m
select * from pg_get_replication_slots();
grep 'attempting to remove WAL segments older than log file' postgresql-yyyy-mm-dd_******.log

说明:
分布式gsql连接DN,需要首先获取当前DN的端口号,集中式DN默认端口号为8000。
如上图,逻辑复制槽replication的restart_lsn为4/8AE62280。

如上图,DN日志中的日志点一直为000000010000000400000088,未推进,这与逻辑复制槽的restart_lsn刚好一致,说明xlog不回收是由与逻辑复制槽阻塞,参考处理步骤1。
若有逻辑复制槽,确认对应的LSN是否为pg_log日志中attempting to remove WAL segments newer than log file对应的xlog编号,若对应,则说明为逻辑复制槽占用导致,需要清理逻辑复制槽解决,若不对应,继续向下执行。
若非以上原因,继续执行。
步骤 7 确认是否备份失败导致。
确认gs_roach占用的槽位的LSN是否为pg_log日志中attempting to remove WAL segments newer than log file对应的xlog编号。
select * from pg_get_replication_slots();
grep 'attempting to remove WAL segments older than log file' postgresql-yyyy-mm-dd_******.log


如上图中,gs_roach_full表示正在全备,gs_roach_inc表示正在增备。

如上图中,000000010000000500000081中的第二个8位,00000005于逻辑复制槽(/8800E250)中的5对应,如果备份任务流已失败,则xlog堆积是由于备份失败导致。
若是,则说明是备份失败导致,待下次备份正常触发则可以正常回收。
若不涉及,继续向下执行。
步骤 8 确认是否进行过降副本操作。
如果进行过降副本操作,登录xlog堆积的DN节点查询,确认删除的副本是否还在复制槽列表中,如果还在,说明降副本后复制槽没有删除,需要清理残留的复制槽,参考处理步骤1。
gsql -d postgres -p 40000 -U user -W password -r -m
select * from pg_get_replication_slots();

若非以上都不涉及,联系华为技术支持。
说明:
分布式gsql连接DN,需要首先获取当前DN的端口号,集中式DN默认端口号为8000。
步骤 9 当主DN存在导入数据等大批量业务时,备DN回放速度赶不上主DN xlog产生速度时,xlog短时间内也不会回收。
cm_ctl query -rv

步骤 10 删除逻辑复制槽。
select * from pg_drop_replication_slot('replication');
须知:删除逻辑复制槽为高危操作,执行前需联系华为技术支持确认。
步骤 11 上述场景不包含,联系华为技术支持。
----结束
- 快速恢复
1、当前xlog堆积,未达到磁盘使用阈值,业务无感知,满足快速恢复。
2、当xlog堆积,造成DN只读,快速恢复参考DN故障-状态ReadOnly。
- 点赞
- 收藏
- 关注作者
评论(0)