Skip to main content

主流数据库到 StarRocks

简述

CloudCanal 2.1.0.x 版本开始支持 StarRocks 作为对端的数据迁移同步能力

本文通过 MySQL->StarRocks 的数据迁移同步案例简要介绍这个源端的能力。链路特点:

  • 结构迁移、全量迁移、增量同步(数据)、数据校验俱全
  • 流程全自动化

使用须知

  • 支持的StarRocks版本为: 1.18.x、1.19.x、2.0.x
  • 支持的源端数据源类型为: Oracle/PostgreSQL/Greenplum/MySQL,本文主要以 MySQL 源端为例说明使用方法。
  • 校验任务只支持主键模型的 StarRocks 表,源端表需要有主键

技术点

自定义结构迁移配置

结构迁移支持用户自定义分桶数等自定义建表信息 2a5a59ec-e3ba-498e-adcc-eb95522d9daf-image.png

面向在线业务的编辑订阅能力

数据长周期增量同步,难免有新增表需要订阅的时候,CloudCanal编辑订阅的能力,可以在原有任务的基础上新增需要订阅的表。新增的表订阅会产生一个子任务,自动完成全量、增量,然后再和原有的主任务合并,自动化的完成表订阅的全过程。 5f5055f6-c009-4378-bce6-43ae03ee2dc3-image.png

基于 StreamLoad 的导入方式

StarRocks 提供了多种导入方式。CloudCanal 采用了 StreamLoad 的方式进行导入,源端的消息会转成字节流,通过 HTTP 协议发往 StarRocks。

相比直接通过 SQL 写入的方式,StreamLoad 方式会有更好的性能,写入的数据直接经 FE 转发给 BE 处理。如果直接采用 SQL 写入,在 FE 侧,会有额外的 SQL 解析开销。

CloudCanal默认采用csv格式来进行streamload导入,分隔符可以通过参数columnSeparator和lineSeparator设置。此外如果用户内容特殊字符较多,也可以开启json格式导入,避免分隔符的冲突问题。

开启json模式

在任务详情页面打开任务参数设置,搜索format,设置成json重启任务即可。 8f634dfe-2bfb-4325-8272-090daeeaad41-image.png 42fe2f0c-ef5c-4fe5-947d-78a3173cc11d-image.png

丰富的功能配置

CloudCanal 提供了 StreamLoad 可配置的丰富参数,包括:

  • connectionTimeoutSec 参数
    • 表示导入请求的超时时间(单位:秒)
  • loadExecMemLimitMb 参数
    • 表示导入内存限制
  • enableTimeZoneProcessFull 参数
    • 启用全量阶段时区转换处理
  • enableTimeZoneProcessIncre 参数
    • 启用增量阶段时区转换处理
  • timezone 参数
    • 默认东八区,指定导入所使用的时区
    • 该参数会影响所有导入涉及的和时区有关的函数结果。
  • defaultZeroDate 参数
    • mysql源端可能会收到0000-00-00 00:00:00的特殊事件,支持采用自定义的默认值替换改值
  • exceptionSkipMode 参数
    • 支持跳过非法数据,继续同步,避免同步阻塞

可配置的写入停顿控制

过快的写入会导致 StarRocks 来不及 compaction,从而产生异常。CloudCanal 提供了两个任务参数,支持在一批数据写入后自动停顿一段时间,避免这种问题。参数为:

  • fullBatchWaitTimeMs 参数
    • 全量批之间写入停顿间隔,单位毫秒
  • increBatchWaitTimeMs 参数
    • 增量批之间写入停顿间隔,单位毫秒

CloudCanal 任务详情页,点击 参数修改,即可调整,StarRocks建议的停顿时间为1-10s,如遇到写入时SR来不及compaction,可以通过增加停顿时间来降低写入频率。

e6865230-17ad-461c-b1bf-c4001cd30e10-image.png

691f1b73-d67d-4b31-ad6d-d123d7443fed-image.png

主键模型

StarRocks 作为实时数仓,采用主键模型或者聚合模型较多。CloudCanal默认采用主键模型,能够实时同步源端的 INSERT/UPDATE/DELETE

tips: 表结构对于实时数仓实际读写性能影响非常大,CloudCanal 默认提供的结构迁移能力并没有提供诸如分区分桶等设置,用户如需使用,可按照需求提前创建好表结构,再通过 CloudCanal 进行数据迁移同步。

UPDATE/DELETE 操作的处理

基于 StreamLoad 的写入方式,实际写入对端的操作均为 INSERT。CloudCanal 同步时会自动将 UPDATE/DELETE 转成INSERT语句,并修改 __ops 值,StarRocks 会自动进行compaction。

转义支持

StarRocks 不支持 \n 等特殊符号写入,CloudCanal 任务通过参数设置(enableEscape参数) 开启自动转义。 1c84a38a-a51a-49fc-86f9-84dbbd42c993-image.png

