Debezium 如何使用 Kafka Connect 正确注册 SqlServer 连接器 - 连接被拒绝

Posted

技术标签:

【中文标题】Debezium 如何使用 Kafka Connect 正确注册 SqlServer 连接器 - 连接被拒绝【英文标题】:Debezium How do I correctly register the SqlServer connector with Kafka Connect - connection refused 【发布时间】:2020-07-20 05:38:35 【问题描述】:

问题:

如何使用 Kafka Connect 正确注册 SqlServer 连接器以连接到独立的 SQL Server 实例?注意:我没有在 Docker 中运行 SQL Server。

错误:

错误:引起:com.microsoft.sqlserver.jdbc.SQLServerException: 与主机 127.0.0.1、端口 1433 的 TCP/IP 连接失败。错误: “连接被拒绝(连接被拒绝)。验证连接 特性。确保 SQL Server 实例正在运行 主机并在端口接受 TCP/IP 连接。确保 TCP 与端口的连接不会被防火墙阻止。"。

疑难解答:

    在 dbo.Posts 表上启用 CDC(见下文) 已验证 TCP/IP 已启用,并在 SQL Server 配置管理器的 SQL Server 网络配置中将所有地址设置为启用并在端口 1433 上处于活动状态 已禁用 Windows 防火墙 在 SQL Server 配置管理器中启用 SQL Server Browser 已验证我可以通过以下方式远程登录:(127.0.0.1 1433; localhost 1433; lt-ls231 1433)

上下文:

我正在尝试使用 Docker 在 Windows 10 上设置 Debezium。我可以毫无问题地在 Powershell 中成功运行以下命令:

docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:1.1 

docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.1 

docker run -it --rm --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e  OFFSET_STORAGE_TOPIC=my_connect_offsets -e  STATUS_STORAGE_TOPIC=my_connect_statuses --link zookeeper:zookeeper --link kafka:kafka debezium/connect:1.1

当我尝试使用 Kafka-Connect connect 注册 SQL Server 连接时出现错误(见上文),我运行以下命令:

Invoke-RestMethod -Method Post -Uri 'http://localhost:8083/connectors/' -Headers @'Accept' = 'application/json'; 'Content-Type' = 'application/json' -Body '"name": "mssqlserver-localhost-testDb-connector",  "config": "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", "database.hostname": "127.0.0.1", "database.port": "1433", "database.user": "svc_kafka", "database.password": "password", "database.dbname": "Posts", "database.server.name": "LT-LS231", "table.whitelist": "dbo.Posts", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.LT-LS231" '

格式化后的JSON如下:

Invoke-RestMethod -Method Post -Uri 'http://localhost:8083/connectors/' -Headers @'Accept' = 'application/json'; 'Content-Type' = 'application/json' -Body '

  
    "name": "mssqlserver-localhost-testDb-connector",  
    "config": 
        "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", 
        "database.hostname": "127.0.0.1", 
        "database.port": "1433", 
        "database.user": "svc_kafka", 
        "database.password": "password", 
        "database.dbname": "Posts", 
        "database.server.name": "LT-LS231", 
        "table.whitelist": "dbo.Posts", 
        "database.history.kafka.bootstrap.servers": "kafka:9092", 
        "database.history.kafka.topic": "dbhistory.LT-LS231" 
  
'

这是根据 Debezium 网站上提供的 JSON 建模的:https://debezium.io/documentation/reference/1.1/connectors/sqlserver.html#sqlserver-deploying-a-connector

【问题讨论】:

【参考方案1】:

问题在于对localhost 的引用。如果您在 Docker 容器中运行 Connect,则 localhost 是容器的本地主机,而不是机器的本地主机。尝试在docker0 接口或所有接口上公开SQL Server,然后在注册请求中使用docker0 IP。

【讨论】:

如何在 Docker0 上公开 DQL Server?这是否意味着我必须在 Docker 中运行 SQL Server?如果是的话,这就是我试图避免的。在生产环境中,这些都不会在 Docker 中。【参考方案2】:

非生产环境的解决方案是使用host.docker.internal。这可以在 Docker 的网站上找到:https://docs.docker.com/docker-for-windows/networking/。请参阅标题为I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST 的部分。我需要查看 Jiri 的回答中推荐的 Docker0

正确的JSON如下:

  
    "name": "LT-LS231-mssqlserver-connector",  
    "config": 
        "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", 
        "database.server.name": "staging", 
        "database.hostname": "host.docker.internal", 
        "database.port": "1433", 
        "database.user": "svc_kafka", 
        "database.password": "*********", 
        "database.dbname": "Test", 
        "table.whitelist": "dbo.Posts", 
        "database.history.kafka.bootstrap.servers": "kafka:9092", 
        "database.history.kafka.topic": "dbhistory.Posts" 
  

【讨论】:

也一样——只是 Linux 不支持host.docker.internal,所以 ddocker0 是那里的解决方案。 @JiriPechanec 谢谢。你能看看我发布的相关问题吗?我将不胜感激。 ***.com/questions/61105240/… 和 ***.com/questions/61106298/…

以上是关于Debezium 如何使用 Kafka Connect 正确注册 SqlServer 连接器 - 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 Kafka 连接器以在 Debezium 中使用自定义转换?

如何使用Debezium从MS SQL中将250张表导入Kafka

如何使用 debezium mysql 连接器 kafka 进行初始快照加载?

Debezium 如何使用 Kafka Connect 正确注册 SqlServer 连接器 - 连接被拒绝

如何使用debezium更改数据捕获在mysql中捕获数据并在kafka connect中使用jdbc sink?

使用 Debezium 将所有数据库表捕获到一个 Kafka 主题 [重复]