TiDB 原理 | TiDB 數(shù)據(jù)一致性校驗實現(xiàn):Sync-diff-inspector 優(yōu)化方案
作者介紹
簡介
在數(shù)據(jù)同步的場景下,上下游數(shù)據(jù)的一致性校驗是非常重要的一個環(huán)節(jié),缺少數(shù)據(jù)校驗,可能會對商業(yè)決策產(chǎn)生非常負面的影響。Sync-diff-inspector 是 PingCAP Data Platform 團隊開發(fā)的一款一致性校驗工具,它能對多種數(shù)據(jù)同步場景的上下游數(shù)據(jù)進行一致性校驗,如多數(shù)據(jù)源到單一目的(MySQL 中分庫分表到 TiDB 中)、單一源到單一目的( TiDB 表到 TiDB 表)等,在數(shù)據(jù)校驗過程中,其效率和正確性是至關(guān)重要的。首先我們看下 Sync-diff-inspector 的架構(gòu)圖,對 Sync-diff-inspector 的作用和實現(xiàn)原理有一個大致的認知。
Sync-diff-inspector 2.0 架構(gòu)圖
Why Sync-diff-inspector 2.0 ?
在 1.0 版本中,我們遇到客戶反饋的一些問題,包括:
針對大表進行一致性校驗時出現(xiàn) TiDB 端發(fā)生內(nèi)存溢出。
不支持 Float 類型數(shù)據(jù)校驗的問題。
結(jié)果輸出對用戶不友好,需要對校驗結(jié)果進行精簡。
檢驗過程中發(fā)生 GC,導(dǎo)致校驗失敗。
采用單線程劃分 Chunk,該表中所有已被劃分的 Chunk 需要等待該表中所有 Chunk 全部被劃分才會開始進行比對,這會導(dǎo)致這段時間內(nèi),TiKV 的使用率降低
Checkpoint 功能將校驗過的每個 Chunk 的狀態(tài)寫入數(shù)據(jù)庫,所以寫入數(shù)據(jù)庫的 IO 成為校驗過程的瓶頸。
當 chunk 范圍內(nèi)的 checksum 不同時,直接進行按行比對,消耗大量 IO 資源。
缺少自適應(yīng) GC 的功能,導(dǎo)致正在校驗的 Snapshot 被 GC,使得校驗失敗
??????
Sync-diff-inspector 2.0 新特性
Chunk 劃分
chunk 劃分過程中可能由于 chunk 的預(yù)定大小小于一個桶的大小,需要切分這個桶為若干個 chunk,這是個相對比較慢的過程,因此消費端也就是 chunk 的比對線程會出現(xiàn)等待的情況,資源利用率會降低。這里采用兩種處理方法:采用多個桶異步劃分來提高資源利用率;有些表沒有桶的信息,因此只能把整個表當作一個桶來切分,采用多表劃分來提高總體的異步劃分桶數(shù)。 chunk 的劃分也會占用一定的資源,chunk 劃分過快會一定程度減慢 chunk 比對的速度,因此這里在消費端通過 channel 來限制多表劃分chunk的速度。

Checkpoint 和修復(fù) SQL
如果先寫入修復(fù) SQL 的記錄,那么此時程序異常退出,這個被寫入修復(fù) SQL 但沒被 checkpoint 記錄的 chunk 會在下一次生成,一般情況下,這個修復(fù) SQL 文件會被重新覆蓋。但是由于桶的切分是隨機分的,因此盡管切分后的 chunk 個數(shù)固定,上一次檢查出的不同行在切分后 chunks 的第三個,這次可能跑到了第四個chunk 的范圍內(nèi)。這樣就會存在重復(fù)的修復(fù) SQL。 如果先寫入 checkpoint,那么此時程序異常退出,下一次執(zhí)行會從該 checkpoint 記錄的 chunk 的后面范圍開始檢驗,如果該 chunk 存在修復(fù) SQL 但還沒有被記錄,那么這個修復(fù) SQL 信息就丟失了。
二分校驗和自適應(yīng) chunkSize
索引處理
where 處理
((a > 1) OR (a = 1 AND b > 2) OR (a = 1 AND b = 2 AND c > 3))
((a < 1) OR (a = 1 AND b < 2) OR (a = 1 AND b = 2 AND c <= 4))
自適應(yīng) GC
處理 Float 列
用戶交互優(yōu)化
將日志寫入到日志文件中。
在前臺顯示進度條,并提示正在比較的表。
記錄每個表校驗相關(guān)結(jié)果,包括整體對比時間、對比數(shù)據(jù)量、平均速度、每張表對比結(jié)果和每張表的配置信息。
生成的修復(fù) SQL 信息。
一定時間間隔記錄的 checkpoint ?信息。

性能提升

從測試結(jié)果可以看出,Sync-diff-inspector 2.0 相比于原版, 校驗速度有明顯提升,同時在TiDB 端內(nèi)存占用顯著減少。
未來展望
開放性的架構(gòu)
支持更多類型
更激進的二分 checksum

