問題描述
使用canal-adapter寫入elasticSearch數據時,數據是寫入了elasticSearch了,但出現了mysql表中的數據和elasticSearch中索引中的數據錯亂的問題,即把A列的數據放到了B列中的。
研究了半天,發現是因為我在測試過程中,換過另外1個數據庫,這2個庫中的列不一致導致的。
因為canal會通過tsdb維護了一個當前數據庫內表結構,具體配置如下:
我這里(tsdb使用的是本地的h2數據庫)。
我有2個數據庫,首先在第1個庫測試驗證,是正常的,然后換成在第2個庫測試驗證,就出問題了,
因為第1個庫時已經緩存了表結構信息,第2個庫還是拿的第1個庫的表結構進行處理的。
理解canal tsdb的功能需要先看懂官方對tsdb的介紹和實現
https://github.com/alibaba/canal/wiki/TableMetaTSDB
解決方案
知道原因了就好解決了,既然是用H2存儲表結構的,那刪除它,然后重啟服務就好了,因為會重新加載最新的表結構
cd canal/conf/db1
rm -rf h2.mv.db
后續優化
在使用HA功能的同時,如果開啟tsdb的話,一定要將tsdb設置為集中式的,也就是不要使用本地的h2了,而是使用集中化的mysql數據庫,保證兩台canal連接的是同一個數據庫。
這樣的話才能夠滿足在進行DDL和HA切換的時候不會出現異常。