分佈式 | DBLE 新全局表檢查實現淺析

作者:孫正方

愛可生 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 (全局表檢查結果反饋方法)

具體的執行邏輯和流程如下圖所示:


分佈式 | DBLE 新全局表檢查實現淺析


簡單的描述為以下步驟:

  • 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>


分享到:


相關文章: