Jboss 复制插槽已存在
每当我重新启动debezium kafka connect容器或部署另一个实例时,都会出现以下错误:Jboss 复制插槽已存在,jboss,apache-kafka-connect,debezium,Jboss,Apache Kafka Connect,Debezium,每当我重新启动debezium kafka connect容器或部署另一个实例时,都会出现以下错误: io.debezium.jdbc.JdbcConnectionException: ERROR: replication slot "debezium" already exists at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initReplicationSlot(Po
io.debezium.jdbc.JdbcConnectionException: ERROR: replication slot "debezium" already exists
at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initReplicationSlot(PostgresReplicationConnection.java:136)
at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.<init>(PostgresReplicationConnection.java:79)
at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.<init>(PostgresReplicationConnection.java:38)
at io.debezium.connector.postgresql.connection.PostgresReplicationConnection$ReplicationConnectionBuilder.build(PostgresReplicationConnection.java:349)
at io.debezium.connector.postgresql.PostgresTaskContext.createReplicationConnection(PostgresTaskContext.java:80)
at io.debezium.connector.postgresql.RecordsStreamProducer.<init>(RecordsStreamProducer.java:75)
at io.debezium.connector.postgresql.PostgresConnectorTask.start(PostgresConnectorTask.java:112)
at org.apache.kafka.connect.runtime.WorkerSourceTask.execute(WorkerSourceTask.java:157)
at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:170)
at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:214)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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: ERROR: replication slot "debezium" already exists
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301)
at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:260)
at org.postgresql.replication.fluent.logical.LogicalCreateSlotBuilder.make(LogicalCreateSlotBuilder.java:48)
at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initReplicationSlot(PostgresReplicationConnection.java:102)
... 14 more
我注意到这两个配置选项(slot.name和slot.drop_on_stop),但我不清楚是否/如何更改它们:
如果部署多个Debezium Postgres连接器实例,则必须确保使用不同的复制插槽名称。设置连接器时,可以指定名称:
{
"name": "inventory-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"tasks.max": "1",
"database.hostname": "postgres",
"database.port": "5432",
"database.user": "postgres",
"database.password": "postgres",
"database.dbname" : "postgres",
"database.server.name": "dbserver1",
"database.whitelist": "inventory",
"database.history.kafka.bootstrap.servers": "kafka:9092",
"database.history.kafka.topic": "schema-changes.inventory",
"slot.name" : "my-slot-name"
}
}
我无法重现您在重新启动给定连接器实例时描述的问题。它应该检测到插槽已经存在并重新使用该插槽(一个可能的原因可能是您也更改了逻辑解码插件(“decoderbufs”vs“wal2json”)?。如果您有用于此的复制器,请在我们的中打开一个条目好吗
要继续,您可以手动删除Postgres中的插槽:
select pg_drop_replication_slot('debezium');
感谢您的回复。因此,当我部署第二个kafka connect实例时,它会拾取我发布的现有配置,因此我没有机会为插槽名称指定不同的值。映像以分布式模式运行:据我所知,这意味着其他实例将通过“拾取”来协调.WDYM?您应该确保指定一个不同的名称,它将采用您发布到Kafka Connect的JSON的配置。此外,当您说“重新启动给定的连接器实例”时你的意思是从rest api,还是实际重新启动docker容器本身?对我来说,是后者导致了复制插槽问题。前者,但它在重新启动容器时也对我有效。如果你能提供复制问题的确切步骤,那就太好了。re“pick up”-我docker运行一个kafka connect实例,然后发布连接器配置。我然后docker运行第二个kafka connect实例,它立即进入插槽问题,而我不发布任何配置。
select pg_drop_replication_slot('debezium');