在处理实时数据时,需要即时地获得 数据库 表中数据的变化,然后将数据变化发送到Kafka中。这篇文章将介绍如何使用Kafka Connector完成这一工作。当获取实时数据时,数据源需要支持对数据变化进行反馈。不同的数据源采用了不同的技术和方法实现该功能,因为我们的业务数据库是MS SQL Server,因此这篇文章采用MSQL作为数据源。
选择Connector
首先需要选择Connector,不同的数据源有不同的Connector,例如ActiveMQ Connector、MySql Connector、MSSQL Connector等。即便是同一数据源,也可能有不同的第三方提供。我一共尝试了下面两个MSSQL Connector:
比较遗憾的是:这两个Connector,debezium的是Alpha版本,confluent的是Preview版本,反正都不是正式版,而 MySql 都已经有正式版本了,可见开源社区对MS真的不友好呀 >_
因为Change Tracking相比Change Data Capture来说,更轻量一些,因此我选用了confluent的Connector。其下载地址是: https://www.confluent.io/hub/
安装Connector
下载后,将其解压缩至 $KAFKA_HOME/connectors 文件夹下,如下图所示:
$KAFKA_HOME是你的kafka安装目录,如果是集群,要安装在集群下每台机器的connectors目录下。
在上面的截图中,可以看到我还安装了confluentinc-kafka-connect-hdfs-5.0.0和debezium-connector-sqlserver两个connector。
配置Connector
接下来要对Connector进行配置,此时可以回顾一下 Kafka Connect 基本概念 。Connector是一组独立的集群,并且是作为Kafka集群的客户端,我们首先需要对Connector进行配置,配置文件位于 $KAFKA_HOME/config/connect-distributed.properties:
# kafka集群地址
bootstrap.servers=kafka1:9092,kafka2:9092,kafka3:9092
# Connector集群的名称,同一集群内的Connector需要保持此group.id一致
group.id=connect-cluster
# 存储到kafka的数据格式
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
# 内部转换器的格式,针对offsets、config和status,一般不需要修改
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
# 用于保存offsets的topic,应该有多个partitions,并且拥有副本(replication)
# Kafka Connect会自动创建这个topic,但是你可以根据需要自行创建
# 如果kafka单机运行,replication.factor设置为1;当kafka为集群时,可以设置不大于集群中主机数
# 因为我这里的环境是3主机的集群,因此设为2
offset.storage.topic=connect-offsets
offset.storage.replication.factor=2
offset.storage.partitions=12
# 保存connector和task的配置,应该只有1个partition,并且有多个副本
config.storage.topic=connect-configs
config.storage.replication.factor=2
# 用于保存状态,可以拥有多个partition和replication
status.storage.topic=connect-status
status.storage.replication.factor=2
status.storage.partitions=6
# Flush much faster than normal,