文章目录

  • 前言
  • 一、Kafka Connect是什么?
  • 二、Debezium
  • 0.DEBEZIUM 什么鬼?
  • 1.Setup Environment
  • 2.Verify Environment
  • 3.安装debezium 到kafka cluster
  • 4.DB Setup
  • 5. 创建第一个debezium connector
  • 6. 测试Debezium
  • 总结


前言

断断续续学习Kafka已经有1年多时间,虽然工作中有涉及到kafka的相关内容,但是对于一些比较有有趣的kafka组件并没有很多机会去深挖,借着工作之余的时间来记录一下这些在学习的过程中发现的东西,目的也是分享给有需要的小伙伴。


一、Kafka Connect是什么?

引用一段官方解释:
“Kafka Connect is not an API like the Client API (which implements Producers and Consumers within the applications you write) or Kafka Streams. It is a reusable framework that uses plugins called Connectors to customize its behavior for the endpoints you choose to work with.”

简单来说,kafka connect是kafka 的组件之一,那么就有小伙伴要问了kafka都有哪些组件?这里拿confluent kafka做例子:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_kafka

那这个组件的作用是什么?
它的主要功能就是帮助我们把数据从Data Source 去Kafka Cluster, 更进一步说,正常开发情况下,我们会选择开发自己的Application(Java, .NET, Python) Application 去Data Source抓取数据,处理数据,然后传递给Kafka Cluster. 当我们选择使用kafka connect的时候,其实就是避免了我们自己去开发这样一套App 去实现message produce, 或者 message consumption, 但其实业务逻辑过于复杂的时候,使用kafka connector 就不一定适用了。因为kafka connector的出现并不是为了解决业务问题,更多是用于ETL, data synchonization 或者data transformation. 以下图为例,当我们把数据从Source搬去Kafka Cluster的时候,这类connector 被称为 Source Connector, 当我们把数据从Kafka Cluster搬去 Destination的时候,这类被称为Sink Connector.

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_02

几个简单的例子:
Source Connector: Debezium.
Sink Connector: JDBC Sink Connector, HDFS Sink Connector.

Kafka Connect 和 Connector的区别?

Kafka Connect 是kafka 的组件用于运行connector, kafka connect 会开放8083 端口创建要运行的connector. (当然前提是你的Kafka Connect已经安装好了相应的connector的包)

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_03

二、Debezium

0.DEBEZIUM 什么鬼?

正如以上讲到的,Debezium是connector的一种用于从Source拉取数据到kafka cluster, 但是DBZ最主要是在解决DB CDC(Change Data Capture)的问题,当数据库有的值发生改变的时候,这条改变的数据就会被发送给Kafka Topic。 大部分情况下都会用于data synchonization, 例如Database A 作为source DB, 系统里还有另外一个Database B用于生产各种report 作为destination DB, Debezium 可以将CDC records带去kafka, 然后使用JDBC Sink 将CDC changes 下沉到Database B. (不要问我为什么不在A 做Report)

1.Setup Environment

首先要搭建自己的kafka cluster环境,这里我们使用的是centos + confluent kafka

#安装JDK
yum install java-1.8.0-openjdk

#安装confluent 在local
curl -O http://packages.confluent.io/archive/5.3/confluent-5.3.2-2.12.tar.gz
curl -O https://packages.confluent.io/archive/5.4/confluent-5.4.1-2.12.tar.gz
~/confluent-5.3.2/bin/confluent-hub install --no-prompt confluentinc/kafka-connect-datagen:latest

#设置confluent Home
export PATH=~/confluent-5.3.2/bin:$PATH
systemctl set-default graphical.target
systemctl set-default multi-user.target

#运行confluent kafka
confluent local start

#关闭防火墙
systemctl stop firewalld

#安装confluent CLI kafka-cli-install
curl -L https://cnfl.io/cli | sh -s -- -b /usr/local/bin
https://docs.confluent.io/current/installation/installing_cp/zip-tar.html

成功运行之后会看到如下状态:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_kafka

2.Verify Environment

去到如下地址就可以访问control-center:
http://192.168.19.128:9021/clusterskafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_05

这里的control center是confluent 在kafka原始版里开发出来的一套UI工具,用于管理cluster, topic, connector, schema 等等,具体的可以参考官方网站去了解。

当然有的小伙伴可能会说有没有docker镜像可以跑? 答案是当然有, 具体可以参考以下官方教程: How to run Confluent using Docker

