MySQL數(shù)據(jù)實時克隆的初步設(shè)計
之前我們重點(diǎn)建設(shè)了數(shù)據(jù)克隆的一個服務(wù),其實起這個名字也琢磨了好久,說邏輯備份恢復(fù)很多業(yè)務(wù)同學(xué)都不大能理解,GET到我們要解決的問題,而數(shù)據(jù)克隆的概念就比較清晰。
先來說說我們對數(shù)據(jù)克隆的定義
1)數(shù)據(jù)克隆快速從線上導(dǎo)出指定庫/表數(shù)據(jù),并構(gòu)建虛擬環(huán)境,從而來提供高效的數(shù)據(jù)服務(wù);
2)功能方面實現(xiàn)了業(yè)務(wù)自助提取數(shù)據(jù),分鐘級構(gòu)建環(huán)境,可以通過workbench等工具訪問數(shù)據(jù),無需DBA介入;
3)安全方面支持?jǐn)?shù)據(jù)庫操作日志審計,已接入ES審計,并提供了庫/表訪問過濾,虛擬環(huán)境隨機(jī)分配,臨時密碼交付,同時限定了虛擬環(huán)境的使用時長。
適用場景:
1)線上配置數(shù)據(jù)的快速查看;
2)提取線上表結(jié)構(gòu);
3)日志數(shù)據(jù)查詢,線上大表;
4)線上SQL異常,快速構(gòu)建虛擬環(huán)境進(jìn)行SQL優(yōu)化,壓測等;
5)指定大表的變更和數(shù)據(jù)操作影響評估;
6)數(shù)據(jù)補(bǔ)丁合并,基于業(yè)務(wù)邏輯的數(shù)據(jù)操作和數(shù)據(jù)補(bǔ)丁整理。
而從數(shù)據(jù)克隆的使用來看,其實能夠滿足一些不確定的需求,比如做一些全量的查詢過濾等,但是因為是和線上環(huán)境隔離的,所以就不會同步線上的數(shù)據(jù),在這一點(diǎn)上可以更進(jìn)一步,那就是落地實時數(shù)據(jù)克隆,從而能夠?qū)崿F(xiàn)實時的數(shù)據(jù)同步,當(dāng)然這種同步是一種多源冪等復(fù)制,打個比方,源庫有10張表,我們的目標(biāo)環(huán)境可能只克隆了2張表,那么在做實時復(fù)制時,就需要排除那8張表,而且同一個實例上面有多套環(huán)境,所以會自然開啟多源復(fù)制模式。
如果排除一些瑣碎的細(xì)節(jié),我們可以概括為:實時克隆的核心是對于GTID_SET的管理,在設(shè)計上需要考慮如下的一些因素:
基礎(chǔ)限定和配置
1. 同一個實例的數(shù)據(jù)庫只能克隆一次
2. 數(shù)據(jù)開啟GTID,實時克隆暫不支持MySQL 5.5版本
3. 數(shù)據(jù)庫參數(shù)slave_exec_mode值為IDEMPOTENT
4. 設(shè)置數(shù)據(jù)庫參數(shù)skip-slave-errors=1146
5. 實時克隆環(huán)境建議為只讀
6. 克隆的數(shù)據(jù)庫復(fù)制賬號為db_clone_repl
7. 通常克隆環(huán)境的表數(shù)量小于源庫環(huán)境
GTID變更流程
1. 數(shù)據(jù)邏輯備份時,需要包含GTID值,并記錄到導(dǎo)出記錄中
2. 數(shù)據(jù)邏輯恢復(fù)時,可以參考如下的步驟:
a) 如果已有數(shù)據(jù)復(fù)制通道運(yùn)行
i. 暫停復(fù)制通道Channel
ii. 得到固定的GTID_SET值
iii. 追加導(dǎo)出的GTID至GTID_SET,并更新至GTID_PURGED
iv. 啟動復(fù)制通道Channel
b) 如果沒有數(shù)據(jù)復(fù)制通道運(yùn)行
i. 追加導(dǎo)出的GTID至當(dāng)前GTID_SET,并更新至GTID_PURGED
ii. 啟動復(fù)制通道Channel
注:復(fù)制通道Channel的命名為db_clone_【源IP】_【源端口】
3. 每天的定時任務(wù)清理環(huán)境時,自動執(zhí)行reset master操作清空GTID_SET
本文轉(zhuǎn)載自微信公眾號「楊建榮的學(xué)習(xí)筆記」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系楊建榮的學(xué)習(xí)筆記公眾號。