clickhouse批量插入数据_腾讯大牛教你ClickHouse实时同步MySQL数据
怎么合成照片clickhouse批量插⼊数据_腾讯⼤⽜教你ClickHouse实时同步
MySQL数据
⽂章转载⾃ 腾讯云数据库
| 作者 史鹏宙,CSIG云与智慧产业事业研发⼯程师信用卡申请被拒
ClickHouse作为OLAP分析引擎已经被⼴泛使⽤,数据的导⼊导出是⽤户⾯临的第⼀个问题。由于ClickHouse本⾝⽆法很好地⽀持单条⼤批量的写⼊,因此在实时同步数据⽅⾯需要借助其他服务协助。本⽂给出⼀种结合Canal+Kafka的⽅案,并且给出在多个MySQL实例分库分表的场景下,如何将多张MySQL数据表写⼊同⼀张ClickHouse表的⽅法,欢迎⼤家批评指正。
⾸先来看看我们的需求背景:
1. 实时同步多个MySQL实例数据到ClickHouse,每天规模500G,记录数⽬亿级别,可以接受分钟级别的同步延迟;
2. 某些数据库表存在分库分表的操作,⽤户需要跨MySQL实例跨数据库的表同步到ClickHouse的⼀张表中;
3. 现有的MySQL binlog开源组件(Canal),⽆法做到多张源数据表到⼀张⽬的表的映射关系。中国十大鬼楼
基本原理
⼀、使⽤JDBC⽅式同步
1. 使⽤Canal组件完成binlog的解析和数据同步;
2. Canal-Server进程会伪装成MySQL的slave,使⽤MySQL的binlog同步协议完成数据同步;
3. Canal-Adapter进程负责从canal-server获取解析后的binlog,并且通过jdbc接⼝写⼊到ClickHouse;
优点:
1. Canal组件原⽣⽀持;
缺点:
1. Canal-Adpater写⼊时源表和⽬的表⼀⼀对应,灵活性不⾜;
2. 需要维护两个Canal组件进程;
⼆、Kafka+ClickHouse物化视图⽅式同步
1. Canal-Server完成binlog的解析,并且将解析后的json写⼊Kafka;
2. Canal-Server可以根据正则表达式过滤数据库和表名,并且根据规则写⼊Kafka的topic;
3. ClickHouse使⽤KafkaEngine和Materialized View完成消息消费,并写⼊本地表;
优点:
1. Kafka⽀持⽔平扩展,可以根据数据规模调整partition数⽬;
2. Kafka引⼊后将写⼊请求合并,防⽌ClickHouse⽣成⼤量的⼩⽂件,从⽽影响查询性能;
3. Canal-Server⽀持规则过滤,可以灵活配置上游的MySQL实例的数据库名和表名,并且指明写⼊的Kafka topic名称;
缺点:
1. 需要维护Kafka和配置规则;
2. ClickHouse需要新建相关的视图、Kafka Engine的外表等;
具体步骤
⼀、准备⼯作
1. 如果使⽤TencentDB,则在控制台确认binlog_format为ROW,⽆需多余操作。
如果是⾃建MySQL,则在客户端中查询变量:
2. 创建账号canal,⽤于同步binlog
⼆、Canal组件部署
前置条件:
Canal组件部署的机器需要跟ClickHouse服务和MySQL⽹络互通;
需要在机器上部署java8,配置JAVA_HOME、PATH等环境变量;
基本概念:
1. Canal-Server组件部署
Canal-Server的主要作⽤是订阅binlog信息并解析和定义instance相关信息,建议每个Canal-Server进程对应⼀个MySQL实例;
1)下载canal.deployer-1.1.,解压
2)修改配置⽂件conf/canal.properties,需要关注的配置如下:
3)配置instance
可以参照example新增新的instance,主要修改配置⽂件conf/${instance_name}/instance.properties⽂件。
订阅 172.21.48.35的MySQL的testdb数据库中的以tb_开头的表的数据变更(例如tb_20200801 、 tb_20200802等),主要的步骤如下:
步骤1:创建example2实例:cddeployer/conf && cp -r example example2
步骤2:修改deployer/conf/example2/instance.properties⽂件
步骤3:在conf/canal.properties中修改 canal.destinations ,新增example2
订阅 172.21.48.35的MySQL的empdb_0数据库的employees_20200801表,empdb_1数据库的employees_20200802表,并且数据写⼊Kafka;
步骤1:创建example2实例:cddeployer/conf && cp -r example example3
步骤2:修改deployer/conf/example3/instance.properties⽂件
步骤3:在Kafka中新建topic employees_topic,指定分区数⽬为3
步骤4:在conf/canal.properties中修改 canal.destinations ,新增example3;修改服务模式为kafka,配置kafka相关信息;
2. Canal-Adapter组件部署(只针对⽅案⼀)
Canal-Adapter的主要作⽤是通过JDBC接⼝写⼊ClickHouse数据,可以配置多个表的写⼊;
1)下载canal.adapter-1.1.,解压;
2)在lib⽬录下新增clickhouse驱动jar包及httpclient的jar包 httpcore-4.4.13.jar、httpclient-4.3.3.jar、cli
ckhouse-jdbc-0.2.4.jar;
3)修改配置⽂件l⽂件,修改canalServerHost、srcDataSources、canalAdapters的配置;
4)修改配置⽂件conf/rdb/l⽂件
上述的配置⽂件中,由于开启了mirrorDb: true,⽬的端的ClickHouse必须有相同的数据库名和表名。
修改adapter的conf/rdb/l配置⽂件,指定源数据库和⽬标数据库
在conf/rdb ⽬录配置多个yml⽂件,分别指明不同的table名称。
Kafka 服务配置
⼀、调整合理的producer参数
确认Canal-Server⾥的canal.properties⽂件,重要参数见下表;
⼆、新建相关的topic名称
根据Canal-Server⾥instance⾥配置⽂件instance.properties,注意分区数⽬与canal.mq.partitionsNum 保持⼀致;
partition数⽬需要考虑以下因素:
1. 上游的MySQL的数据量。原则上数据写⼊量越⼤,应该分配更多的partition数⽬;
2. 考虑下游ClickHouse的实例数⽬。topic的partition分区总数 最好 不⼤于 下游ClickHouse的总实例数⽬,保证每个ClickHouse实例都能⾄少分配到⼀个partition;
ClickHouse服务配置
根据上游MySQL实例的表的schema新建数据表;
引⼊Kafka时需要额外新建Engine=Kafka的外表以及相关的物化视图表;
建议:
1. 为每个外表新增不同的 kafka_group_name,防⽌相互影响;
2. 设置kafka_skip_broken_messages 参数为合理值,遇到⽆法解析数据会跳过;
3. 设置合理的kafka_num_consumers值,最好保证所有ClickHouse实例该值的总和⼤于 topic的partition数⽬;新建相关的分布式查询表;
服务启动
启动相关的Canal组件进程;
1. canal-server: sh bin/startup.sh
2. canal-adapter: sh bin/startup.sh何以笙箫默所有插曲
在MySQL中插⼊数据,观察⽇志是否可以正常运⾏;
煮鸡蛋的做法如果使⽤Kafka,可以通过kafka-console-consumer.sh脚本观察binlog数据解析;
观察ClickHouse数据表中是否正常写⼊数据;
实际案例
需求:实时同步MySQL实例的ployees_20200801表和ployees_20200802数据表⽅案:使⽤⽅案⼆
环境及参数:
1.在MySQL新建相关表
2. Canal-Server配置
步骤1. 修改conf/canal.properties⽂件
步骤2. 新增employees实例,修改employees/instances.properties配置
3. Kafka配置
4. 新增topic employees_topic,分区数为3
5. ClickHouse建表
6. 启动Canal-Server服务
得组词语
MySQL实例上游插⼊数据,观察数据是否在Canal-Server解析正常,是否在ClickHouse中完成同步。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。