如何从Apache Kafka中的远程数据库中提取数据?

时间:2018-08-27 21:45:14

标签: mysql apache-kafka apache-kafka-connect

我想在Apache Kafka中建立实时数据管道。我有位于远程位置的数据库,并且该数据库不断更新。我可以使用哪个Kafka connect API来从数据库中提取数据并实时提取到Kafka Broker中的人吗?稍后,我将使用kafka流和KSQL来运行临时查询来执行指标。

任何帮助将不胜感激!

2 个答案:

答案 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