Navigation

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    异地多活基础之数据双向同步进阶篇-CloudCanal实战

    技术分享
    双向同步 数据打标 异地双活
    3
    4
    1579
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • junyu-cloudcanal
      junyu-cloudcanal last edited by CloudCanal--文强

      简述

      之前的一篇文章异地多活基础之数据双向同步发出来后,很多用户开始测评该方案,有使用稳定的,但也有用户碰到了一些问题(性能和GTID空洞)。为了解决这些问题,我们在 MySQL 到 MySQL 双向同步方案上又多走了一步。相比之前的方案,优势明显。

      • 不依赖 GTID
      • 不依赖事务的顺序,可并行
      • 对端操作减少
      • 对云数据库(MySQL)的普遍支持
      • 支持库表列裁剪、映射以及自定义数据处理

      技术点

      防冲突标记

      GTID 防冲突标记包含 MySQL 的 server_uuid 和事务号,新方案我们选择 binlog 数据标记。

      DML 在 Binlog 中正常的事件顺序依次为 QueryEvent(TxBegin)、TableMapEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd) , 如果需要对同步的数据打上标记,除非对 WriteRowEvent 做标记,否则没有可下手的地方。但是要达成这个目标,以我们的认知来看,除非改引擎代码。

      然后,我们盯上了 MySQL binlog 中一个描述变更行 statement 的事件 RowsQueryLogEvent ,这个事件只在打开 MySQL binlog_rows_query_log_events 参数才会出现,而这个事件可以带上执行 sql 的注释。

      为此,我们设计了 CloudCanal 写入对端时自动带上 /*ccw*/ 标记,这样在 RowsQueryLogEvent 的 sql 语句中也会出现该标记,在双向同步中,如果遇到这个标记,过滤即可。

      新的 DML 事件顺序变成了 QueryEvent(TxBegin)、TableMapEvent、RowsQueryLogEvent、WriteRowEvent(IUD)、QueryEvent(TxEnd)。

      操作示例

      准备 CloudCanal

      • 登陆 CloudCanal SaaS版,使用参见快速上手文档

      添加数据源

      • 本案例采用 阿里云 RDS for MySQL, 为测试便利起见,2台数据库都位于 hangzhou 区域
      • 在 RDS 实例详情->参数设置,设置 binlog_rows_query_log_events 为 on
      • 登录 CloudCanal 平台 ,数据源管理 -> 添加数据源 , 将准备的数据库逐步添加进来
      • 建议对数据源进行描述修改,防止配置正反链路时,识别错数据库

      创建正向同步任务

      • 任务管理->新建任务
      • 双向同步中,正向任务一般指源端有数据,目标端无数据的链路,涉及对端数据初始化
      • 第一个页面
        • 选择源端和目标端数据源和相关信息,点击下一步
      • 第二个页面
        • 选择 数据同步,并且勾选 全量数据初始化
        • 勾选 DDL 同步
        • 置灰自动启动,以便创建任务后设置双向同步参数
        • 点击 下一步

      c108b35d9154-image.png

      • 第三个、第四个页面

        • 表、列映射裁剪…此处省略
        • 点击 下一步
      • 第五个页面

        • 点击确认创建

        截屏2021-10-28 下午2.24.44.png

      • 任务详情 -> 参数设置

        • 设置目标数据源配置 deCycle 参数为 true
        • 此处和 GTID 方案有较大差别, 不需要开启 enableTransaction 和 gtidMode
        • 生效配置并启动

        截屏2021-10-28 下午2.26.17.png

      创建反向同步任务

      • 任务管理->新建任务

      • 第一个页面

        • 选择源端和目标端选择数据源(请和正向任务所选数据源对调)和相关信息,点击下一步
      • 第二个页面

        • 选择 数据同步,并去除全量数据初始化勾选
        • 勾选 DDL 同步
        • 置灰自动启动,以便创建任务后设置双向同步参数
        • 点击 下一步
      • 第三、四个页面

        • 表、列映射裁剪…此处省略
        • 点击 下一步
      • 第五个页面

        • 点击确认创建
      • 任务详情 -> 参数设置

        • 设置目标数据源配置 deCycle 参数为 true
        • 此处和 GTID 方案有较大差别, 不需要开启 enableTransaction 和 gtidMode
        • 生效配置并启动

        截屏2021-10-28 下午2.26.17.png

      任务同步

      • 正向任务和反向任务正常同步,进行源和目标数据校验,结果一致
        截屏2021-10-28 下午2.29.17.png

      测试

      • 源端数据库做数据变更,正向任务监控有变更,反向任务没有(即无循环)
        截屏2021-10-28 下午2.31.33.png
        截屏2021-10-28 下午2.39.24.png
        截屏2021-10-28 下午2.41.53.png
      • 目标端数据库做数据变更,反向任务监控有变更,正向任务没有(即无循环)
        截屏2021-10-28 下午2.43.25.png
        截屏2021-10-28 下午2.44.51.png
        截屏2021-10-28 下午2.45.59.png

      常见问题

      新方案有什么不利因素

      需要修改 MySQL 全局变量 binlog_rows_query_log_events 为 on ,这个参数默认是关闭的,相比 GTID 普遍打开,这是不利因素。

      再者 , binlog 增长相对快速,可能带来磁盘增长烦恼,清理 binlog 周期会变短。

      最后,对于 CloudCanal 而言,增加了语句文本的内存占用,导致资源损耗加大。

      不过相对于新方案带来的好处-性能和稳定性大幅度提升,我们认为这些损失是值得的。

      新方案除了 MySQL->MySQL 还支持哪些链路?

      其他数据源是否存在 DML 语句或者数据可标记,我们还没来得及深入研究,不过这个实现方向(数据打标)我们认为是比较友好的。

      总结

      本文简单介绍了如何使用 CloudCanal 构建 MySQL->MySQL 双向同步链路升级方案,如果各位有需求,可以尝试使用下我们的社区版免费体验。

      最后,各位读者朋友,如果您觉得这篇文章还不错,请点赞、评论加转发吧。

      更多精彩

      • 5分钟搞定 MySQL 到 TiDB 迁移同步-CloudCanal 实战
      • 5分钟搞定 MySQL 到 ElasticSearch 迁移同步-CloudCanal 实战
      • 5分钟搞定 MySQL 到 MySQL 异构在线数据迁移同步-CloudCanal 实战
      • 5分钟搞定 MySQL 到 ClickHouse 实时数据同步-CloudCanal 实战
      • MySQL 到 ElasticSearch 实时同步构建数据检索服务的选型与思考
      • 构建基于Kafka中转的混合云在线数据生态-cloudcanal实战

      社区快讯

      我们创建了 CloudCanal 微信交流群,在里面,您可以得到最新版本发布信息和资源链接,您能看到其他用户一手评测、使用情况,您更能得到热情的问题解答,当然您还可以给我们提需求和问题。扫描下方二维码,添加我们小助手微信拉您进群,备注: 加 CloudCanal 群
      20bd07e3-2bfc-4679-8241-d21aad112201-image.png

      1 Reply Last reply Reply Quote 0
      • 神经蛙 0
        神经蛙 0 last edited by

        目前是否支持有主外键关系表的数据双向同步?
        由于表有主外键关系,所有同步数据时需要有优先级,比如必须主表的数据同步后再同步外键表的数据,否则会插入出错,这种情况cloudcacal是否有机制能够处理?

        1 Reply Last reply Reply Quote 0
        • junyu-cloudcanal
          junyu-cloudcanal @keithyzk last edited by junyu-cloudcanal

          @keithyzk 一般异常按照异常情况处理,主要方式是手动对比订正–,正常情况切换需要短时禁写。

          相比有异地多活能力的数据库,本质差别在于异地多活数据库具备分布式协议( raft/paxos),但是目前对于数据同步工具,并有没有这种协议保障。所以依赖业务逻辑的判定。。

          1 Reply Last reply Reply Quote 0
          • keithyzk
            keithyzk last edited by keithyzk

            您好,异地多活双向同步架构中,我有一些疑问点
            那我现在如果配置双向同步
            假设现在架构经历以下过程:
            1、主库写入 id 100 尚未同步到备库发生故障,高可用 vip 漂到备库,备库提供读写服务
            2、备库写入 id 100、101、102 的记录
            3、主库恢复正常,主库要恢复来自备库的故障期间增量数据(id 100、101、102)的三条记录

            这种情况主库 binlog 上已经有 id 100 的记录,应该已经无法同步来自备库的 id 100 记录了吧。是否有一些机制避免这种数据冲突情况?

            junyu-cloudcanal 1 Reply Last reply Reply Quote 0
            • 1 / 1
            • First post
              Last post
            Copyright © 2020 ClouGence, Inc.备案号:浙ICP备20007605号-2