当前位置: 首页 > 知识库问答 >
问题:

重新创建数据库容器时,Debezium 源任务无法重新连接到 postgresql DB

汪志业
2023-03-14

我们有一个kubernetes集群,其中Debezium作为Postgresql的源任务运行,并写入kafka。Debezium、postgres和kafka都在单独的吊舱中运行。当postgres pod被删除并且kubernetes重新创建pod时,debezium pod无法重新连接。来自debezium pod的日志:

    2018-07-17 08:31:38,311 ERROR  ||  WorkerSourceTask{id=inventory-connector-0} Task is being killed and will not recover until manually restarted   [org.apache.kafka.connect.runtime.WorkerTask]
    2018-07-17 08:31:38,311 INFO   ||  [Producer clientId=producer-4] Closing the Kafka producer with timeoutMillis = 30000 ms.   [org.apache.kafka.clients.producer.KafkaProducer]

Debezium继续尝试每隔一段时间刷新未完成的消息,但出现以下异常:

    2018-07-17 08:32:38,167 ERROR  ||  WorkerSourceTask{id=inventory-connector-0} Exception thrown while calling task.commit()   [org.apache.kafka.connect.runtime.WorkerSourceTask]
    org.apache.kafka.connect.errors.ConnectException: org.postgresql.util.PSQLException: Database connection failed when writing to copy
    at io.debezium.connector.postgresql.RecordsStreamProducer.commit(RecordsStreamProducer.java:151)
    at io.debezium.connector.postgresql.PostgresConnectorTask.commit(PostgresConnectorTask.java:138)
    at org.apache.kafka.connect.runtime.WorkerSourceTask.commitSourceTask(WorkerSourceTask.java:437)
    at org.apache.kafka.connect.runtime.WorkerSourceTask.commitOffsets(WorkerSourceTask.java:378)
    at org.apache.kafka.connect.runtime.SourceTaskOffsetCommitter.commit(SourceTaskOffsetCommitter.java:108)
    at org.apache.kafka.connect.runtime.SourceTaskOffsetCommitter.access$000(SourceTaskOffsetCommitter.java:45)
    at org.apache.kafka.connect.runtime.SourceTaskOffsetCommitter$1.run(SourceTaskOffsetCommitter.java:82)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    Caused by: org.postgresql.util.PSQLException: Database connection failed when writing to copy
    at org.postgresql.core.v3.QueryExecutorImpl.flushCopy(QueryExecutorImpl.java:942)
    at org.postgresql.core.v3.CopyDualImpl.flushCopy(CopyDualImpl.java:23)
    at org.postgresql.core.v3.replication.V3PGReplicationStream.updateStatusInternal(V3PGReplicationStream.java:176)
    at org.postgresql.core.v3.replication.V3PGReplicationStream.forceUpdateStatus(V3PGReplicationStream.java:99)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection$1.doFlushLsn(PostgresReplicationConnection.java:246)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection$1.flushLsn(PostgresReplicationConnection.java:239)
    at io.debezium.connector.postgresql.RecordsStreamProducer.commit(RecordsStreamProducer.java:146)
    ... 13 more
    Caused by: java.net.SocketException: Broken pipe (Write failed)
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at org.postgresql.core.PGStream.flush(PGStream.java:553)
    at org.postgresql.core.v3.QueryExecutorImpl.flushCopy(QueryExecutorImpl.java:939)
    ... 19 more

当debezium可用时,有没有办法让它重新建立与postgres的连接?还是我漏了一些配置?

  • Debezium 版本 0.8
  • Kubernetes 版本 1.10.3
  • Postgres 版本 9.6

共有1个答案

松旻
2023-03-14

看起来这是一个常见的问题,在debezium和kafka中都有开放的特性请求

https://issues.jboss.org/browse/DBZ-248

https://issues.apache.org/jira/browse/KAFKA-5352

虽然这些是开放的,但这似乎是预期的行为

作为一种变通方法,我已将此liveness探测器添加到部署中

    livenessProbe:
        exec:
          command:
          - sh
          - -ec
          - ipaddress=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'); reply=$(curl -s $ipaddress:8083/connectors/inventory-connector/status | grep -o RUNNING | wc -l); if [ $reply -lt 2 ]; then exit 1; fi;
        initialDelaySeconds: 30
        periodSeconds: 5

第一个子句获取容器 IP 地址:

    ipaddress=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/');

第二个子句发出请求并计算响应json中的“运行”实例:

    reply=$(curl -s $ipaddress:8083/connectors/inventory-connector/status | grep -o RUNNING | wc -l);

如果' RUNNING '出现不到两次,第三个子句html" target="_blank">返回退出代码1

    if [ $reply -lt 2 ]; then exit 1; fi

它似乎正在进行初始测试——即重新启动postgres DB会触发debezium容器的重新启动。我想像中可以包含这样的脚本(尽管可能是“robus的”)以方便探测。

 类似资料:
  • 我试图部署一个与主机数据库一起工作的Drupal6Docker容器(在将其部署到远程数据库之前出于测试目的),但它就是不想工作,尽管我找到了不同的建议。(特别是在这个来自Docker容器内部的问题中,我如何连接到机器的本地主机?当它谈到主机模式时,所以即使这个问题看起来很像,它也不觉得它是重复的) DockerFile Docker-compose.yml 对于数据库连接,我指定了以下设置: 驱动

  • 获取以下代码的错误 我得到的输出错误是

  • 我正在处理一个奇怪的问题,即使用JDBC在AmazonRDS上连接MySQL数据库。我有两部不同的Android手机在同一个网络上运行相同的代码。一个人连接起来没有任何问题。另一个是给我以下的例外: 数据库只显示1个活动连接,所以我知道这不是因为打开的连接太多。我尝试重新启动服务器,但没有帮助。我使用的是MySQL JDBC Connector/J版本5.1.23。工作的手机运行的是Android

  • 我有一个Java后端的Web应用程序,它使用Tomcat jdbc-pool进行数据库连接。这工作罚款。 然而,在将其导出到其他位置之前,我正在尝试万无一失,最近发生了一个场景,有人重新启动了SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:,直到我重新启动Tomcat,迫使jdbc池数据源重新连接。 我在Tomcat jdbc池文档中寻找某种配置,

  • 我的Spring Hibernate Web应用程序在MySQL上运行,这给我带来了麻烦。 我四处寻找并尝试了不同的配置,在这个网站上阅读了相当多的帖子,但它仍然会弹出微笑的头像。 错误消息是:由:com.mysql.jdbc.exceptions.jdbc4.通信异常:从服务器成功接收到的最后一个数据包是63,313,144毫秒前。最后一个成功发送到服务器的数据包是63,313,144毫秒前。比

  • 当我执行docker run命令时,它向我抛出了一个错误。表是在数据库中创建的,但会引发错误。 docker运行-p 8080:8080-eDB_VENDOR=MYSQL-eDB_ADDR=192.168.18.01-eDB_PORT=3306-eDB_USER=keyCloak-eDB_PASSWORD=keyCloak-eKEYCLOAK_USER=admin-eKEYCLOAK_PASSWO