# exlSchema **Repository Path**: coconan/exlSchema ## Basic Information - **Project Name**: exlSchema - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: 1.0 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-01 - **Last Updated**: 2025-12-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### StarRocks 管理员 跨集群数据表同步工具 ![](img/1.png) * 集成MySQL外表,ENGINE=MYSQL。 * 集成StarRocks外表,ENGINE=OLAP。 * 集成Jdbc Catalog。 * 集成官方starrocks-cluster-sync-2.0 * 集成兼容所有StarRocks版本 1. 支持一键创建MySQL、StarRocks外表,支持跨集群克隆表结构,迁移数据。 2. 支持迁移方式v1:源、目标容量级别,容量批次导入。 3. 支持迁移方式v2:源、目标分区稽核,单分区覆写。 4. 支持迁移方式v3:源、目标分区稽核,多攒批覆写。 5. 支持迁移方式v4:仅对目标分区稽核,单分区覆写。 6. 支持迁移方式v5:仅对目标分区稽核,多攒批覆写。 7. 支持指定一次性初始化,或流式增量。 8. 支持定时通知迁移进度到飞书群组。 9. 支持自定义迁移分区。 10. 支持自定义设置作业并发度。 ### 模拟场景: **全量同步(表结构+数据)- MYSQL外表方式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库表名 /*支持同步多个库表,逗号分隔*/> -r -i -o mysql 1. 自动创建外表 2. 自动创建内表 3. 自动insert写入。 4. 走9030端口 ![](img/2.png) ![](img/3.png) ![](img/4.png) 迁移完成,推送飞书。 ![](img/5.png) 3个亿,4分钟。 多表同步-t ![](img/6.png) 迁移完成,推送飞书。 ![](img/7.png) 这里出现的信息有:总耗时,task耗时,同步状态,表名,源端数据量,目标数据量。 **全量同步(表结构+数据)- STARROCKS外表方式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库表名 /*支持同步多个库表,逗号分隔*/> -r -i -o starrocks 1. 自动创建外表 2. 自动创建内表 3. 自动insert写入。 4. 走9020端口 ![](img/8.png) starrocks olap外表传输有个缺点就是,需要等元数据缓冲完成后,才支持写入,否则failed。 **全量同步(表结构+数据)- 官方元数据模式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库表名 /*支持同步多个库表,逗号分隔*/> -r -i -o meta 1. 自动匹配配置文件 2. 自动默认一次性写入 3. 走9030、9020端口 ![](img/9.png) ![](img/10.png) 等程序走完就好 **全量同步(表结构)- 库级别结构模式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库名 /*支持同步多个库,逗号分隔*/> -r -i -o ghost -level db ![](img/11.png) 由于这个模式只是同步表结构,速度很快,也可以使用-thread xx指定线程数进行加快同步 同理,每个模式运行结束后,都会收集同步状态、结果发送到飞书 ![](img/12.png) ![](img/13.png) 再登录目标集群,表结构已经过来 ![](img/14.png) **全量/分区同步(表结构+数据)- Jdbc Catalog 源、目标容量级别,容量批次导入v1模式** **全量一次性模式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库名 /*支持同步多个库,逗号分隔*/> -r -i -o v1 -a ![](img/15.png) **单例批次同步模式** -batch ![](img/16.png) ![](img/17.png) 这种特点是,当带宽能力不足,且担心打满带宽时,可以自动分配区间逻辑表达式进行task级别拆分同步,同时可以支持使用-speed参数(默认1GB)进行分配,比如4GB的表,当不指定时,默认1,那么就会生成4个逻辑表达式,如果使用-speed 2,那么就会生成2个逻辑表达式。 每个task完成后自动汇报耗时。 ![](img/18.png) 当然,也可以使用-batchcheck 参数预览每个单例切割出来的逻辑表达式 例如表大小4GB,-peed=1时 ![](img/19.png) 例如表大小4GB,-speed=4时 ![](img/20.png) 把所有的task都收拢,然后一起上报给job级别,最后发出finished通知 ![](img/21.png) 发出Fail通知,原因是目标表中已经存在数据了,但是没有进行truncate直接写入,导致数据翻倍,可使用-truncate进行生成写入的前置清空 ![](img/22.png) ![](img/23.png) 当然,类似这种数据翻倍的清空,就是两端数据不一致,稽核失败。也可以选择使用补数模式 -complement 补数模式,自动稽核两端数据,保证数据量高度一致 ![](img/24.png) 如遇到解析异常事件,会弹出最佳同步模式推荐 ![](img/25.png) 使用v2模式进行稽核 ![](img/26.png) 直接识别每个分区,两端数据量,出现差异直接分区级别overwrite覆写,覆写完成后进行二次稽核并汇报 ![](img/27.png) v2这种方式由于是单个分区写,线程池默认是3,相对比确实会慢一些,但想单分区多并发写入也是可以的,-thread 10(默认3),代表支持同时10个task在running **全量/分区同步(表结构+数据)- Jdbc Catalog 源、目标分区稽核,单分区覆写v2模式** exlSchema -source <源集群简称> -target <目标集群简称> -t <库名 /*支持同步多个库,逗号分隔*/> -r -i -o v2 -a -complement ![](img/28.png) 上面描述了,v2模式单分区覆写,优点是稳定,缺点也是很明显的,为什么会有v2的出现,假如一个表,单分区是10GB+,整表是TB级别的,这个时候为了尽量降低带宽的影响时,v2模式就能发挥稽核效率了。 但它确实也是龟速爬行,于是v3模式出现了。 **全量/分区同步(表结构+数据)- Jdbc Catalog 源、目标分区稽核,多攒批覆写v3模式** 攒批写入,-o v3 ![](img/29.png) ![](img/30.png) 当指定并发数-thread 10时 ![](img/31.png) 此时可以预览 select * from information_schema.task_runs where state='RUNNING' ![](img/32.png) task完成,汇报 ![](img/33.png) 当线程池逐渐减少时,代表还剩下多少个task在running ![](img/34.png) 结束 ![](img/35.png) ![](img/36.png) **全量/分区同步(表结构+数据)- Jdbc Catalog 仅对目标分区稽核,单分区覆写v4模式** -o v4 **全量/分区同步(表结构+数据)- Jdbc Catalog 仅对目标分区稽核,多攒批覆写v5模式** -o v5 v4,v5模式的使用场景:当目标表的数据量比源端多时,v4/v5不进行清理源端分区,不强调两端一致。只将源端存在,目标不存在的分区进行加载写入。如源端不存在,但目标存在的数据、分区,只对目标表进行处理。 无论是v1-v5模式,有的分区源端存在,但目标不存在的情况下,使用-add参数在数据同步时会自动生成添加分区语句。 v1-v5模式依赖Jdbc Catalog,如果启动时没有指定-a 那么将触发提示词 ![](img/38.png) 如: 源端表属性 ![](img/39.png) 目标端表属性 ![](img/40.png) 目标分区数大于源端,这个时候触发v4,v5模式,将以目标分区、数据量为准。 ![](img/41.png) **配置说明** 配置文件.exlSchema.yaml,同样需要维护starroks登录信息元数据表。 1. 支持集成官方的starrocks-cluster-sync,如用到官方scs,则需要在配置中填写目录 2. 支持自定义飞书群组机器人key 3. 支持自定义飞书代理地址 4. -h 查看程序帮助,有兴趣使用的可自行探索 ![](img/37.png)