操作示例

  • CloudCanal 社区版部署,参见 社区版安装文档
  • 准备好源端和目标端数据库以及对应的测试数据

添加数据源

  • 登录 CloudCanal 平台

  • 数据源管理->新增数据源

  • 选择自建数据库中StarRocks f374af27-fee3-4697-887d-9f3fb9533015-image.png

  • Client地址: 为StarRocks提供给MySQL Client的服务端口,CloudCanal主要用其查询库表的元数据信息,对应StarRocks的QueryPort,默认为XXX.XXX.XXX.XXX:9030

  • Http地址: Http地址主要用于接收stream load的http请求,对应StarRocks的HttpPort,默认为XXX.XXX.XXX.XXX:8030

任务创建

  • 任务管理->任务创建

  • 选择 目标 数据库

  • 点击 下一步 e292dbc4-b704-4dc0-b9ee-42f0d36b490e-image.png

  • 选择 增量同步,并且启用 全量数据初始化

  • 不勾选 DDL 同步(暂不支持)

  • 点击下一步 cb223937-cfcb-4348-82d7-ad712e58fa28-image.png

  • 选择订阅的表,结构迁移自动创建的表为主键模型的表,因此暂不支持无主键表

  • 点击下一步 9ef5e6ff-55d2-4c60-8d06-5ea1ec7aa3a0-image.png

  • 配置列映射

  • 点击下一步 4257f866-73ff-4be8-bfa3-856a9a1378cc-image.png

  • 创建任务 1c3d5908-0a28-46e5-93d7-62bb2fec1957-image.png

  • 查看任务状态。任务创建后,会自动完成结构迁移、全量、增量阶段。 c5104d1a-fa40-46f2-af20-278fad1c8f76-image.png

任务性能调优(option)

对于高流量的场景,建议使用 4G 及以上的任务规格配置,并且对相关参数进行调优。批处理相关参数可以调节尽量大点的值。例如4G规格的任务,全量的fullBatchSize可以调节到4K以上,会有比较好的性能,并且导入频率也不会太快。设置fullBatshSize之后启动任务,注意下任务的GC情况,如果FGC严重,则可以适当减小fullBatchSize的值,从而寻求到当前规格下最优的参数配置。GC情况可以通过监控图标查看。

  • 任务详情->功能列表->参数设置37ea6a32-6195-4ba6-9536-a84b36808732-image.png
  • 全量迁移参数调整 b101094f-914b-401b-8b02-dcff2f9c4ec2-image.png
  • 增量同步参数调整 c2f8457f-b49e-428f-9120-b875e7b87fc3-image.png

总结

本文简单介绍了如何使用 CloudCanal 进行MySQL到StarRocks 的数据迁移同步。各位读者朋友,如果你觉得还不错,请点赞、评论加转发吧。

常见FAQ

close index channel异常

Caused by: java.lang.RuntimeException: Failed to flush data to StarRocks, Error response: {"Status":"Fail","BeginTxnTimeMs":0,"Message":"close index channel failed, load_id=8742fa5d-3ab6-7fe5-6615-35c50e90d488","NumberUnselectedRows":0,"CommitAndPublishTimeMs":0,"Label":"ffbeed8c-01c6-46df-a4be-c1e4742c6fb3","LoadBytes":20871,"StreamLoadPutTimeMs":1,"NumberTotalRows":0,"WriteDataTimeMs":3,"TxnId":1540574,"LoadTimeMs":4,"ReadDataTimeMs":0,"NumberLoadedRows":0,"NumberFilteredRows":0} {} 默认任务参数配置下,如果导入数据过于频繁可能会任务异常,这时候可以调节上文提到的fullBatchWaitTimeMs和increBatchWaitTimeMs参数或者调整StarRocks的Server侧的合并策略。下图为StarRocks官方提供的常见问题FAQ

77b7f260-455d-4a9d-a684-dbc0863e6365-image.png

全量性能相关参数fullBatchSize参数如何设置?有最优值建议吗?

不同负载和机器环境最优值不同,初始的fullBatchSize和fullRingBufferSize设置的比较小,避免用户初次使用的时候因为机器环境规格不高导致OOM。全量fullBatchSize 和fullRingBufferSize在任务规格4G及以上的情况下可以先开个较大的值,例如4K或者8K,如果FGC比较严重再尝试减少这个数值,直到没有OOM,这样即可以找到在你们自己数据负载和机器环境下相对最优的参数配置。此外全量也还可以调节fullPagingCount以及writeParallel参数来提升源端拉取的批次大小和写入对端的并行度。

更多精彩

加入粉丝群

如果您还没有加入我们粉丝群,可以添加我们小助手微信加入我们粉丝群,感谢您对CloudCanal的关注! 20bd07e3-2bfc-4679-8241-d21aad112201-image.png