前幾天在網上衝浪的時候發現了一個比較成熟的開源中間件——Canal。在瞭解了它的工作原理和使用場景後,頓時產生了濃厚的興趣。本着好記性不如爛筆頭的原則,阿Q對 Canal 的原理進行了梳理、對環境進行了搭建,具體步驟見這篇文章:原理+配置+實戰,Canal一套帶走
今天我們拋開 canal 的原理和代碼不談,總結幾個在使用過程中遇到的問題,當然,解決方案也一併呈上。
問題一
在給 canal 分配數據庫權限的過程中,由於密碼設置的比較簡單,會報以下錯誤
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
複製代碼
這是由 MySQL 的密碼規範決定的,建議設置的密碼要包含大小寫字母、數字和特殊字符,具體的規範大家可以自行百度😃。
問題二
在通過命令./bin/startup.sh 啓動 canal 服務後,發現在 logs 下沒有生成 canal.log 日誌,在進程命令中 ps -ef | grep canal 也查不到 canal 的進程。
通過查看目錄 logs 下的文件 canal_stdout.log,發現了問題所在
報錯信息提示內存不足,Java 運行時環境無法繼續。更詳細的錯誤日誌在文件:/usr/local/bin/hs_err_pid25186.log 中。
既然是內存原因,那就檢查一下自己的內存,執行命令free -h ,發現可用內存僅為 96M,應該是內存問題,解決方法如下:
殺死運行的一些進程;
增加虛擬機的內存;
修改 canal 啓動時所需要的內存;
我就是用的第三種方法,首先用 vim 打開 startup.sh 修改內存參數,可以對照我的進行修改,按照自己服務器剩餘內存進行修改,這裏我將內存調整到了 80M。
改為 -server -Xms80m -Xmx80m -Xmn80m -XX:SurvivorRatio=2 -XX:PermSize=66m -XX:MaxPermSize=80m -Xss256k -XX:-UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError
改完之後執行命令發現依舊報錯:found canal.pid , Please run stop.sh first ,then startup.sh 意思是找到了 canal.pid,請先運行stop.sh
這是由於 canal 服務不正常退出服務導致的,比如説虛擬機強制重啓。
執行 stop.sh 命令後重新啓動,成功運行,成功運行後可以在 canal/logs 文件夾中生成 canal.log 日誌。
問題三
在 canal 服務啓動之後,想通過編寫代碼的方式來測試數據庫變更之後觸發 canal 輸出數據的過程。結果無論怎樣修改,控制枱就是沒有日誌打出。
通過查看 canal /usr/local/logs/example下的 example.log 文件才發現問題所在
原因就是meta.dat中保存的位點信息和數據庫的位點信息不一致導致 canal 抓取不到數據庫的動作。
於是我找到 canal 的 conf/example/instance.properties 實例配置文件,發現沒有將canal.instance.master.address=127.0.0.1:3306 設置成自己的數據庫地址。
解決方案
先停止 canal 服務的運行;
刪除meta.dat文件;
再重啓canal,問題解決;
今天的內容到這裏就結束了,希望對大家有所幫助,我們下期再見。跪求一鍵三連,期望靚仔在評論區打出“老鐵666”,鼓勵一下阿Q。
好看的皮囊千篇一律,有趣的靈魂萬里挑一,讓我們在冷漠的城市裏相互温暖,我是阿Q,我們下期再見!