簡體   English   中英

Debezium 如何使用 Kafka Connect 正確注冊 SqlServer 連接器 - 連接被拒絕

[英]Debezium How do I correctly register the SqlServer connector with Kafka Connect - connection refused

問題:

如何使用 Kafka Connect 正確注冊 SqlServer 連接器以連接到獨立的 SQL 服務器實例? 注意:我沒有在 Docker 中運行 SQL 服務器。

錯誤:

錯誤:原因:com.microsoft.sqlserver.jdbc.SQLServerException:與主機 127.0.0.1、端口 1433 的 TCP/IP 連接失敗。 錯誤:“連接被拒絕(連接被拒絕)。驗證連接屬性。確保 SQL 服務器的實例在主機上運行並在端口接受 TCP/IP 連接。確保 TCP 與端口的連接未被阻止防火牆。”。

故障排除:

  1. 在 dbo.Posts 表上啟用 CDC(見下文)
  2. 已驗證 TCP/IP 已啟用並將所有地址設置為啟用並在 SQL 服務器配置管理器的 SQL 服務器網絡配置中的端口 1433 上處於活動狀態
  3. 禁用 Windows 防火牆
  4. 在 SQL 服務器配置管理器中啟用 SQL 服務器瀏覽器
  5. 已驗證我可以通過以下方式遠程登錄:(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 注冊 SQL 服務器connect時出現錯誤(見上文),我運行以下命令:

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

問題在於對localhost的引用。 如果您在 Docker 容器中運行 Connect,則localhost是容器的本地主機,而不是機器的本地主機。 嘗試在docker0接口或所有接口上公開 SQL 服務器,然后在注冊請求中使用docker0 IP。

非生產環境的解決方案是使用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" 
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM