使用Confluent REST API运行JDBC Source连接器失败求助
看起来你遇到的核心问题是单机模式下JDBC Source连接器正常运行,但通过REST API创建时无法连接MySQL,而JDBC Sink用REST API却能正常工作。结合你的场景,我整理了几个最可能的原因和对应的解决方案:
1. 网络访问差异(最常见)
单机模式下,你的Connect进程和MySQL在同一台机器,localhost:3306能直接访问到数据库。但如果是通过REST API操作的分布式Connect集群(比如运行在Docker容器、虚拟机或另一台服务器),localhost指向的是Connect worker所在的机器/容器,而非MySQL所在的主机。
解决方案:
- 把
connection.url中的localhost替换成MySQL所在机器的实际IP地址(比如192.168.1.100);如果是Docker Desktop环境,可以用host.docker.internal代替localhost来访问宿主机的服务:"connection.url":"jdbc:mysql://192.168.1.100:3306/kafka" - 验证Connect worker的网络连通性:如果是容器部署,进入容器执行
telnet 192.168.1.100 3306或nc -zv 192.168.1.100 3306,确认能正常连通MySQL端口。
2. 配置参数类型不匹配
你在REST API的JSON配置里,将tasks.max、poll.interval.ms、validate.non.null这些参数传成了字符串类型(比如"tasks.max":"1")。虽然Kafka Connect通常会自动转换类型,但部分场景下可能导致解析异常,进而影响连接初始化流程。
解决方案:
把这些参数改成对应的数据类型:
"tasks.max":1, "poll.interval.ms":1000, "validate.non.null":false
3. MySQL的绑定地址与权限限制
如果MySQL配置文件(my.cnf/my.ini)中bind-address设置为127.0.0.1,那么仅允许本地访问,Connect worker所在机器无法连接。另外,你的MySQL用户myuser可能只被授权了本地访问权限。
解决方案:
- 修改MySQL配置:将
bind-address改为0.0.0.0(允许所有IP访问),然后重启MySQL服务。 - 给
myuser授权远程访问权限:
(GRANT ALL PRIVILEGES ON kafka.* TO 'myuser'@'%' IDENTIFIED BY 'mypass'; FLUSH PRIVILEGES;%表示允许所有IP,也可以指定Connect worker的具体IP来提升安全性)
4. 用验证端点提前排查配置问题
错误提示里提到可以用/{connectorType}/config/validate端点验证配置,这个能帮你提前发现问题,而不用尝试创建连接器。发送如下请求:
curl -X POST -H "Content-Type: application/json" --data '{ "config": { "connector.class":"io.confluent.connect.jdbc.JdbcSourceConnector", "tasks.max":1, "connection.url":"jdbc:mysql://your-mysql-ip:3306/kafka", "connection.user":"myuser", "connection.password":"mypass", "table.whitelist":"MY_TABLE", "mode":"timestamp", "timestamp.column.name":"ROWVERSION", "validate.non.null":false, "topic.prefix":"MYSQL-", "table.types":"TABLE,VIEW", "poll.interval.ms":1000 } }' http://localhost:8083/connectors/JdbcSourceConnector/config/validate
返回的结果会详细说明配置中的错误,帮你快速定位问题。
补充说明
你提到JDBC Sink用REST API没问题,这说明Connect的基础环境和插件是正常的,问题大概率出在Source连接器的初始化逻辑对网络/配置的敏感度更高,或者你在Sink配置里其实用了IP而非localhost(只是自己没注意到)。
内容的提问来源于stack exchange,提问作者Giorgos Myrianthous

