百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

异构数据源的CDC实时同步系统

bigegpt 2024-08-28 12:23 8 浏览

引言:

此篇文章是基于公司内部分享的实际ppt整理而得,在公司内部已经实际运行几个月之久,效果比较明显,是一套比较纯粹的数据实时同步系统,核心组旨高效进行数据同步,而不是在数据同步过程中对数据进行处理。由于内容较多分为几篇列出:

一、什么是CDC,和传统的ETL系统有什么区别

数据变更抓取(change data capture, CDC): 通过数据源的事务日志抓取数据源变更,这能解决一致性问题(只要下游能保证变更应用到新库上)。它的问题在于各种数据源的变更抓取没有统一的协议,如 MySQL 用 Binlog,PostgreSQL 的WAL日志,最新版本用 Logical decoding 机制,MongoDB 里则是 oplog。

ETL目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。生产实践中多为从业务系统抽取数据到数仓的过程

采用CDC系统一般对实时性要求比较高,不希望对业务系统有影响;而传统的etl系统优势在于流程控制和中间处理过程的灵活性,性能反而不是追求的极致目标。

二、常见ETL工具对比

kettle是一个比较经典的etl工具,在数据同步场景下引用比较多,也是etl场景下使用最多的工具
dataX是阿里主推的开源工具,操作比较简单,在国内有着不错的应用
streamset是一套功能比较齐全,我个人比较推荐的系统,在etl场景下可以接入的数据源是最全的,你能想到的数据源基本都可以找到,中间大数据库场景下的中间组件如kafka也都涵盖在内,同时工作流的布局方式也是比较好的。


三、CDC工具对比

在工具调研的过程中,是需要面对一个具体的应用场景下,然后再谈方案的优劣的。我们面对的场景就是如何最快速度下,支持最大并发下的异构数据可以尽快进入到我们的MPP数仓体系中。这里我们选型的几个诉求:

  • 同时支持多个异构数据源的数据流转
  • 配置简单,最好支持零编码
  • 性能强大,能支持高并发处理
  • 最好支持实时流转处理

在面对这样的场景需求下,我们主要对下面的几个方案进行了调研:

1.各工具在整体数据系统中的位置和作用

其中greenplum是MPP系统的目的端,mysql为源端(当然我们期望可以支持越多的源是最好的),从这个图中我们可以看到,其中各个工具的作用,rds_dbsync、mysql_dfw和go-mysql-pgsql这三个工具不借助中间MQ,是采用自身的作用实现,虽然可以满足mysql-gpdb(postgresql),但系统的扩展性不强,仅实现固定源、目的端的同步,下面分别就各个工具说明:

2.rds_dbsync介绍
这个组件是我们目前在系统中应用范围最广的一个组件,它即可以实现直接的数据同步也可以实现基于解析binlog的CDC同步。它的特点非常突出,下面仅以直接数据同步说明:

  • 配置非常简单,仅需要配置mysql和gpdb的地址账号信息即可
  • 可以自由设置读取的表、列信息,同时可支持远端和目的端的表不同名、列不同名情况
  • 可以自由设置并行度,效率非常高,默认并行开启5个线程读取数据
  • 可自动生成基于postgresql语法的目的ddl,对分布式的postgresql(greenplum),也可以生成对应的ddl语句,非常方便

实际编辑的文件只有2个:my.cfg和loader_init.txt,其中txt文件可以自由指定

./mysql2pgsql -d -n -f  #生成对应的ddl语句
./myssql2pgsql -l loader_init.txt #默认开启5个线程读取mysql数据插入到postgresql
#对应参数
 -l 指定加载的table文件,不一定是loader_init.txt可以是任意名称
 -j 指定线程数,默认是5
 -d 获取ddl语句,不获取数据
 -n 在生成ddl语句不指定分区
 -f 在ddl语句生成过程中使用第一列作为分布键,在生成greenplum的ddl语句中非常有用
 -s 指定目的端的schema,比如数据要导入到newschema.testtable下,需要增加参数 -s newschema
 -b 指定buffer大小,单位KB,一般不需要额外指定
#loader_init.txt使用说明
#常规用法
tableA
tableB 
#源端和目的端表名不一致
destA:sourceA
#只同步部分列数据
destA:select colA,colB from sourceA
#只同步部分行数据
destA:select * from sourceA where colA>100

在非实时同步场景下,rds_dbsync表现优异,这个早年阿里开源的工具性能一直很好,但是长时间没有维护了,在CDC场景下的表现有很多问题:

  • 配置需要中间搭建一个postgresql的中转库
  • 需要在my.cfg中指定中转库的信息
  • 在极限场景下,解析binlog会出现异常,导致对mysql的连接会出现雪崩式的增加,拖垮mysql,这也是我们最早尝试也最终放弃它的原因

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...