检查点是目标端(EXEC模块)记录已成功提交至目标数据库的逻辑进度标记(LSN),用于保证故障重启后的断点续传。
正常情况下,源端日志入库成功后LSN立即推进,已完成的检查点会即时释放,因此活跃的检查点计数极少。但当遇到那种过亿行的大表装载失败或大事务耗时过长时,目标端的工作线程会卡死在执行上,由于DRS是按站点分配固定内存池的(默认仅64MB),缓冲区会迅速被填满,此时DRS为了防止自身进程被系统OOM强制杀掉,会自动将溢出的数据转移到本地磁盘生成 .ckpt 检查点文件;然而,DRS内部存在硬性元数据保护机制max_ckpt_num 默认上限为1000个,只要未成功提交的活跃检查点文件数量突破这个极限,不管服务器还剩多少GB空闲物理内存或磁盘空间,DRS都会直接触发 NUM: 1000 SKIP 报错并强行切断同步,其根本目的是为了避免DRS发生重启时因需要扫描和恢复数万个检查点文件而耗费数小时甚至数天。
已提交成功的检查点会立即释放坑位计数,真正导致满载的是那些因装载失败或异常而卡死、长期无法提交的大事务。
1.clear_interval参数,针对使用add table命令添加的同步表装载失败时,从表装载失败开始,如果超出该参数设置的间隔时间后,该表仍然未重装或者续装,DMDRS会自动停止该表的增量同步,删除源DMDRS保存的表字典,清理目标DMDRS相应检查点。
该参数默认为168小时,调小该参数,更快清理卡住的检查点,尽可能避免装载失败太多导致满载。
2.ckpt_limit参数,当上一级DMDRS投递存在大事务时,如果内存不足以缓存该事务,会暂时由检查点保存到本地文件,接收完成后执行,在某些情况需要适当增大该参数来保证磁盘空间足够,防止同步卡死。
该参数默认值为50*1024MB(50G),调大该参数,让检查点占用的存储空间上限增加,防止数据过大导致大事务卡死。
3.max_ckpt_num参数,当数量达到上限后,即使没有达到最大占用磁盘限制(ckpt_limit),也不会刷新推进检查点,当检查点缓存文件数量过多时,占用系统资源(如内存、文件句柄)会增加,同时重启后恢复时间也会加长。该参数用于从检查点数量上进行限制,不建议超过1000。
该参数默认值为1000,直接导致 NUM: 1000 SKIP 报错,因为目的端处理大事务卡住,导致未完成的检查点数量一直增长,达到了默认的上限 1000 个,从而触发了警告并导致阻塞,把这个值改大(比如 3000 或 5000),可以尽可能避免满载。
4.site_buf_size和load_buf_size参数,site_buf_size:每一个源DMDRS在同步时,都会在同步执行端注册一个对应的同步站点结构,该功能参数用于分配同步站点可使用的初始化内存大小。Load_buf_limit:对于数据装载,EXEC模块根据site_buf_size参数创建对应的初始化站点缓存空间用于数据装载,该站点缓存大小可自动扩展,为避免数据装载消耗过多内存,引起内存资源紧张问题,可使用该参数限制装载可使用的最大站点缓存大小。
site_buf_size参数默认为64MB,可以调到load_buf_size参数的默认值1024MB,这样可以有效避免缓冲区被快速填满。
5.error_policy参数,
参数值
0:终止同步。默认值为0。
1:忽略错误继续同步,仅忽略同步有错误的操作,不影响所在事务的其它操作同步。
2:INSERT/UPDATE失败时,使用MERGE INTO重新执行。忽略DELETE失败的情况。
注意:MERGE INTO仅支持有主键表,并且要求开启全列日志,否则UPDATE失败时,仅插入更新的列值,其他列为NULL。该功能和exec_nowait功能冲突,配置为2时自动取消exec_nowait。(当需要设置装载表的执行错误策略为2时,只用添加一个分组id为32222的item项并配置error_policy为2即可。
可以将error_policy参数改为1或2,保障出错时忽略错误继续同步,避免卡住。
以上方案可以组合使用,尽可能规避问题或延长时间,在满载前有时间手动清理检查点积累并重新装载。
文章
阅读量
获赞