3.安装debezium 到kafka cluster

confluent-hub install debezium/debezium-connector-sqlserver:latest

到这里debezium 就算是安装完成了,当然要重启以下kafka cluster.

4.DB Setup

为了要使用Debezium, 我们当然要对数据库做一些操作才可以让Debezium去拉取CDC的数据,
具体的SQL Commands如下:

  1. 需要对数据enable cdc。
  2. 对要做CDC的table做注册。
  3. 对数据表经行变更。
  4. 查看变更数据。
GO
EXEC sys.sp_cdc_enable_db
GO

select * from INFORMATION_SCHEMA.ROUTINES order by 3;
/* To declear CDC for tables */
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'Production',
@role_name     = N'sa',
@supports_net_changes = 1

--This will make changes to the DB:
SELECT * FROM Production.Culture
UPDATE Production.Culture set Name = '123456test_10' WHERE CultureID = 'ar';

--Below command is used to check if the CDC records are in capture instance or not, the changes should be in below screenshot.
DECLARE @from_lsn binary (10), @to_lsn binary (10)
SET @from_lsn = sys.fn_cdc_get_min_lsn('Production_Culture')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT @from_lsn, @to_lsn, 'all'
SELECT *
FROM cdc.fn_cdc_get_all_changes_Production_Culture(@from_lsn, @to_lsn, N'all')
GO

当完成第二步的时候,DB会自动生成CDC table 如下:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_Source_06

关于LSN 的这段命令,主要是用来查看DB 的CDC 是否已经被DB监测到,然后写入到DB:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_Source_07


Make sure Firewall rule is set, SQL Agent is running

Make sure AQL Agent is running, if the changes you made to the table does not flag out at above cdc table, try restart SQL Agent

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_08


如果此处的SQL Server Agent 没有开启的话,update之后的数据就不会被检测到。当然肯定有小伙伴会问,Debezium和MSSQL CDC怎么关联,怎么就可以跑了, 这里贴一张图,因为CDC是DB自己的功能,Debezium只是借用了DB的这个功能,将changes从DB 拉取出来,转移到了kafka.

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_09


这里是微软对于CDC的官方介绍,感兴趣的同学可以了解下

5. 创建第一个debezium connector

这里我们使用的是postman + post method 去到 kafka 8083端口进行创建:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_10

http://192.168.19.128:8083/connectors
{
  "name": "MSSQLConnectorPerson.AddressType",
  "config": {
    "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector",
    "database.hostname": "192.168.50.81",
    "database.port": "1433",
    "database.user": "sa",
    "database.password": "1234",
    "database.dbname": "AdventureWorks2016",
    "database.server.name": "AdventureWorks2016",
    "table.whitelist": "Person.AddressType",
    "database.history.kafka.bootstrap.servers": "192.168.19.128:9092",
    "database.history.kafka.topic": "Topic_History"
  }
}

当然我们也可以用以下postman get 去查看connector的状态:

http://192.168.19.128:8083/connectors/MSSQLConnectorCulture/status

kafka连接失败时ProducerListener监听不到 kafka connect distributed_kafka_11


当然我们也可以去Control Center查看Connector的状态:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_12

6. 测试Debezium

我们对source DB做一个变更:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_kafka_13

UPDATE Production.Culture set Name = 'blue day' WHERE CultureID = 'ar';

kafka连接失败时ProducerListener监听不到 kafka connect distributed_数据_14


当我们去到Kafka Control Center就会看到这条CDC Records:

kafka连接失败时ProducerListener监听不到 kafka connect distributed_kafka_15


如果我们展开这条消息就可以看到其实里面存储了DB 里面before 和 after的值。因为Debezium 默认的是会使用schema registry 来enforce kafka message的格式和DB的一致性,关于schema registry 我会在之后的文章中讲解,这里我们只是观察现象。

kafka连接失败时ProducerListener监听不到 kafka connect distributed_Source_16

总结

到此我们完成了对Debezium的安装,配置,运行,和测试。整体的还属于比较基础的部分,当然Debezium乃至于kafka connect 这里面还有很多精妙的地方,我会在后面的文章中给大家挖一些有价值,有意思的东西分享。

下一篇文章
会讲解如何将Kafka Topic里面的debezium的message 搬去 destination DB.
下下篇文章
会讲解如何使用KAFKA SMT 的特性对数据做transformation(文案还没出来,不过代码参考这里