SQL 服务器的 Debezium 连接器 - 连接被拒绝

Debezium Connector for SQL Server - connection refused

我想用Kafka发布MSSQL CDC事件。

我正在使用 Docker 个容器用于:

容器启动如下:

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

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

docker run -it --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my-connect-configs -e OFFSET_STORAGE_TOPIC=my-connect-offsets -e ADVERTISED_HOST_NAME="localhost" --link zookeeper:zookeeper --link kafka:kafka debezium/connect

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=xxxxxxxxxxxxx" -p 1433:1433 --name sql1 -d mcr.microsoft.com/mssql/server:2017-CU8-ubuntu

所有容器 运行 成功启动。

然后我在 SQL 服务器容器中创建了新的 MSSQL 数据库。在新数据库中创建了 1 table 并为此 table 打开了 CDC。 CDC 工作正常。

然后我将下面的连接器配置发送到 Kafka Connect REST API,如下所示:

curl -X POST -H "Content-Type: application/json" -d @test-mssql-connector.json http://localhost:8083/connectors

使用测试-mssql-connector.json

{
  "name": "test-mssql-connector5",  
  "config": {
    "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", 
    "database.hostname": "localhost", 
    "database.port": "1433", 
    "database.user": "SA",
    "database.password": "xxxxxxxxxxxxx",
    "database.dbname": "test",
    "database.server.name": "sql1", 
    "table.whitelist": "dbo.Persons", 
    "database.history.kafka.bootstrap.servers": "kafka:9092", 
    "database.history.kafka.topic": "dbhistory.sql1" 
  }
}

但是,Kafka 连接器无法连接到 MSSQL 数据库,给出以下错误消息:

com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host localhost, port 1433 has failed. Error: \"Connection refused. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.

大多数故障排除是数据库实际上运行,或者端口被阻止,但是新的MSSQL db 没有问题。它的容器处于活动状态,数据库成功 运行。端口没有被阻塞。我可以使用 DbVisualizer 或具有以下配置的其他查询工具从主机成功连接到它:

我可以成功使用 telnet localhost 1433 连接到服务器。

上面的连接器配置是否遗漏了什么?

恕我直言,localhost 不正确,因为 localhost 是连接容器和 SQL 服务器容器中的其他内容。您应该 link 将数据库容器放入连接容器并使用适当的主机名。

您需要先设置 sql 容器,然后仅启动连接服务,将 sql 服务器指定为附加 link:

docker 运行 -it --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my-connect-configs -e OFFSET_STORAGE_TOPIC=my-connect-offsets -e ADVERTISED_HOST_NAME="localhost" --link zookeeper:zookeeper --link kafka:kafka --link kafka:kafka debezium/connect