Replayer:实现Any To StoneDB数仓版

原创
02/04 14:08
阅读数 12



背景


StoneDB数仓版是一款分析型、分布式、高性能的实时数仓产品,适用于实时数仓、BI加速、传统数仓加速等场景。目前StoneDB数仓版可以利用市面上众多开源产品来完成数据迁移和持续数据集成,如:FlinkCDC、DataX、Kettle、Sqoop、Spark等。但是由于各种工具适配的数据源、提供的能力和使用方式上各不相同,为了简化客户在数据迁移和数据持续集成的操作,降低部署成本,我们立项并开始Replayer项目的研发。

什么是Replayer


顾名思义 Replayer 是一个轻量级回放器组件,目标是实现CDC(Capture Data Change)能力和全量数据迁移能力。我们计划支持 MySQL/PostgreSQL/Oracle/SQL Server 等数据源,实现对数据源数据(全量或实时)的抽取、解析、本地落盘缓存,并写入到下游 StoneDB数仓版中。


Replayer 支持静态配置文件和动态下发配置,StoneDB数仓版支持一系列的 SQL 指令让用户极简的实现数据集成。目前设计的指令包括:


1. 数据源管理

a. 新增数据源:ADD DATASOURCE datasource_name url username password

b. 移除数据源:REMOVE DATASOURCE datasource_name

c. 修改数据源:ALTER DATASOURCE datasource_name url username password


2. 数据同步任务管理

a. 新增一个/一批同步任务:SYNC datasource_name database[.table] to catalog.database[.table] [OFFSET beginning|latest|AT_DATE date_str|AT_BINLOG binlog_pos]

b. 暂停一个/一批同步任务:SYNC PAUSE datasource_name database[.table] to catalog.database[.table]

c. 恢复一个/一批同步任务:SYNC RESUME datasource_name database[.table] to catalog.database[.table]

d. 删除一个/一批同步任务:SYNC DELETE datasource_name database[.table] to catalog.database[.table]

e. 查看任务执行状态: SHOW SYNC [FULL] [LIKE table_pattern]


3. Replayer组件管理

a. 绑定一个replayer实例:ADD REPLAYER host port token

b. 查看replayer实例:SHOW REPLAYERS [FULL]

c. 移除一个replayer实例:REMOVE REPLAYER host port


设计原理


Replayer被设计为一个无状态的、插件式的中间件,采用 Rust 语言实现。数据源端通过插件化的方式支持 MySQL、PostgreSQL、Oracle等数据库,数据被解析成含有 CDC 语义的日志事件并写入一个纯内存的环形队列中。环形队列下游支持数据本地持久化或者直接发送给StoneDB,本地持久化是为了更大的数据缓冲能力,降低全量抽取时对上游数据库的抽取时间,增加抽取的稳定性和减少对上游的抽取负载时间。


在环形队列的消费端,我们采用Hash算法将数据按照表名的维度聚集,然后通过 bincode 编码写入到对应的 Relay Log 中。这种设计既保证了表级别的有序又可以在写入和消费时充分利用多核的能力实现高效地存储和数据发送。最后利用 LogSink 组件顺序读取 Relay Log 数据并按照 DML / DDL 的语义直接通过 Raft Client 发送到 StoneDB 的存储层中。这种高效的写入方式绕过了 StoneDB SQL 层和调度层,省略了 SQL 解析、SQL调度的时间成本,性能比 SQL 写入提高了 2-5 倍左右。


从上游数据源的数据抽取到下游 RaftClient 发送,我们都采用了异步的执行模式,并且最大化的减少了数据的复制成本。借助 Rust 出色的异步框架(Tokio),使得 Replayer 组件性能表现十分优异。

成果和规划


目前我们已经完成了 MySQL binlog 和 全量 dump 的解析和后续数据链路中的数据处理、存储组件。能够完成对 MySQL的数据订阅并发送到下游数据库中。


在笔者 16C/32G 的笔记本,433Mb/s 无线AP,全量订阅一个 MySQL 实例并将数据输出到 console 中,数据处理效率为340Mb/s,内存使用量稳定在 2 MB 左右(进程名 binlog_cli)。由于无线 AP 不够稳定,数据处理效率浮动比较明显,在相同环境下最好的测试成绩可以跑到 470Mb/s。

下一步,我们将实现 StoneDB 与 Replayer 的深度集成,并完成其他类型的数据源适配工作。使用户通过简单的运维指令及可完成 StoneDB 的数据持续集成工作。

预计 StoneDB 数仓版将在 2024年6 月份推出 Replayer 组件和相关功能的预览版本,并提供完整的测试报告。我们也计划开源 Replayer 的核心部分源码,敬请期待。



加入StoneDB社区
Github:https://github.com/stoneatom/stonedb
Gitee:https://gitee.com/StoneDB/stonedb
社区官网:https://stonedb.io/
哔哩哔哩:https://space.bilibili.com/1154290084
Twitter:https://twitter.com/StoneDataBase
Linkedin:https://www.linkedin.com/in/stonedb/

加入社群

数据库人的聚集地

加入微信群(左):添加社区助理-小石侠;加入钉钉群(右):扫描下方钉钉群二维码。


点击阅读原文,给 StoneDB 点个 Star 鼓励一下吧~



本文分享自微信公众号 - StoneDB(StoneDB2021)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部