前言
最近公司需要搭建基于 Flink 框架的实时数仓,为了保证数仓的稳定性,决定引用消息中间件 Kafka 。Kafka 的作用在于 "削峰填谷" ,所谓的“削峰填谷”就是指缓冲上下游瞬时突发流量,使其更平滑。特别是对于那种发送能力很强的上游系统,如果没有消息引擎的保护,“脆弱”的下游系统可能会直接被压垮导致全链路服务“雪崩”。但是,一旦有了消息引擎,它能够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡。消息引擎系统的另一大好处在于发送方和接收方的松耦合,这也在一定程度上简化了应用的开发,减少了系统间不必要的交互。
那么问题来了,如何将源库中的全量、增量数据导入至 Kafka 主题中呢?本文章将采用 Kafka connector 的方式连接 MySQL ,来实现端到端的数据同步。
JDBC Connector
JDBC connector 允许您通过JDBC驱动程序将任何关系型数据库中的数据导入到Kafka的主题Topic中。通过使用JDBC,这个连接器可以支持各种数据库,不需要为每个数据库定制代码。
通过定期地执行SQL查询语句并为结果集中的每一行创建输出记录来加载数据。在默认情况下,在一个数据库中的所有表都会被复制,每个表都复制到自己的输出主题。数据库那些新的或删除的表被监视并自动适应调整。当从表中复制数据时,连接器可以仅仅加载新增或修改的行通过指定哪些列应当被用来发现新增或修改的数据。
测试环境
IP
操作系统
配置
服务器用途
172.21.22.186
CentOS Linux release 7.3.1611 (Core)
4vC/8Gb/400Gb
测试集群
172.21.22.187
CentOS Linux release 7.3.1611 (Core)
4vC/8Gb/400Gb
测试集群
172.21.22.188
CentOS Linux release 7.3.1611 (Core)
4vC/8Gb/400Gb
测试集群
172.21.23.238
CentOS Linux release 7.3.1611 (Core)
4vC/8Gb/400Gb
MySQL/1
前置条件
主机名
JDK
ZK
Kafka
master
jdk1.8.0_251
zookeeper-3.4.14
kafka_2.11-2.2.0
slave1
jdk1.8.0_251
zookeeper-3.4.14
kafka_2.11-2.2.0
slave2
jdk1.8.0_251
zookeeper-3.4.14
kafka_2.11-2.2.0
以下测试请在能够正常生产消费的 kafka 集群中进行
1. incrementing 自增模式
准备工作
连接 mysql 创建测试库、表
[bigdata@slave2 ~]$ mysql -h 172.21.23.238 -u root -p
[bigdata@slave2 ~]$ # 密码省略
mysql> create database test_kafka_connector;
mysql> use test_kafka_connector;
# 创建 `test_kafka_connector` 库 omneo_incrementing测试表
CREATE TABLE IF NOT EXISTS test_kafka_connector.omneo_incrementing(
pid int(11) NOT NULL AUTO_INCREMENT,
uuid varchar(100) NOT NULL,
firstname varchar(20) CHARACTER SET utf8 DEFAULT NULL,
lastname varchar(20) CHARACTER SET utf8 DEFAULT NULL,
birthdate varchar(20),
postalcode varchar(20),
city varchar(20),
sexe varchar(20),
status varchar(20),
PRIMARY KEY (pid)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 创建 `kafka_connector` 库 kafka_omneo_incrementing测试表
CREATE TABLE IF NOT EXISTS kafka_connector.kafka_omneo_incrementing(
pid int(11) NOT NULL AUTO_INCREMENT,
uuid varchar(100) NOT NULL,
firstname varchar(20) CHARACTER SET utf8 DEFAULT NULL,
lastname varchar(20) CHARACTER SET utf8 DEFAULT NULL,
birthdate varchar(20),
postalcode varchar(20),
city varchar(20),
sexe varchar(20),
status varchar(20),
PRIMARY KEY (pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
切换至 $KAFKA_HOME/config 目录,修改/新增 source-incrementing-mysql.properties ,内容如下:
name=mysql-a-source-omneo
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
connection.url=jdbc:mysql://172.21.23.238:3306/test_kafka_connector?user=root&password=1qaz@WSX
# incrementing 自增
mode=incrementing
# 自增字段 pid
incrementing.column.name=pid
# 白名单表 person
table.whitelist=omneo_incrementing
# topic前缀 mysql-kafka-
topic.prefix=mysql-kafka-
修改、新增 sink-incrementing-mysql.properties ,内容如下:
name=mysql-a-sink-omneo
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
#kafka的topic名称
topics=mysql-kafka-omneo_incrementing
# 配置JDBC链接