xlog(WAL)日志被清理问题
问题描述
在添加备节点、重做备机,或在日常运行中,可能遇到备节点报错
FATAL,XX000,"could not receive data from WAL stream: ERROR: requested WAL
segment000000010000000600000054 has already been removed
可能影响
- 添加备节点失败;
- 重做备机失败;
- 主备复制不同步,导致备机不可用;
解决步骤
通常出现在WAL日志文件增长较快,且DN节点数据量较大,添加备机或重做备机需要较长时间的场景,针对此场景,可以有以下应对策略:
- DN节点数据量较大,应控制好单节点DN数据量,大小建议不超过5-10T,同时要确保有较好的磁盘性能,整体添加备节点、重做备机时间控制在1-2小时内存完成;
a、如果单DN容量超过了建值,则应该通过横向扩容方式,将DN数据分布到更多服务器;
b、如果因磁盘性能不足,导致整个任务时间过长,则建议节点在横向扩容的基础上,优化磁盘I/O,或更换性能更好的磁盘;
- 选择在业务低峰期添加备节点、重做备机,此时产生的WAL日志速度较慢,可以保证主节点默认保留的WAL日志文件在任务完成前不被清理;
- 调大参数wal_keep_segments,该参数用于指定pg_wal目录中保存的过去的WAL日志文件的最小数量,避免因主节点保留文件数量不够,导致在添加备节点、重做备机任务执行期间被自动清理;默认WAL日志文件大小为16MB,需要提前预估日志文件占用空间,避免磁盘空间不足问题。
- 主备节点不同步,延迟过大也可能导致主节点日志在同步到备机前被清理
a、可能是备节点服务器性能较差,主节点业务高峰期时,备节点WAL日志接收延迟
解决办法:应确保主备节点服务器配置一致,避免因配置不对等导致的性能问题,以及可能出现的发生主备切换后,新的主节点性能不足,影响业务的问题;
b、可能是网络异常或主节点上有大事务,生成大量WAL日志,导致同步延迟
解决办法:应该确保网络稳定;避免大事务,应拆分成多个小事务执行。