所謂的一致性問題是指,在同時使用快取和資料庫的情況下,要確保資料在快取與資料庫中的更新操作保持同步。也就是當對資料進行修改時,無論是先修改快取還是先修改資料庫,最終都要保證兩者的資料是一樣的,不會出現資料不一樣的問題。
1.一致性問題解決方案
快取和資料庫一致性的經典解決方案有以下兩個:
使用延遲雙刪 + MQ 保證資料的一致性。
透過 Canal 監聽 MySQL 的 Binlog 寫入日誌,之後將寫入操作(增加、刪除和修改)的資訊傳送至 Kafka,程式監聽到 Kafka 的訊息後更新 Redis,從而保證資料的最終一致性。
需要注意的是,無論使用的是延遲雙刪還是 Canal,都會出現短暫資料不一致性的問題,但可以保證最終的資料一致性。
然而,如果使用的是延遲雙刪 + MQ 的這種方式的時候,有一個棘手的問題很難處理,那就是如何設定延遲時間?
如果延遲時間設定的比較短,那麼在併發場景下會出現資料不一致的問題;如果延遲時間設定的比較長,那麼在比較長的這段時間內還會有資料不一致的問題。這個問題歸根到底的原因是,併發執行緒的排程時間不能人為的控制(由作業系統統一排程)。
所以基於以上原因,使用 Canal 來保證資料一致性問題變成了一個比較不錯的解決 Redis 和 MySQL 資料一致性的有效手段。
2.Canal執行流程
透過 Canal 保證資料一致性的實現流程如下圖所示:
3.Canal操作流程
使用 Canal 讀取 MySQL 的 Binlog 配置步驟如下:
開啟並配置 MySQL 的 Binlog 設定。
重啟 MySQL 服務。
給 MySQL 配置 canal/canal 使用者用於後續 Canal 同步資料(此步驟非必須)。
安裝並解壓 Canal。
修改 canal.properties 配置檔案,讓其將資料同步到 Kafka,並配置 Kafka 伺服器資訊。
修改 example/instance.properties 配置檔案,指定同步資料到 Kafka 某個主題。
複製 plugin 中的 jar 包到 lib 目錄,讓 Canal 支援將資料同步到 MQ。
啟動 Canal 服務。
在程式碼中監聽 Kafka 主題,並判斷並更新 Redis 快取。
Kafka 中儲存的資料格式如下:
4.最後
理論如同明燈照亮前行的道路,實踐則是我們堅實的腳步。唯有將兩者緊密結合,不斷地練習和實踐,我們才能在求知的旅程中穩步前行,收穫真正的成長與進步。所以,一起行動起來,光看不練都是假把式。