Debezium:關於Postgresql9.5版本不支持斷點續傳問題解決


前言:

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端:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章