作者 史鹏宙 CSIG云与智慧产业事业群研发工程师

ClickHouse作为OLAP分析引擎已经被广泛使用,数据的导入导出是用户面临的第一个问题。由于ClickHouse本身无法很好地支持单条大批量的写入,因此在实时同步数据方面需要借助其他服务协助。本文给出一种结合Canal+Kafka的方案,并且给出在多个MySQL实例分库分表的场景下,如何将多张MySQL数据表写入同一张ClickHouse表的方法,欢迎大家批评指正。

首先来看看我们的需求背景:

实时同步多个MySQL实例数据到ClickHouse,每天规模500G,记录数目亿级别,可以接受分钟级别的同步延迟;

某些数据库表存在分库分表的操作,用户需要跨MySQL实例跨数据库的表同步到ClickHouse的一张表中;

现有的MySQL binlog开源组件(Canal),无法做到多张源数据表到一张目的表的映射关系。

基本原理

一、使用JDBC方式同步

使用Canal组件完成binlog的解析和数据同步;

Canal-Server进程会伪装成MySQL的slave,使用MySQL的binlog同步协议完成数据同步;

Canal-Adapter进程负责从canal-server获取解析后的binlog,并且通过jdbc接口写入到ClickHouse;

优点:

Canal组件原生支持;

缺点:

Canal-Adpater写入时源表和目的表一一对应,灵活性不足;

需要维护两个Canal组件进程;

二、Kafka+ClickHouse物化视图方式同步

Canal-Server完成binlog的解析,并且将解析后的json写入Kafka;

Canal-Server可以根据正则表达式过滤数据库和表名,并且根据规则写入Kafka的topic;

ClickHouse使用KafkaEngine和Materialized View完成消息消费,并写入本地表;

优点:

Kafka支持水平扩展,可以根据数据规模调整partition数目;

Kafka引入后将写入请求合并,防止ClickHouse生成大量的小文件,从而影响查询性能;

Canal-Server支持规则过滤,可以灵活配置上游的MySQL实例的数据库名和表名,并且指明写入的Kafka topic名称;

缺点:

需要维护Kafka和配置规则;

ClickHouse需要新建相关的视图、Kafka Engine的外表等;

具体步骤

一、准备工作

如果使用TencentDB,则在控制台确认binlog_format为ROW,无需多余操作。

如果是自建MySQL,则在客户端中查询变量:

> show variables like '%binlog%';+-----------------------------------------+----------------------+| Variable_name | Value |+-----------------------------------------+----------------------+| binlog_format | ROW |+-----------------------------------------+----------------------+ > show variables like '%log_bin%';+---------------------------------+--------------------------------------------+| Variable_name | Value |+---------------------------------+--------------------------------------------+| log_bin | ON || log_bin_basename | /data/mysql_root/log/20146/mysql-bin || log_bin_index | /data/mysql_root/log/20146/mysql-bin.index |+---------------------------------+--------------------------------------------+

创建账号canal,用于同步binlog

CREATE USER canal IDENTIFIED BY 'canal';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'canal'@'%';

FLUSH PRIVILEGES;

二、Canal组件部署

前置条件:

Canal组件部署的机器需要跟ClickHouse服务和MySQL网络互通;

需要在机器上部署java8,配置JAVA_HOME、PATH等环境变量;

基本概念:

1. Canal-Server组件部署

Canal-Server的主要作用是订阅binlog信息并解析和定义instance相关信息,建议每个Canal-Server进程对应一个MySQL实例;

1)下载canal.deployer-1.1.4.tar.gz,解压

2)修改配置文件conf/canal.properties,需要关注的配置如下:

...# 端口相关信息,如果同一台机器部署多个进程需要修改canal.port = 11111canal.metrics.pull.port = 11112canal.admin.port = 11110...# 服务模式canal.serverMode = tcp...# Kafka地址canal.mq.servers = 172.21.48.11:9092# 使用消息队列时 这两个值必须为truecanal.mq.flatMessage = truecanal.mq.flatMessage.onlyData = true...# instance列表,conf目录下必须有同名的目录canal.destinations = example,example2

3)配置instance

可以参照example新增新的instance,主要修改配置文件conf/${instance_name}/instance.properties文件。

样例1: 同步某个数据库的以XX前缀开头的表

订阅 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文件

...# 上游MySQL实例地址canal.instance.master.address=172.21.48.35:3306...# 同步账户信息canal.instance.dbUsername=canalcanal.instance.dbPassword=canal...# 过滤数据库名称和表名canal.instance.filter.regex=testdb\\.tb_.*,

步骤3:在conf/canal.properties中修改 canal.destinations ,新增example2

样例2: 同步多个数据库的以XX前缀开头的表,且输出到Kafka

订阅 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文件

...# 上游MySQL实例地址canal.instance.master.address=172.21.48.35:3306...# 同步账户信息canal.instance.dbUsername=canalcanal.instance.dbPassword=canal...# 过滤数据库名称和表名canal.instance.filter.regex=empdb_.*\\.employees_.*...# Kafka的topic名称和匹配的规则canal.mq.dynamicTopic=employees_topic:empdb_.*\\.employees_.*canal.mq.partition=0 # Kafka topic的分区数目(即partition数目)canal.mq.partitionsNum=3 # 根据employees_开头的表中的 emp_no字段来进行数据hash,分布到不同的partitioncanal.mq.partitionHash=empdb_.*\\.employees_.*:emp_no

步骤3:在Kafka中新建topic employees_topic,指定分区数目为3

步骤4:在conf/canal.properties中修改 canal.destinations ,新增example3;修改服务模式为kafka,配置kafka相关信息;

