导航

    数据用户治理组

    • 注册
    • 登录
    • 搜索
    • 版块
    • 最新
    • 话题
    • 热门
    • 用户
    • 群组

    5分钟搞定 MySQL 到 ClickHouse 实时数据同步进阶篇-CloudCanal实战

    技术分享
    clickhouse 数据同步
    4
    8
    4568
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • junyu-cloudcanal
      junyu-cloudcanal 最后由 junyu-cloudcanal 编辑

      简述

      之前的文章 5分钟搞定 MySQL 到 ClickHouse 实时数据同步 发布后,很多用户将 MySQL->ClickHouse 实时同步链路用了起来,但是我们很快发现,CollapsingMergeTree 在某些场景下可能并不能按预期进行数据折叠。

      这个时候,我们参考了 ClickHouse 官方实现的 MaterializeMySQL 表引擎,将 ReplacingMergeTree 作为对端主力表引擎进行数据链路构建。

      新方案优势包括

      • 表不存在额外的字段
      • 按 order by key 严格合并(单节点)
      • 可以设置按时间间隔自动 optimize 表(autoOptimizeThresholdSec参数)
      • 支持 DDL 同步

      技术点

      结构迁移

      目前到 ClickHouse 的结构迁移中,默认选择 ReplacingMergeTree 作为表引擎,源主键作为 sortKey (无主键表则是 tuple),如下示例:

       CREATE TABLE console.worker_stats
      (
          `id` Int64,
          `gmt_create` DateTime,
          `worker_id` Int64,
          `cpu_stat` String,
          `mem_stat` String,
          `disk_stat` String
      )
      ENGINE = ReplacingMergeTree()
      ORDER BY id
      SETTINGS index_granularity = 8192
      

      写数据

      新方案全量仍然按照标准 batch 导入,增量和 CollapsingMergeTree 作为表引擎的区别在于

      • 转换 Insert、Update 操作为 Insert
      • Delete 操作单独通过 alter table delete 语句进行操作

      所以 Delete 操作如果较多,增量同步性能会急剧下降,建议 delete RPS 不超过 50。

        switch (rowChange.getEventType()) {
                  case INSERT:
                  case UPDATE: {
                      for (CanalRowData rowData : rowChange.getRowDatasList()) {
                          CkTableBatchData.RecordWithState addRecord = new CkTableBatchData.RecordWithState(CanalEventType.INSERT, rowData.getAfterColumnsList());
                          batchData.getRecords().add(addRecord);
                      }
      
                      break;
                  }
                  case DELETE: {
                      for (CanalRowData rowData : rowChange.getRowDatasList()) {
                          CkTableBatchData.RecordWithState delRecord = new CkTableBatchData.RecordWithState(CanalEventType.DELETE, rowData.getBeforePkColumnsList());
                          batchData.getRecords().add(delRecord);
                          batchData.setHasDelete(true);
                      }
                      break;
                  }
                  default:
                      throw new CanalException("not supported event type,eventType:" + rowChange.getEventType());
       }
      

      操作示例

      • 登陆 CloudCanal SaaS版,使用参见快速上手文档
      • 造 Insert、Update、Delete 负载,比例为 20:78:2
        截屏2021-11-19 上午11.27.01.png
      • 添加数据源
        添加数据源.png
      • 创建任务,选择数据源和库,并连接成功
      • ClickHouse 侧点开高级选项,确保 表引擎为 ReplacingMergeTree
      • 点击下一步
        选择数据源.png
      • 选择数据同步,建议规格至少选择 1 GB。
      • 目前已经支持 MySQL->ClickHouse DDL 同步, 可默认选中。
      • 点击下一步
        选择规格.png
      • 选择表、列、创建确认默认下一步。
      • 等待任务自动结构迁移、全量迁移、数据同步追上
      • 打开自动表优化开关,默认设置 30 秒间隔
        打开开关.png
      • 延迟追平状态,停止负载
      • 等待自动优化间隔时间,创建一个校验任务,跑完结果一致。
      • 也可以等待 ClickHouse 自动优化,但时间不定
        数据一致.png

      常见问题

      新方案还存在什么问题

      目前并未支持集群(distribute 表),所以如果 ClickHouse 是一个集群,还需要进一步增强。

      另外结构迁移和增量对于 partition key 设置的支持,以及其他个性化表结构定义支持,还没有做到位。

      还支持其他数据源么

      我们目前收到比较多Kafka、SqlServer、MongoDB、Oracle 到 ClickHouse 的需求,目前 SqlServer 我们目前正在支持中,Kafka 、MongoDB 、Oracle 源端已经支持,打通 ClickHouse 链路我们会在合适的时间同时打开。

      总结

      本文简要介绍了 CloudCanal 实现 MySQL到 ClickHouse 数据迁移同步的进阶能力,相比于老方案,优势明显。读者朋友们也可以通过 CloudCanal 社区版免费体验。最后,如果各位觉得这篇文章还不错,请点赞、评论加转发吧。

      更多精彩

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

      社区快讯

      • 我们创建了 CloudCanal 微信交流群,在里面,您可以得到最新版本发布信息和资源链接,您能看到其他用户一手评测、使用情况,您更能得到热情的问题解答,当然您还可以给我们提需求和问题。扫描下方二维码,添加我们小助手微信拉您进群,备注: 加 CloudCanal 群
        wechat.png
      1 条回复 最后回复 回复 引用 0
      • 脱
        脱发的山顶洞人 最后由 编辑

        此回复已被删除!
        1 条回复 最后回复 回复 引用 0
        • junyu-cloudcanal
          junyu-cloudcanal @Fanduzi 最后由 编辑

          @fanduzi 在 5分钟搞定 MySQL 到 ClickHouse 实时数据同步进阶篇-CloudCanal实战 中说:

          新

          对

          1 条回复 最后回复 回复 引用 0
          • Fanduzi
            Fanduzi @junyu-cloudcanal 最后由 编辑

            @junyu-cloudcanal 你们现在这个同步方法, 想要查最新的数据, 得加FINAL吧?

            junyu-cloudcanal 1 条回复 最后回复 回复 引用 -1
            • junyu-cloudcanal
              junyu-cloudcanal @Fanduzi 最后由 编辑

              @fanduzi 在 5分钟搞定 MySQL 到 ClickHouse 实时数据同步进阶篇-CloudCanal实战 中说:

              请问现在有采用这篇文章中的同步方案吗? https://mp.weixin.qq.com/s/a8OfsBn9VFnj7oxp0IIVGg
              https://github.com/tal-tech/cds 和 https://github.com/brokercap/Bifrost 都是这种方式

              本质就是ReplacingMergeTree + argMax + is_delete列, 将UPDATE DELETE全部转换为INSERT

              最终暴露给用户的是一个视图(可以将视图命名为原表名, 而clickhouse同步过来的表则为T_XX), 查询视图得到永远是最新的数据(且不包含delete数据)

              我们把delete 处理弱化了,因为大部分业务 delete 数据不多,所以目前比较取巧,直接用 alter table delete 解决,所以表结构比较干净

              Fanduzi 1 条回复 最后回复 回复 引用 0
              • Fanduzi
                Fanduzi 最后由 Fanduzi 编辑

                请问现在有采用这篇文章中的同步方案吗? https://mp.weixin.qq.com/s/a8OfsBn9VFnj7oxp0IIVGg
                https://github.com/tal-tech/cds 和 https://github.com/brokercap/Bifrost 都是这种方式

                本质就是ReplacingMergeTree + argMax + is_delete列, 将UPDATE DELETE全部转换为INSERT

                最终暴露给用户的是一个视图(可以将视图命名为原表名, 而clickhouse同步过来的表则为T_XX), 查询视图得到永远是最新的数据(且不包含delete数据)

                junyu-cloudcanal 1 条回复 最后回复 回复 引用 0
                • junyu-cloudcanal
                  junyu-cloudcanal @程序员一枚 最后由 编辑

                  @程序员一枚 在 5分钟搞定 MySQL 到 ClickHouse 实时数据同步进阶篇-CloudCanal实战 中说:

                  请问想把mysql的update同步到clickhouse为alter table update而不是insert,有更改方案吗?谢谢

                  alter table 算是ddl 范畴了,实际上性能比较差,和列式存储的数据拓扑比较相关。我们目前还是用append模式(insert 追加)。

                  1 条回复 最后回复 回复 引用 0
                  • 程
                    程序员一枚 最后由 编辑

                    请问想把mysql的update同步到clickhouse为alter table update而不是insert,有更改方案吗?谢谢

                    junyu-cloudcanal 1 条回复 最后回复 回复 引用 0
                    • 1 / 1
                    • First post
                      Last post
                    Copyright © 2020 ClouGence, Inc.备案号:浙ICP备20007605号-2