Debezium:关于Postgresql9.5版本不支持断点续传问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012551524/article/details/84303557

前言:

Debezium官方源码只支持pg9.6以上版本的流复制断点续传,9.5版本及其以下版本一旦任务失败,流复制连接无法重启,数据无法实现自动恢复

解决:

这里采用修改源代码的形式来解决9.5版本的支持问题

插件版本:

Debezium:debezium-0.8.4

Postgresql:9.5


解决方法:

1、下载官方源代码(这里我下载的0.8版本的源代码)

https://github.com/debezium/debezium/tree/0.8/debezium-connector-postgres

2、编译maven项目

3、根据kafka客户端启动的警告信息定位出错代码行:

WARN Cannot obtain valid replication slot 'debezium' for plugin 'wal2json' and database 'shopforce' [during attempt 1 out of 900, concurrent tx probably blocks taking snapshot. (io.debezium.connector.postgresql.connection.PostgresConnection:172)

4、找到编译好的项目,查看对应源码,直接查看io.debezium.connector.postgresql.connection.PostgresConnection,发现问题:

上图,我们在执行parseConfirmedFlushLsn后拿到了null返回,查看parseConfirmedFlushLsn方法做了什么:

这里就发现问题了:这里调用方法后,要去PG的pg_replication_slots视图拿字段confirmed_flush_lsn,PG9.6之前,pg_replication_slots视图是没有记录这个字段的,所以这里是拿不到的

参考:https://www.postgresql.org/docs/9.5/view-pg-replication-slots.html

https://www.postgresql.org/docs/9.6/view-pg-replication-slots.html

这里看一下,能不能跳过这一步,查看io.debezium.connector.postgresql.connection.PostgresReplicationConnection:

断点续传的实现其实就是每次重启时拿到上次中断时消费到PG的xlog的位置,然后从该位置重启继续消费,如图代码,第一个红框内拿到slot信息后,其实在第二个只是说要用confirmed_flush_lsn作为数据恢复的位置,我这里只要保证数据不丢就OK的情况下,直接用pg_replication_slots视图里的restart_lsn字段即可,因为这个restart_lsn的位置一定在confirmed_flush_lsn之前,这就ok了,这样的我们可以直接修改io.debezium.connector.postgresql.connection.PostgresConnection的parseConfirmedFlushLsn方法,我们把拿confirmed_flush_lsn信息改为拿restart_lsn信息,如下图:

5、重新编译打包,生成jar包debezium-connector-postgres-0.8.4-SNAPSHOT.jar,替换kafka集群的jar包:

scp debezium-connector-postgres-0.8.4-SNAPSHOT.jar BigData-Dev-1:/opt/cloudera/parcels/KAFKA-3.1.0-1.3.1.0.p0.35/lib/kafka/libs

scp debezium-connector-postgres-0.8.4-SNAPSHOT.jar BigData-Dev-2:/opt/cloudera/parcels/KAFKA-3.1.0-1.3.1.0.p0.35/lib/kafka/libs

scp debezium-connector-postgres-0.8.4-SNAPSHOT.jar BigData-Dev-3:/opt/cloudera/parcels/KAFKA-3.1.0-1.3.1.0.p0.35/lib/kafka/libs

scp debezium-connector-postgres-0.8.4-SNAPSHOT.jar BigData-Dev-4:/opt/cloudera/parcels/KAFKA-3.1.0-1.3.1.0.p0.35/lib/kafka/libs

scp debezium-connector-postgres-0.8.4-SNAPSHOT.jar BigData-Dev-5:/opt/cloudera/parcels/KAFKA-3.1.0-1.3.1.0.p0.35/lib/kafka/libs

6、测试通过(当连接器异常中断后,我们往PG表插入数据,重启连接器后,中断过程中插入的数据依然能被消费到)

PG端:

Kafka端:

猜你喜欢

转载自blog.csdn.net/u012551524/article/details/84303557