KingbaseES V8R6集群运维案例之---sys_rewind应用深入分析
一、背景
在主备流复制集群环境中,当主备发生了failover的切换,对于原主库如何处置以加入到集群?如果库数据量较小,可以通过重做,作为新的备库加入到集群;但是如果数据量较大,重做将需要很长的恢复时间,Oracle的FSFO采用了flashback database机制快速恢复原主库作为新的备库加入集群;KingbaseES的主备复制集群采用了sys_rewind的机制,实现对原主库的快速恢复。
二、sys_rewind功能
sys_rewind是一个工具,用于在集群的时间线(timeline)发生分歧之后,将kingbaseES集群与同一集群的另一个副本进行同步。典型的方案是在故障转移后将旧的主服务器恢复联机,作为新主服务器之后的备用服务器。
sys_rewind 工具优势是,主要实现了从源集群到目标集群的文件级别数据同步,sys_rewind 不需要去读那些未变化的文件块,当数据量比较大而变化较小的时候,sys_rewind会更快。
sys_rewind为了能够支持文件级别的数据同步,kingbase.conf必须配置如下参数:
wal_log_hints=on
full_page_writes=on
查看数据库配置:
test=# show data_checksums ;
data_checksums
----------------
on
(1 row)
test=# show wal_log_hints ;
wal_log_hints
---------------
on
(1 row)
test=# show full_page_writes ;
full_page_writes
------------------
on
(1 row)
三、sys_rewind工作原理
sys_rewind检查源和目标集群的时间线历史(读取history文件)以确定它们的分歧点,并在目标集群的sys_wal目录中找到WAL,一直到达分歧点。分歧点可以在目标时间线、源时间线或它们的共同祖先上找到。
如下所示,timeline的history文件记录了每次timeline切换时,对应的lsn:
[kingbase@node201 sys_wal]$ cat 00000007.history
1 0/180000A0 no recovery target specified
2 0/190000A0 no recovery target specified
3 0/250000A0 no recovery target specified
4 0/260000A0 no recovery target specified
5 0/AB0000A0 no recovery target specified
6 0/AD0000A0 no recovery target specified
为了在KingbaseES中实现文件级别同步数据的功能,sys_rewind 主要进行了如下的处理步骤:
- 加载本节点global/sys_control到ControlFile_target。
- 判断是否需要sys_rewind,获取分叉点divergerec。
- 确定新主库和旧主库数据一致性的Checkpoint位置,在该位置上,新主库和旧主库数据完全一致.这可以通过读取新旧主库节点时间线历史文件(history)可以获得,该文件位于$KINGBASE_DATA/sys_wal/目录下,文件名称为XXX.history。
- 旧主库节点根据上一步获取的Checkpoint读取本机日志文件WAL Record,获取在此Checkpoint之后出现变化的Block,并以链表的方式存储Block编号等信息。
- 根据第2步获取的Block信息从新主库节点拷贝相应的Block,替换旧主库节点相应的Block。如果只在旧主库上存在的数据文件,将被remove。
- 拷贝新主库节点上除数据文件外的所有其他文件,包括配置文件等(如果拷贝数据文件,与备份方式搭建区别不大)。
- 旧主库启动数据库,应用从Checkpoint开始后的WAL Record。
- 执行sys_rewind后,原主库除了数据块和新的主库一致之外,原主库的wal日志,数据库日志,$KINGBASE_DATA下的配置文件等,都是从新的主库拉取。
四、sys_rewind执行过程分析
以下案例为集群failover切换后,通过手工方式,将原主库通过sys_rewind恢复为新的备库,加入到集群。(其中新主库为source,原主库为target):
执行命令如下所示:
[kingbase@node202 bin]$ ./sys_rewind --target-data /home/kingbase/cluster/R6C8/HAC8/kingbase/data --source-server='host=192.168.1.201 port=54321 user=system dbname=test' --debug
1) 读取目标和源库控制文件对比system_id、version等
datadir_source = /home/kingbase/cluster/R6C8/HAC8/kingbase/bin/../data
sys_rewind: fetched file "global/sys_control", length 8192
sys_rewind: fetched file "sys_wal/00000007.history", length 257
2) 读取目标和源库timeline的history文件寻找分叉点(diverged)
如下图所示,源库和目标库当前timeline history文件对比:
sys_rewind: Source timeline history:
sys_rewind: Target timeline history:
sys_rewind: 1: 0/0 - 0/180000A0
sys_rewind: 2: 0/180000A0 - 0/190000A0
sys_rewind: 3: 0/190000A0 - 0/250000A0
sys_rewind: 4: 0/250000A0 - 0/260000A0
sys_rewind: 5: 0/260000A0 - 0/AB0000A0
sys_rewind: 6: 0/AB0000A0 - 0/AD0000A0
sys_rewind: 7: 0/AD0000A0 - 0/AE000908
sys_rewind: 8: 0/AE000908 - 0/0
sys_rewind: servers diverged at WAL location 0/AE000908 on timeline 7
sys_rewind: for record '7/0/AE000860', local hash is '4277337720' and remote hash is '4277337720'
sys_rewind: rewinding from last common checkpoint at 0/AE000860 on timeline 7
sys_rewind: find last common checkpoint start time from 2023-12-15 15:29:22.077960 CST to 2023-12-15 15:29:22.125309 CST, in "0.047349" seconds.
3)拷贝源库数据文件和变化的页块到目标库,并清理只在目标库存在的文件
sys_rewind: backup_label.old (COPY)
sys_rewind: base/1/12180_fsm (COPY)
sys_rewind: base/1/12180_vm (COPY)
sys_rewind: base/1/12183_fsm (COPY)
......
sys_rewind: sys_wal/0000000800000000000000B0 (REMOVE)
sys_rewind: sys_wal/0000000800000000000000AF (REMOVE)
sys_rewind: sys_wal/0000000800000000000000AE (REMOVE)
sys_rewind: sys_wal/00000008.history (REMOVE)
sys_rewind: sys_wal/0000000700000000000000AE.partial (REMOVE)
sys_rewind: sys_wal/0000000600000000000000AD (REMOVE)
sys_rewind: sys_wal/0000000500000000000000AB.partial (REMOVE)
sys_rewind: sys_stat/sys_stat_statements.stat (REMOVE)
sys_rewind: sys_stat/instance.stat (REMOVE)
sys_rewind: sys_stat/global.stat (REMOVE)
......
sys_rewind: received chunk for file "sys_wal/0000000700000000000000AF", offset 13000000, size 1000000
sys_rewind: received chunk for file "sys_wal/0000000700000000000000AF", offset 14000000, size 1000000
sys_rewind: received chunk for file "sys_wal/0000000700000000000000AF", offset 15000000, size 1000000
sys_rewind: received chunk for file "sys_wal/0000000700000000000000AF", offse
4)应用checkpoint后wal日志并更新目标库controlfile
sys_rewind: file replication start time from 2023-12-15 15:29:22.183547 CST to 2023-12-15 15:29:22.675535 CST, cost "0.491988" seconds.
sys_rewind: update the control file: minRecoveryPoint is '0/AF00FDD0', minRecoveryPointTLI is '7', and database state is 'in archive recovery'
sys_rewind: rewind start wal location 0/AE000830 (file 0000000700000000000000AE), end wal location 0/AF00FDD0 (file 0000000700000000000000AF). wal data increment:16445(kB). time from 2023-12-15 15:29:22.183547 CST to 2023-12-15 15:29:23.313972 CST, in "1.236012" seconds.
sys_rewind: Done!
五、集群failover切换后原主自动恢复
在一些无人值守的生产环境,当主备集群发生failover自动切换后,需要尽快将原主库自动恢复为新备库加入到集群中,保证集群架构的稳定性。
KingbaseES V8R6集群,在repmgr.conf中配置recovery='automatic',将可以实现主备failover切换后,对原主库的自动恢复,并调用sys_rewind快速恢复原主库,保证和新主库数据一致。
集群参数配置:
[kingbase@node201 bin]$ cat ../etc/repmgr.conf |grep recovery
recovery='automatic'
如下所示,集群日志记录了原主auto-recovery过程:
1)在failover切换后,新主库选举完成后,根据集群配置,对原主库执行auto-recovery。
2)对原主库执行‘repmgr node rejoin’,将原主库恢复为新的备库加入到集群,其upstream_node就是新主库节点。
3)新主库和原主库分别作为源库和目标库,执行sys_rewind将原主恢复为新主库的备库节点。
4)sys_rewind执行成功后,启动原主库(新备库)数据库服务,并加入到集群。
5)原主库作为新备库加入到集群后,auto-recovery成功。
[2023-12-15 18:49:07] [INFO] [thread pid:31403] ES connection to host "192.168.1.201" succeeded, ready to do auto-recovery
[2023-12-15 18:49:07] [INFO] node "node1" (ID: 1, HOST: 192.168.1.201) auto-recovery: NODE REJOIN
[2023-12-15 18:49:07] [DEBUG] DoRemoteCommand():
ssh -o Batchmode=yes -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -p 22 -o ServerAliveInterval=2 -o ServerAliveCountMax=3 192.168.1.201 /home/kingbase/cluster/R6C8/HAC8/kingbase/bin/kbha -h 192.168.1.202 -A rejoin --upstream-node-id 2
[2023-12-15 18:49:08] [INFO] unlink file /tmp/.s.KINGBASE.54321.lock
[2023-12-15 18:49:08] [NOTICE] executing repmgr command "/home/kingbase/cluster/R6C8/HAC8/kingbase/bin/repmgr --dbname="host=192.168.1.202 dbname=esrep user=esrep port=54321" node rejoin --force-rewind --upstream-node-id 2"
[NOTICE] rejoin target is node "node2" (ID: 2)
[DEBUG] connecting to: "user=esrep connect_timeout=10 dbname=esrep host=192.168.1.202 port=54321 keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3 fallback_application_name=internal_rwcmgr options=-csearch_path="
[DEBUG] local tli: 7; local_xlogpos: 0/B1000028; follow_target_history->tli: 7; follow_target_history->end: 0/B10000A0
[NOTICE] executing sys_rewind
[DETAIL] sys_rewind command is "/home/kingbase/cluster/R6C8/HAC8/kingbase/bin/sys_rewind -D '/home/kingbase/cluster/R6C8/HAC8/kingbase/data' --source-server='host=192.168.1.202 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3'"
sys_rewind: servers diverged at WAL location 0/B10000A0 on timeline 7
........
[NOTICE] begin to start server at 2023-12-15 18:49:08.355182
[NOTICE] starting server using "/home/kingbase/cluster/R6C8/HAC8/kingbase/bin/sys_ctl -w -t 90 -D '/home/kingbase/cluster/R6C8/HAC8/kingbase/data' -l /home/kingbase/cluster/R6C8/HAC8/kingbase/bin/logfile start"
[NOTICE] start server finish at 2023-12-15 18:49:08.461380
[NOTICE] NODE REJOIN successful
[DETAIL] node 1 is now attached to node 2
[2023-12-15 18:49:08] [NOTICE] kbha: node (ID: 1) rejoin success.
六、手工执行sys_rewind恢复案例
主备集群出现“双主”,通过sys_rewind快速恢复集群。
1、双主故障的处理
1)如果原主库有新的数据写入,需通过业务数据判断,新主和原主那个节点上的业务数据最新,确定为主库。
2)可以通过读取控制文件,判断那个节点的事务最新(timeline、checkpoint、xid等),确定主库。
3)确定主库后,将另外的节点作为备库处理。
4)可以通过clone或sys_rewind方式将创建备库,加入到集群。
5)如果数据库数据量比较大,但新旧主库之间数据量变化差异比较小,可以考虑适用sys_rewind方式创建备库。
2、执行sys_rewind恢复集群
1)关闭原主库(目标库)数据库服务。(如果有条件,可以先做一个备份)
[kingbase@node101 bin]$ ./sys_ctl stop -D /data/kingbase/r6ha/data/
waiting for server to shut down.... done
server stopped
2)查看和配置相关配置参数(默认)
[kingbase@node101 ~]$ cat /data/kingbase/r6ha/data/es_rep.conf |grep full
full_page_writes=on
[kingbase@node101 ~]$ cat /data/kingbase/r6ha/data/es_rep.conf |grep hint
wal_log_hints=on
3)手工执行sys_rewind
# 源 库: 新主库
# 目标库: 原主库(目标库的数据将被源库数据覆盖)
# sys_rewind命令在目标库上执行,在执行sys_rewind之前需要关闭目标库数据库服务
(建议:关库后对数据库做物理冷备。)
[kingbase@node101 bin]$ ./sys_rewind --target-data /data/kingbase/r6ha/data
--source-server='host=192.168.1.102 port=54321 user=system dbname=test' –debug
......
具体步骤略。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」