簡體   English   中英

Kafka JDBC 接收器連接器未訪問正確的連接器配置

[英]Kafka JDBC sink connector does not access the correct connector configurations

我有一個在 docker 容器內的 pi 上運行的 postgres。 Debezium 連接器在我的本地機器上運行(與 zookeeper 和 kafka 相同)。

kafka 主題已啟動並正在運行,我可以看到我在 postgres 中對 kafka 主題所做的更改。 到目前為止,一切都很好。

現在我在本地啟動了另一個 docker 容器,它與我的其他容器不是來自同一個 docker compose 文件。 這應該是我的副本數據庫。

我將 confluentinc-kafka-connect-jdbc-10.5.0 復制到 docker 容器中。

sudo docker cp confluentinc-kafka-connect-jdbc-10.5.0 CONTAINER_ID:/kafka/connect/ 

更改了用戶和用戶組並重述了容器。

docker exec -it --user root <container-id> /bin/bash
chown -R <username>:<groupname> <folder/file>

現在我創建了 jdbc-sink 連接器。

curl --location --request POST 'http://localhost:8083/connectors/' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "jdbc-sink",
    "config": {
        "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
        "tasks.max": "1",
        "topics": "piserver.public.customers",
        "connection.url": "jdbc:postgresql:192.168.128.2:5432/postgres",
        "connection.user": "postgres",
        "connection.password": "postgres",
        "transforms": "unwrap",
        "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",   
        "auto.create": "true",
        "insert.mode": "upsert",
        "pk.fields": "id",
        "pk.mode": "record_value"                                               
    }
}
'

我找回了創建的 201。

我得到的錯誤是在運行幾秒鍾后:

curl --location --request GET 'localhost:8083/connectors/jdbc-sink/status' \
--data-raw ''

錯誤跟蹤

{
            "id": 0,
            "state": "FAILED",
            "worker_id": "192.168.112.4:8083",
            "trace": "org.apache.kafka.connect.errors.ConnectException: Exiting WorkerSinkTask due to unrecoverable exception.\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:611)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:333)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:234)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:203)\n\tat org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:188)\n\tat org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:243)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat java.base/java.lang.Thread.run(Thread.java:829)\nCaused by: org.apache.kafka.connect.errors.ConnectException: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:59)\n\tat io.confluent.connect.jdbc.sink.JdbcDbWriter.write(JdbcDbWriter.java:64)\n\tat io.confluent.connect.jdbc.sink.JdbcSinkTask.put(JdbcSinkTask.java:84)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:581)\n\t... 10 more\nCaused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.\n\tat org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:319)\n\tat org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)\n\tat org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)\n\tat org.postgresql.Driver.makeConnection(Driver.java:400)\n\tat org.postgresql.Driver.connect(Driver.java:259)\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getConnection(GenericDatabaseDialect.java:250)\n\tat io.confluent.connect.jdbc.dialect.PostgreSqlDatabaseDialect.getConnection(PostgreSqlDatabaseDialect.java:103)\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.newConnection(CachedConnectionProvider.java:80)\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:52)\n\t... 13 more\nCaused by: java.net.ConnectException: Connection refused (Connection refused)\n\tat java.base/java.net.PlainSocketImpl.socketConnect(Native Method)\n\tat java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)\n\tat java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)\n\tat java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)\n\tat java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)\n\tat java.base/java.net.Socket.connect(Socket.java:609)\n\tat org.postgresql.core.PGStream.createSocket(PGStream.java:241)\n\tat org.postgresql.core.PGStream.<init>(PGStream.java:98)\n\tat org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:109)\n\tat org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)\n\t... 23 more\n"
        }

簡短: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

我在配置中嘗試的主機:

"connection.url": "jdbc:postgresql:192.168.128.2:5432/postgres" // got this IP from docker inspect POSTGRES_CONTAINER
"connection.url": "jdbc:postgresql:host.docker.internal:5432/postgres" 
"connection.url": "jdbc:postgresql:localhost:5432/postgres" 

這些都不起作用

總是遇到同樣的錯誤,無法訪問 localhost:5432。

還嘗試將 docker postgres 容器(副本)連接到我的 docker-compose 網絡。

對此有任何想法謝謝。

小簡歷。

POSTGRES(在 PI 上)->DEBEZIUM 連接器(本地)->KAFKA-> 來自 KAFKA 的 JDBC-SINK -> POSTGRES(將是副本,在本地運行)

不要在容器之間使用 IP 地址,也不要在容器內使用 localhost 來嘗試訪問其他容器 - https://docs.docker.com/network/bridge/

理想情況下,您應該使用 Docker Compose 來啟動所有服務,否則您需要自己創建網橋

docker network create database-bridge
docker run --network=database-bridge --name=postgres ...  
docker run --network=database-bridge  ... # repeat for zookeeper, kafka, and debezium

或者查看組成創建的網絡,並將新容器附加到該網絡,因為您說

在本地啟動了另一個 docker 容器,它不是來自同一個 docker compose 文件

docker network ls  # look for a name that matches the folder where you ran docker-compose
docker run --network=<name> ... jdbc-connector

然后使用jdbc:postgresql://postgres:5432/postgres通過其主機名連接到該容器。

如果 JDBC 連接器使用connect-distributed.sh而不是 Docker 運行,那么您只能使用localhost:5432 ,但您需要從 Postgres 容器到主機的端口映射。

暫無
暫無

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

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