Kafka 系列 —(11)Kafka Connect 深入指南

目录

1.运行 Kafka Connect

1.1 准备条件(通用)

1.2 启动 Standalone(示例)

1.3 启动 Distributed(示例)

1.4 必备的内部主题(生产环境注意)

2.连接器实例:示例与命令

2.1 示例 A — 文件数据源(FileStreamSource)与文件数据池(FileStreamSink)

2.1.1 FileStreamSourceConnector(示例配置 JSON)

2.1.2 FileStreamSinkConnector(写到本地文件)

2.1.3 注意点(File connectors)

2.2 示例 B — MySQL → Elasticsearch(推荐方案:Debezium MySQL Source + Elasticsearch Sink)

2.2.1 Debezium MySQL Source(示例)

2.2.2 Elasticsearch Sink(示例)

2.2.3 工作流程(MySQL binlog → Kafka → ES)

2.2.4 重要注意点(生产)

3.深入理解 Kafka Connect(核心概念与运维)

3.1 Connector / Task / Worker 的关系

3.2 Offsets、配置、状态如何存储(分布式模式)

3.3 Single Message Transforms(SMT)

3.4 Schema 与 Converters

3.5 错误处理策略(容错与 DLQ)

3.6 Exactly-once 语义与事务

3.7 扩容、任务再平衡与故障恢复

3.8 安全:TLS / SASL / ACL / RBAC

3.9 监控与指标

3.10 性能与调优关键点

3.11 开发自定义 Connector(要点)

3.12 常见运维场景与建议

4.最佳实践

5.常见问题与排查表


包含三大部分:

  1. 如何运行 Connect(standalone / distributed、启动示例、常见参数)

  2. 两个示例连接器实例配置与创建命令

    1. 文件数据源 + 文件数据池(FileStreamSource / FileStreamSink)

    2. MySQL → Elasticsearch(Debezium / JDBC Source + ES Sink)

  3. 深入理解 Connect 的内部概念、健壮性、运维与调优要点(offsets、tasks、SMT、错误处理、安全、监控等)


1.运行 Kafka Connect

Kafka Connect 有两种运行模式:

  • Standalone mode(单机/开发):适合单实例、简单任务、开发/测试。配置和偏移存储在本地文件或内存,单点。

  • Distributed mode(分布式/生产):适合生产、高可用。多个 Connect worker 组成一个集群,通过 Kafka 内部主题存储配置、offset、状态,实现容错与伸缩。

1.1 准备条件(通用)

  • 已有 Kafka 集群(至少 3 个 broker 推荐)

  • (可选)Confluent Schema Registry(使用 Avro 时)

  • Connect 插件(connector jars)放到 plugin.path

  • 设置 JVM 堆、GC、日志

1.2 启动 Standalone(示例)

假设 Kafka 安装目录 $KAFKA_HOME

编辑 config/connect-standalone.properties(基础示例):

bootstrap.servers=broker1:9092,broker2:9092
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

offset.storage.file.filename=/tmp/connect-offsets.properties
offset.flush.interval.ms=10000

# plugin path where connector jars are placed
plugin.path=/opt/kafka-connect/plugins

启动命令:

$KAFKA_HOME/bin/connect-standalone.sh config/connect-standalone.properties config/my-connector.properties

Standalone 模式下你把 connector 的配置文件作为命令行参数传入(一次性启动一个 worker + 指定要运行的 connector)。

1.3 启动 Distributed(示例)

编辑 config/connect-distributed.properties

bootstrap.servers=broker1:9092,broker2:9092
key.converter=io.confluent.connect.avro.AvroConverter
value.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://schema-registry:8081
value.converter.schema.registry.url=http://schema-registry:8081

# Internal topics - required; must create with replication >= 3 in prod
config.storage.topic=connect-configs
offset.storage.topic=connect-offsets
status.storage.topic=connect-status
offset.flush.interval.ms=10000

plugin.path=/opt/kafka-connect/plugins

# worker group id
group.id=connect-cluster
rest.advertised.host.name=connect-01.example.com
rest.port=8083

启动多个 worker(在不同主机/容器上):

$KAFKA_HOME/bin/connect-distributed.sh config/connect-distributed.properties

当多个 worker 启动并指向相同的 Kafka brokers 与相同的 config.storage.topic/offset.storage.topic 时,它们会自动形成集群并分配 task。

1.4 必备的内部主题(生产环境注意)

在分布式模式下,必须确保下列内部主题存在并有适当的分区和 replication:

  • connect-configs(config.storage.topic)

  • connect-offsets(offset.storage.topic)

  • connect-status(status.storage.topic)

推荐在生产环境使用 replication.factor = 3 且 partitions = 3(或按负载定)。你可以预建这些 topic 并设置合适的 retention.ms


2.连接器实例:示例与命令

下面给出两组可直接运行的示例:File 源/汇(适合测试),以及 MySQL → Elasticsearch(生产级典型管道)。


2.1 示例 A — 文件数据源(FileStreamSource)与文件数据池(FileStreamSink)

适用:开发演示、日志管道入 Kafka、或将 Kafka 写回文件(如调试)。

2.1.1 FileStreamSourceConnector(示例配置 JSON)

这是 Kafka 自带的示例 connector(文件 → topic)。

file-source.json

{
  "name": "local-file-source",
  "config": {
    "connector.class": "org.apache.kafka.connect.file.FileStreamSourceConnector",
    "tasks.max": "1",
    "file": "/var/log/myapp/app.log",
    "topic": "app-logs",
    "key.converter": "org.apache.kafka.connect.storage.StringConverter",
    "value.converter": "org.apache.kafka.connect.storage.StringConverter"
  }
}

创建(Distributed 模式,假设 Connect REST 在 http://connect-host:8083):

curl -X POST -H "Content-Type: application/json" --data '@file-source.json' http://connect-host:8083/connectors

2.1.2 FileStreamSinkConnector(写到本地文件)

file-sink.json

{
  "name": "local-file-sink",
  "config": {
    "connector.class": "org.apache.kafka.connect.file.FileStreamSinkConnector",
    "tasks.max": "1",
    "topics": "app-logs",
    "file": "/tmp/out-app.log",
    "key.converter": "org.apache.kafka.connect.storage.StringConverter",
    "value.converter": "org.apache.kafka.connect.storage.StringConverter"
  }
}

创建方式同上。

2.1.3 注意点(File connectors)

  • FileStream 连接器是单任务、单文件的;生产环境不适合做高吞吐写入。主要用于演示/调试。

  • tasks.max 控制并行度;文件源通常限制为 1(文件并行读取复杂)。

  • 如果文件在多个主机上,考虑使用 Filebeat/Fluentd 将日志发送到 Kafka (更适合生产)。


2.2 示例 B — MySQL → Elasticsearch(推荐方案:Debezium MySQL Source + Elasticsearch Sink)

有两种主流做法:

  1. Debezium MySQL Source Connector(CDC) + Elasticsearch Sink Connector

          优点:实时捕获数据库行级变更(insert/update/delete)

  1. JDBC Source Connector(全表/增量) + Elasticsearch Sink

          适用于无法使用 binlog 的场景或批量同步

下面以 Debezium + ES Sink 为例(更为常见、实时)。

2.2.1 Debezium MySQL Source(示例)

mysql-debezium-source.json(示例):

{
  "name": "mysql-debezium-source",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "tasks.max": "1",
    "database.hostname"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

34号树洞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值