# 服务模式canal.serverMode = kafka...# Kafka地址canal.mq.servers = 172.21.48.11:9092# 使用消息队列时 这两个值必须为truecanal.mq.flatMessage = truecanal.mq.flatMessage.onlyData = true...# instance列表,conf目录下必须有同名的目录canal.destinations = example,example2,example3

2. Canal-Adapter组件部署(只针对方案一)

Canal-Adapter的主要作用是通过JDBC接口写入ClickHouse数据,可以配置多个表的写入;

1)下载canal.adapter-1.1.4.tar.gz,解压;

2)在lib目录下新增clickhouse驱动jar包及httpclient的jar包 httpcore-4.4.13.jar、httpclient-4.3.3.jar、clickhouse-jdbc-0.2.4.jar;

3)修改配置文件conf/application.yml文件,修改canalServerHost、srcDataSources、canalAdapters的配置;

server: port: 8081spring: jackson: date-format: yyyy-MM-dd HH

clickhouse 同步mysql_腾讯大牛教你ClickHouse实时同步MySQL数据相关推荐

  1. oracle 表 实时同步,跨Oracle数据库实现表级别的实时同步

    Unsplash 一. 前言 这个问题是上一篇文章<Oracle跨数据库实现定时同步指定表中的数据>中所提问题的进一步延伸.考虑到对数据的实时性要求比较高,设置成定时同步,有点不妥,需要改 ...

  2. Maxwell 配置实时将MySQL数据同步到Kafka

    文章目录 环境准备 安装maxwell 下载地址 安装 创建元数据存放数据库 被同步的数据库上创建用于数据复制的账号,并授权 配置mysql同步到kafka任务 运行任务 全表同步 可能遇到的问题 M ...

  3. 腾讯云 yum mysql_腾讯云CentOS7.0使用yum安装mysql

    背景: 今天才申请了腾讯云+校园计划的1元服务器,(https://www.qcloud.com/event/qcloudSchool)安装了Centos7.0,在安装mysql的时候,使用yum l ...

  4. vue里实现同步执行方法_vue中的watch方法 实时同步存储数据

    RFID基础知识 BS:BinarySearch. TSA:TimeSlottedAloha. BSA:基本二进制搜索算法. DBSA:动态二进制搜索算法. RBSA:后退式二进制搜索算法. FSA: ...

  5. 腾讯视频上传视频如何同步到企鹅号

    企鹅号是腾讯的一个非常棒的产品,让一大批自媒体人赚了钱,我们都知道腾讯视频和企鹅号是互通的,腾讯视频中的视频也可以同步到企鹅号中.所以今天播放器家园网小编教大家如何将视频进行同步. 腾讯视频上传视频如 ...

  6. clickhouse 同步mysql_ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式

    原文出自:https://bohutang.me/2020/08/26/clickhouse-and-friends-mysql-gtid-replication/ 最后更新: 2020-09-03 ...

  7. binlog流程 mysql_小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来说 ...

  8. 教你用rsync同步

    rsync同步 rsync同步简介 一款快速增量备份工具 应用场景 rsync 包括如下的一些特性 配置rsync源服务器 rsync同步源简介 如何配置rsync源 rsync命令的用法 配置rsy ...

  9. 《穿越火线:枪战王者》手游客户端技术方案: 实时同步与手感优化

    一.项目背景 CF手游的团队有着相当丰富的FPS游戏制作经验,但是移动端开发经验相对匮乏.团队面对的挑战很大,我们需要在手机端完美还原CF十多个游戏模式,上百把枪械手感. 虽然我们有实时对战FPS游戏 ...

  10. RedHat Linux下利用sersync进行实时同步数据

    拓扑图如下: 可以有多个目标服务器,本机同步也可以(要同时开sersync服务和rsync守护进程) 需求: 1.源服务器上 要备份的是/data/bookfm/doc/book 目录包括子目录下的o ...

最新文章

  1. 深度学习--TensorFlow(3)线性神经网络(线性输入非线性输入)(实现)
  2. FPGA之道(10)布线资源与接口资源
  3. 全球首届“AI球球大作战:Go-Bigger多智能体决策智能挑战赛”开启
  4. 项目中遇到问题的解决方法合集
  5. 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构...
  6. MYSQL--一条SQL查询语句是如何执行的?
  7. 执行计划 分析一条sql语句的效率 mysql_mysql的SQL语句执行计划分析:EXPLAIN
  8. T-SQL: Adding More to Our Queries
  9. Oracle 多表查询
  10. [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
  11. 【基于物理的渲染(PBR)白皮书】(一) 开篇:PBR核心知识体系总结与概览
  12. android studio 2.3.3 最新 中文 汉化包 韩梦飞沙 安卓工作室 美化包
  13. 小学计算机说课稿模板,小学信息技术说课稿模板
  14. autoit脚本实现电脑加域,退域,重加域
  15. 解决你的R语言乱码问题
  16. 03.spring framework的AOP
  17. 重走民宿发展路:民宿十年 大浪淘沙始见金
  18. HashMap 容量为2次幂的原因
  19. Creator 拓展展Button组件 增加点击音效 默缩放。点击间隔
  20. 用格布拉斯准则剔除异常值,求不确定度

热门文章

  1. BZOJ1086[SCOI2005] 王室联邦
  2. BZOJ3680 吊打XXX
  3. vuex实例方法replaceState解决vuex页面刷新数据丢失问题
  4. umask 文件预设权限掩码
  5. html框架 book,HTML框架的基本结构的.doc
  6. 如何把静态成员导出_dll导入导出及local vftable问题
  7. spark保存数据到hbase_Spark读取Hbase中的数据
  8. python运算符手写笔记_Python基础学习笔记之运算符
  9. 16进制 转为图片 php_PHP实现简单RPC
  10. xcode动态改变窗口大小_[SwiftUI 100天] 在 SwiftUI 中动态过滤 @FetchRequest