1问题描述
从Hadoop离线数据中台把百亿条业务数据同步到TCHouse数据仓库进行大数据实时分析,整个过程大批量数据写入到数据库,产生大量的WAL日志。由于备库未能及时接收主库的WAL日志,从而导致数据节点出现“日志同步状态异常”。


2问题分析
(1)根据告警信息在管理平台找到dn007的主节点登录信息,登录到对应的数据库检查主从同步情况。从查询结果可以看到,只有一个备库在进行流复制,另一个备库已经中断了。
psql -h xx.xx.xx.xx -p 11005 -U tbase -d postgrespsql (PostgreSQL 10.0 @ TBase_v3.16.4.2 TBase V5.21 2024-04-12 10:33:16)Type "help" for help.postgres=#postgres=# select application_name,state,sync_state from pg_stat_replication;application_name | state | sync_state---------------------+-----------+------------xx.xx.xx.xx:11011 | streaming | sync(1 row)
(2)登录备库对应的服务器,通过关键词FATAL查看日志文件。日志文件出现could not receive data from WAL stream: ERROR: (58P01) requested WAL segment 0000000100000CE00000005E has already been removed异常错误,说明备库请求的WAL文件已经被删除。
2024-05-12 21:41:38.916FATAL,XX000,"could not receive data from WAL stream:ERROR: (XX000) requested WAL segment 0000000100000CE00000005Ehas already been removed",,,,,,,,,""
(3)登录主库对应的服务器,通过关键词FATAL查看日志文件。在日志中可以看到,对应时间段的WAL FILE文件已经被自动删除。
2024-05-12 21:36:41.021 CST,,,3586998,coord(0,0),,66401417.36bbb6,coord(0,0),coord(0,0),1510,,2024-05-12 08:57:59 CST,,0,LOG,00000,"checkpoint complete: wrote 457660 buffers (21.8%);0 WAL file(s) added, 2 removed, 260 recycled; write=7.954 s, sync=0.005 s, total=8.247 s; sync files=125, longest=0.000 s, average=0.000 s;distance=4292407 kB, estimate=10804761 kB; pre-point=CE4/FA97FE40, cur-point=CE6/C991E0",,,,,,,,,""2024-05-12 21:41:38.880 CST,"tbase","",3587254,coord(0,0),"xx.xx.xx.xx:38064",66401419.36bcb6,coord(0,0),coord(0,0),13,"streaming CE0/5ECA0000",2024-05-12 08:58:01 CST,21/0,0,ERROR,XX000,"requested WAL segment 0000000100000CE00000005E has already been removed",,,,,,,,,"xx.xx.xx.xx:11011"
(4)检查数据库WAL日志保留个数参数wal_keep_segments设置为10000,同时检查主库PG_WAL目录的WAL个数已大于10000。
postgres=# show wal_keep_segments ;wal_keep_segments-------------------10000select setting::int8 as wal_keep_segments from pg_settingswhere name = 'wal_keep_segments';wal_keep_segments-------------------10000[root@localhost pg_wal]# ls |wc -l10264
(5)根据上述分析,可以推断大量数据写入,产生大量的WAL日志。由于主库的WAL日志被自动删除,未完全同步到备库,从而导致备库与主库同步出现异常。
3问题解决
(1)由于WAL日志缺失,无法修复备库,只能重建备库。
(2)TCHouse重做备机步骤简单,只需要节点管理列表点击“重做备机”,然后等待管理平台自动完成备机重做。


如果进行大批量的业务数据导入,建议把wal_keep_segments参数调大点。
4推荐阅读
流复制是基于WAL物理复制,WAL (Write-Ahead Logging) 日志记录数据库的变化,格式为二进制格式,当主机出现异常断电时,如果WAL文件已经写入成功,但还没来得及刷新数据文件,当数据库再次启动时会根据WAL日志文件信息进行事务前滚,从而恢复数据库到一致性状态。
默认状态下的流复制是以异步模式工作的,主库写WAL日志,通过wal sender进程把WAL日志发送给从库的wal receiver进程,wal receiver接收到WAL日志,并持久化到存储。
PG主备总体框架图:
近期热门文章:
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注公众号!




