我想在Apache Kafka中建立实时数据管道。我有位于远程位置的数据库,并且该数据库不断更新。我可以使用哪个Kafka connect API来从数据库中提取数据并实时提取到Kafka Broker中的人吗?稍后,我将使用kafka流和KSQL来运行临时查询来执行指标。
任何帮助将不胜感激!
答案 0 :(得分:1)
如果要创建实时数据管道,则需要使用能够从MySQL流式传输更改的更改数据捕获(CDC)工具。我建议使用Debezium,这是一个用于捕获变更数据的开源分布式平台。
捕获插入
将新记录添加到表中时,将生成类似于以下内容的JSON:
{
"payload":{
"before":null,
"after":{
"id":1005,
"first_name":"Giorgos",
"last_name":"Myrianthous",
"email":"giorgos@abc.com"
},
"source":{
"name":"dbserver1",
"server_id":223344,
"ts_sec":1500369632,
"gtid":null,
"file":"mysql-bin.000003",
"pos":364,
"row":0,
"snapshot":null,
"thread":13,
"db":"inventory",
"table":"customers"
},
"op":"c",
"ts_ms":1500369632095
}
}
before
对象为null,并且after
对象包含新插入的值。请注意,op
属性是c
,指示这是一个CREATE事件。
捕获更新
假设email
属性已更新,将生成类似于以下内容的JSON:
{
"payload":{
"before":{
"id":1005,
"first_name":"Giorgos",
"last_name":"Myrianthous",
"email":"giorgos@abc.com"
},
"after":{
"id":1005,
"first_name":"Giorgos",
"last_name":"Myrianthous",
"email":"newEmail@abc.com"
},
"source":{
"name":"dbserver1",
"server_id":223344,
"ts_sec":1500369929,
"gtid":null,
"file":"mysql-bin.000003",
"pos":673,
"row":0,
"snapshot":null,
"thread":13,
"db":"inventory",
"table":"customers"
},
"op":"u",
"ts_ms":1500369929464
}
}
通知op
(现在为u
),表示这是一个UPDATE事件。 before
对象显示更新前的行状态,after
对象捕获更新后的行的当前状态。
捕获删除内容
现在假定该行已被删除;
{
"payload":{
"before":{
"id":1005,
"first_name":"Giorgos",
"last_name":"Myrianthous",
"email":"newEmail@abc.com"
},
"after":null,
"source":{
"name":"dbserver1",
"server_id":223344,
"ts_sec":1500370394,
"gtid":null,
"file":"mysql-bin.000003",
"pos":1025,
"row":0,
"snapshot":null,
"thread":13,
"db":"inventory",
"table":"customers"
},
"op":"d",
"ts_ms":1500370394589
}
}
op
new等于d
,表示DELETE事件。 after
属性将为null,并且before
对象包含被删除之前的行。
您还可以查看其网站中提供的extensive tutorial。
编辑: Example configuration用于MySQL数据库
{
"name": "inventory-connector", (1)
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector", (2)
"database.hostname": "192.168.99.100", (3)
"database.port": "3306", (4)
"database.user": "debezium", (5)
"database.password": "dbz", (6)
"database.server.id": "184054", (7)
"database.server.name": "fullfillment", (8)
"database.whitelist": "inventory", (9)
"database.history.kafka.bootstrap.servers": "kafka:9092", (10)
"database.history.kafka.topic": "dbhistory.fullfillment" (11)
"include.schema.changes": "true" (12)
}
}
1我们在Kafka Connect中注册连接器时的名称 服务。
2此MySQL连接器类的名称。
3的地址 MySQL服务器。
4 MySQL服务器的端口号。
5的名字 具有所需特权的MySQL用户。
6的密码 具有所需特权的MySQL用户。
7连接器的 标识符在MySQL集群中必须唯一,并且类似于 MySQL的服务器ID配置属性。
8的逻辑名称 MySQL服务器/集群,形成一个命名空间,并在所有 连接器写入的Kafka主题的名称,Kafka 连接架构名称以及相应的Avro的名称空间 使用Avro连接器时的架构。
9所有数据库的列表 由该连接器将监视的服务器托管。这是 可选,还有其他属性可用于列出数据库和 表以包括或不包括在监视中。
10卡夫卡名单 该连接器将用于写入和恢复DDL的代理 数据库历史记录主题的语句。
11数据库名称 连接器将在其中写入和恢复DDL的历史主题 陈述。本主题仅供内部使用,不应使用 由消费者。
12该标志指定连接器应 在架构更改主题上生成名为fullfillment events的事件, 消费者可以使用的DDL更改。
答案 1 :(得分:0)
如果您正在从MySQL数据库中读取数据,请使用Confluent的JDBC Source连接器。 https://github.com/confluentinc/kafka-connect-jdbc/ 您还需要下载MYSQL驱动程序并将其与kafka jar一起使用:https://dev.mysql.com/downloads/connector/j/5.1.html