如何优雅地停止syncer?

感觉syncer这个工具太简陋了。

  1. 没有后台启动参数,需要用nohup
  2. 启动后停止不友好。kill ?
  3. 对于binlog点位的记录存在丢失的风险。一旦程序crash, 或系统crash , 会造成最新的binlog点位无法记录到meta文件。这会导致下次启动无法继续。

(帖子被作者删除,如无标记将在 24 小时后自动删除)

1赞

目前 dm 工具已经集成了 syncer 相关的功能,还支持更丰富的合库合表、任务管理等功能,欢迎试用;syncer 同步异常中断后也会将已经同步的 binlog 点位记录到 syncer.meta 文件。

@qizheng-PingCAP 即使kill -9 终止程序也能保证最新的binlog点位记录到syncer.meta文件吗? 这一点我很怀疑,不可能同步一条日志就写一次文件吧?

Syncer 在同步 binlog 的时候会间隔的保存 checkpoint,这种设计会造成重启的时候需要可重入,所以 syncer 采用了一种幂等可重入的同步方式,syncer 对不同 binlog 的转换如下

  • 一般运行时

    • insert event 转化为 replace statement
    • update event 转化为 update statement
    • delete event 转化为 delete statement
  • syncer 启动前 5 分钟为了可重入行,开启 safe mode 模式,safe mode 转换如下

    • insert event 转化为 replace statement
    • update event 转化为 delete + replace statement (时序为 delete -> replace )
    • delete event 转化为 delete statement

由于将 insert event 转化为 replace statement,为避免下游插入重复数据,需要确保上游的表都有主键或唯一索引。

2赞

知道了实现原理,放心多了, 感谢!