一鍵搭建blackhole從庫
來自業務的驅動
前一段時間,微博的雙向關注業務拆分,資料庫執行個體增多了幾倍,對應的,我們要為這些執行個體搭建很多blackhole從庫,供後面的binlog剖析器分析binlog並最終匯入到redis中。整個過程比較枯燥乏味,尤其blackhole從庫的搭建,花費了我們較多的精力。所以我有了寫個工具的想法。
按部就班的做法
之前我們搭建blackhole從庫,都是先把線上主庫或者備庫的表結構dump出來,然後把主庫的許可權庫、監控庫等整個拷貝過來,再change master。這種方法在採用語句級格式複製的情況下,基本可以很好的工作。但是當換成行格式複製後,blackhole從庫經常卡庫。追查了一下原因,發現問題出現在拷貝許可權庫、監控庫[都是MyISAM表]的過程中。如果拷貝過程中不加鎖,拷貝完畢後再在主庫通過show master status記錄下binlog pos點,並以此作為change master的pos點,這種方法可能存在隱患,並最終導致從庫出現卡庫。
在瞭解需求和之前方法的缺點後,我發現要非常嚴謹的給正在啟動並執行主庫搭建一個blackhole從庫並非易事。經過和同事的一番討論,參考了下percona xtrabackup熱備資料庫的方法,於是實現了這個工具。代碼有興趣的可以直接看,文章後面也有比較詳細的說明。歡迎拍磚。
MySQL管理之使用XtraBackup進行熱備
MySQL開源備份工具Xtrabackup備份部署
MySQL Xtrabackup備份和恢複
用XtraBackup實現MySQL的主從複製快速部署【主不鎖表】
安裝和使用 Percona 推出的 Xtrabackup 備份 MySQL
原始碼下載見 用法說明
這個工具需要使用者輸入兩個參數:一個主庫的ip地址,一個是主庫的資料庫連接埠,這兩個參數唯一的確定一個執行個體。
用法說明
Usage: example: blackhole_slave.py -f 10.66.10.10 -P 3307
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-f IP, --master-ip=IP
master ip address here
-P PORT, --master-port=PORT
master port here
詳細思路
- 按照標準的MySQL安裝過程,安裝好MySQL(其實就是從公司內部的源拷貝二進位檔案,adduser、chown等,這些都已經自動化)。我們線上的MySQL資料庫都預設安裝到/data1/my${port}下。例如連接埠為3306,那麼目錄名稱就是mysql3306。這主要是為了在單機啟動多個執行個體,充分利用多核的cpu。
- 修改設定檔。blackhole從庫的設定檔中,推薦加上skip-innodb,並把預設引擎修改為myisam。這樣做的好處是:當主庫上修改某些innodb表的時候,這些語句同步到從庫,而從庫禁用了innodb,就會被自動轉化為blackhole,這正是我們需要的。要注意的是,如果主庫的binlog採用的是statement,那麼blackhole從庫只能採用statement層級;主庫是row format,從庫也只能是row format。blackhole從庫的設定檔已經包含在代碼中,感興趣的可以看看。
- 啟動MySQL執行個體。調用的是我們自己的啟動指令碼。
- 擷取線上的庫表結構。為了安全,我們線上的root帳號沒有任何drop庫和表的許可權。所以這裡drop資料庫的方式比較怪異,採用的是rm 庫檔案夾的方法。這一步會從線上擷取所有需要的庫和表的結構,然後按照需要修改部分表的引擎為blackhole。當然,監控庫和許可權庫的表不能被修改為blackhole。
- 擷取許可權庫和監控庫的資料。這個過程會先擷取blackhole上需要的所有myisam表,然後用lock tables t1 read,t2 read, t3 read,… 的方式鎖住主庫上的所有相關表。匯出這些被鎖住的表的資料並匯入到blackhole從庫上,導完資料後,得到主庫的pos點,然後釋放鎖。這裡的匯出不能採用簡單的mysqldump —master-data 的方式。因為這種方式會給所有的表加上鎖,這會導致線上業務受到影響。採用flush tables with read lock會面臨同樣的問題。
- 根據得到的主庫pos點,在blackhole從庫上change master to。檢測同步狀態。
至此,blackhole從庫搭建完成。最後,總結一下blackhole從庫的用途,期待你的新發現。
BlackHole的用途
線上MySQL的binlog一般會保留3-5天,但是對比較重要的業務,binlog可能需要保留一個月甚至半年。線上伺服器可沒有這麼大的空間,最多保留10天就會被purge掉。此時blackhole就有了用武之地。blackhole從庫+xtrabackup的定期熱備+ @plinux的binlog flashback,可以讓你的資料庫恢複到任意時刻。
我們線上有很多業務,掛在blackhole從庫的後面。我們自己開發的binlog剖析器會適時分析binlog,然後把對應的資料插入到redis中。這種情況下blackhole從庫充當了天然的binlog API。
如果一個主庫拖著20個從庫,主庫可能不堪重負,此時可以考慮給主庫增加一個blackhole從庫作為中繼,雖然這種方案有諸多不靠譜的地方,但是如果這個主庫在北京,20個從庫在廣州,這種方案就有意義了:在廣州增加一個blackhole,讓blackhole下掛20個從庫,此時就可節省大量北京到廣州的頻寬。省下的錢加強下blackhole的HA應該綽綽有餘。
本文永久更新連結地址: