作者:孫正方
愛可生 DBLE 核心研發成員,擁有豐富的分佈式數據庫中間件開發、諮詢以及調優經驗,擅長數據庫中間件問題排查和處理,對線上中間件部分排錯有深入的實踐與認知。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
背景
在 dble 2.19.11.0 之前的版本中,繼承於 Mycat 的實現,全局表檢查是一個 server 級別的功能,並且通過在創建全局表的時候添加列 _dble_op_time 來進行實現。在實際使用中帶來了許多棘手的問題。
- 開關不便
- 結果集處理不便
- 數據導入處理不便
在 dble 2.19.11.0 中,考慮到生產中實際使用的場景和定義情況,按照以下的幾點要求,對於全局表檢查進行了重新的設計:
- 檢查開關在表格級別(只有部分表格需要檢查)
- 檢查觸發的具體時間需要能精確定義
- 檢查的方式要求可以自定義
- 檢查方式自定義要求足夠足夠簡單明確
實現原理
根據以上提供的明確要點,dble 引入了 quartz 框架來進行定時任務的時間控制,並且在 schema.table 級別的標籤上添加了以下的幾個可選項:
- globalCheck
- cron
- globalCheckClass
並且在加載過程中,將每一個 table 的全局表檢查,作為一個獨立的定時任務加載到 quartz 中去,之後便交由 quartz 進行觸發和執行。
而至於每一個獨立的定時任務,則可以和其他的 dble 中的自定義功能一樣,由用戶自定義以下幾個方法:
- getCountSQL (全局表檢查 SQL 執行定義)
- getFetchCols (全局表檢查結果集列定義)
- resultEquals (全局表檢查結果對比方法)
- failResponse (全局表檢查失敗反饋方法)
- resultResponse (全局表檢查結果反饋方法)
具體的執行邏輯和流程如下圖所示:
簡單的描述為以下步驟:
- start/reload 的時候將表格所配置的定時任務加入到 quartz 中
- quartz 觸發定時任務
- 實例化 AbstractConsistencyChecker 並執行
- 根據方法 getCountSQL 確定需要執行的 SQL,並將 SQL 下發執行
- 根據方法 getFetchCols 確定需要獲取的 SQL 執行結果列
- 根據方法 resultEquals 對於不同 MySQL 上的檢查結果進行對比
- 根據 failResponse 和 resultResponse 方法進行結果的反饋
全局表檢查使用實例
當然,dble 內置了兩種全局表檢查的默認方法,並提供了對應的簡稱:
- CHECKSUM
- COUNT
顧名思義,以上的兩種默認方法分別通過在不同的 MySQL 節點求取同名表的 checksum 值以及 count 的數量來進行比較不同 MySQL 節點上的數據的一致性。
具體則可以按照以下進行配置:
<code><
table
name
="tb_global1"
dataNode
="dn1,dn2"
type
="global"
globalCheck
="true"
cron
="0 * * * * ?"
globalCheckClass
="CHECKSUM"
/><
table
name
="tb_global2"
dataNode
="dn1,dn2"
type
="global"
globalCheck
="true"
cron
="0 * * * * ?"
globalCheckClass
="COUNT"
/>/<code>