TokuDB 讓Hot Backup更完美

2021-09-23 23:27:33 字數 1329 閱讀 7889

很久很久以前,核心君發表了一篇ha方案·tokudb熱備的文章,方法很簡單:

1) set tokudb_checkpoint_lock=on;

2) 開始拷貝tokudb的資料檔案(不包含日誌檔案)

3) flush tables with read lock;

4) 記錄binlog位置,拷貝最新的binlog和tokudb的日誌檔案(*.tokulog)

5) unlock tables;

6) set tokudb_checkpoint_lock=off;

這些步驟可以很方便的嵌入到percona xtrabackup中,與innodb一起工作,目前看是乙個比較簡單可行的方案。

問題來了。

當某個例項的資料量達到tb級,你會發現備庫(基於備份)重搭後,啟動會灰常灰常慢,因為他們都在recover redo-log,為什麼呢?

1) set tokudb_checkpoint_lock=on;

2) 開始拷貝tokudb的資料檔案(不包含日誌檔案)

-- 由於拷貝tb級的資料非常耗時,redo log持續增加甚至上萬個

當tokudb啟動後,掃瞄和recover這幾萬個redo log將是災難性的。

解決這個問題比較簡單,我們稍微調整下熱備的順序即可:

1) set tokudb_checkpoint_lock=on;

2) flush tables with read lock;

3) 記錄binlog位置,拷貝最新的binlog和tokudb的日誌檔案(*.tokulog)

4) unlock tables;

5) 開始拷貝tokudb的資料檔案(不包含日誌檔案) --移動到這裡

6) set tokudb_checkpoint_lock=off;

這樣在拷貝tokudb資料檔案的時候,就跟redo-log沒半毛錢關係了,而且拷貝的redo-log數也大大減少!

本以為這樣就可以早點下班回家,但問題還是來。

某例項有幾十萬個tokudb檔案(分割槽表檔案),使用熱備的資料備庫重搭後,複製過程中偶爾會出現"duplicate entry ... for key 'primary'"錯誤。

引起這個錯誤的原因比較深,觸發自tokudb內部機制。

為了解決這個問題,我們在熱備的過程中引入乙個狀態:in_backup = true,防止檔案關閉做checkpoint操作,具體的patch見這裡:

這樣tokudb的熱備就比較完美了,整個熱備過程中,所有的資料檔案均處於乙個「一致性」狀態,所有的操作都在redo-log裡,不再汙染資料檔案。

TokuDB引擎筆記

client port 3306 socket tmp mysql.sock mysqld port 3306 socket tmp mysql.sock skip external locking max allowed packet 1m myisam sort buffer size 64m ...

TokuDB引擎啟動失敗解決

tokudb引擎修改資料儲存目錄引數特別複雜,稍不留神,tokudb引擎就無法啟動了。怎麼折騰都不能修改目錄引數,也不能啟動的情況下,可以解除安裝掉重灌。本文記錄今天填坑的經歷,解除安裝重灌後再修改目錄。啟動失敗的情況下,var log mysqld.log中有這個錯 error tokudb re...

TokuDB 引擎特性 zstd壓縮演算法

tokudb有著出色的壓縮特性,這不是 蓋 的 rds上有個innodb例項,1天的資料將近700gb空間,換成tokudb後 預設zlib壓縮 同樣的700gb可以儲存 天的資料,業務讀寫效能也無任何影響,空間成本直線下降。為什麼tokudb的壓縮這麼給力?因為tokudb乙個 頁 的大小為4mb...