前言:
Debezium官方源码只支持pg9.6以上版本的流复制断点续传,9.5版本及其以下版本一旦任务失败,流复制连接无法重启,数据无法实现自动恢复
解决:
这里采用修改源代码的形式来解决9.5版本的支持问题
插件版本:
Debezium:debezium-0.8.4
Postgresql:9.5
解决方法:
1、下载官方源代码(这里我下载的0.8版本的源代码)
debezium/debezium-connector-postgres at 0.8 · debezium/debezium · GitHub
2、编译maven项目
3、根据kafka客户端启动的警告信息定位出错代码行:
WARN Cannot obtain valid replication slot 'debezium' for plugin 'wal2json' and database 'test' [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
PostgreSQL: Documentation: 9.6: pg_replication_slots
这里看一下,能不能跳过这一步,查看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端: