前言
這些年來,做數(shù)據(jù)庫管理平臺,DBA積攢了不少腳本和工具。由于公司維護(hù)的數(shù)據(jù)庫組件較多,每個組件有自己的代碼,因為不斷的需求變更以及新功能開發(fā),需要對線上的管理工具庫進(jìn)行升級。
雖然公司有專業(yè)的軟件發(fā)布管理平臺,但是由于我們管理的數(shù)據(jù)庫機(jī)器多,數(shù)據(jù)庫組件也比較多,在不斷升級演進(jìn)的過程中會碰到以下幾個問題:
- 每次批量下發(fā)大量的主機(jī),工作量不小,而且每次發(fā)版都會存在部分主機(jī)因為各種原因發(fā)版不成功;
- 多個數(shù)據(jù)庫組件工具庫同時開發(fā)灰度中,新發(fā)版本控制問題;
- 新版本已發(fā)版,但是線上有機(jī)器沒有及時更新新版本;
思路
為了方便版本管理和及時的升級,初步考慮了以下的思路來對數(shù)據(jù)庫主機(jī)上的DBA工具庫的版本進(jìn)行管理。
管理機(jī)
考慮到每次向幾千臺數(shù)據(jù)庫機(jī)器發(fā)版,不僅工作量大,而且容易出現(xiàn)漏發(fā)、錯發(fā)的問題,所以規(guī)劃出管理機(jī),后續(xù)所有的發(fā)版操作都在管理機(jī)上進(jìn)行。
在管理機(jī)器上進(jìn)行以下的操作:
- 所有發(fā)版都在管理機(jī)上進(jìn)行,并且在管理機(jī)DBA工具庫的有效的歷史版本信息;
- 管理機(jī)提供版本發(fā)現(xiàn)服務(wù)和版本下載服務(wù),初步考慮提供http服務(wù)來實現(xiàn);
版本規(guī)劃
因為系統(tǒng)要不斷進(jìn)行功能升級,優(yōu)化和BUG修復(fù),所以系統(tǒng)中會同時存在正式版本和灰度版本兩種。
正式版本
正式版本采用GNU風(fēng)格三段式版本號,即Major. Minor. Patch。用數(shù)值表示版本號,數(shù)值之間用小圓點“.”分隔。
Major:表示大版本號,一般當(dāng)工具庫出現(xiàn)重大更新,重寫或者不再向后兼容的情況時,版本號會在Major上加1;
Minor:表示次版本號,當(dāng)工具庫有功能更新或者小的功能迭代和調(diào)整時,版本號會在Minor上加1。同理當(dāng)Minor增加1時,也會將后面的Patch清零。
Patch:表示修訂號或補(bǔ)丁號,當(dāng)工具庫修復(fù)了一個bug或者少量局部優(yōu)化調(diào)整時,版本號會在Patch上加1。
版本大?。和ㄟ^上述原則,按照Major, Minor, Patch三者找那個前面越大,版本越大為原則,后續(xù)自動升級過程中,會根據(jù)版本大小判斷,是否需要升級以及升級到哪個版本。
灰度版本
灰度版本可以在正式版本后面后綴:.gray.<數(shù)據(jù)庫組件名>.<GRAYVERSION>,例如,1.0.1.gray.mysql.1。表示對應(yīng)1.0.1版本的mysql灰度版本。
數(shù)據(jù)庫主機(jī)
在每臺數(shù)據(jù)庫主機(jī)上安裝DBA工具庫初始版本,DBA工具庫支持自升降級服務(wù)。
自升級服務(wù)
自升降級的邏輯如下:
- 定時向管理機(jī)發(fā)起最新版本探測服務(wù);
- 新版本探測服務(wù)獲取管理機(jī)上的最大正式版本;
- 對比數(shù)據(jù)庫主機(jī)上正式版本與管理機(jī)獲取的最大版本號,如果不同就自動下載對應(yīng)的版本;
通過上述邏輯,就能自動的實現(xiàn)DBA工具庫的自動升降機(jī)功能。
例如:
- 現(xiàn)狀
管理機(jī)現(xiàn)有:1.1.15, 1.1.12, 1.1.0 三個版本的DBA工具庫。
所有的數(shù)據(jù)庫主機(jī)已經(jīng)升級到最新版本1.1.15, - 目標(biāo):升級工具庫到1.1.16
DBA向管理機(jī)發(fā)布最新版本1.1.16,于是管理機(jī)上有1.1.16, 1.1.15, 1.1.12, 1.1.0四個版本; - 自動升級
所有數(shù)據(jù)庫主機(jī)的DBA工具庫定時發(fā)現(xiàn)管理機(jī)上的最新版本為1.1.16,與數(shù)據(jù)庫主機(jī)的版本1.1.15不一致,于是自動向管理機(jī)發(fā)起下載1.1.16版本。
下載完成后,做必要的服務(wù)重啟等工作,數(shù)據(jù)庫主機(jī)就完成了升級。
灰度升級服務(wù)
同時考慮到灰度需求,考慮會給各種不同數(shù)據(jù)庫組件的幾臺主機(jī)打上灰度標(biāo)簽。
打了灰度標(biāo)簽的主機(jī),除了正式的版本升降級外,還需要進(jìn)行灰度版的升級功能。
灰度升級服務(wù)的邏輯稍微有點不同,大致流程為:
- 定時向管理機(jī)發(fā)起最新灰度版本探測服務(wù);
- 新版本探測服務(wù)獲取管理機(jī)上的最大灰度版本;
- 對比數(shù)據(jù)庫主機(jī)上現(xiàn)有版本與管理機(jī)獲取的最大灰度版本;
- 如果數(shù)據(jù)庫主機(jī)現(xiàn)存的是正式版本,則灰度版本號大于現(xiàn)存正式版本,則下載灰度版本,否則不處理;
- 如果數(shù)據(jù)庫主機(jī)現(xiàn)存的已經(jīng)是灰度版本,則對比管理機(jī)上的灰度版本與現(xiàn)存灰度版本號,如果比管理機(jī)上的版本號小就下載對應(yīng)的灰度版本,否則不處理;
例子:
- 現(xiàn)狀
數(shù)據(jù)庫主機(jī)現(xiàn)存1.1.15 - 準(zhǔn)備灰度1.1.16.gray.mysql.1
往管理機(jī)發(fā)布DBA工具庫版本1.1.16.gray.mysql.1 - 打標(biāo)簽的數(shù)據(jù)庫主機(jī)
獲取到管理機(jī)最新灰度版本為1.1.16.gray.mysql.1,因為1.1.16比現(xiàn)存的1.1.15大,所以下載改灰度版本
當(dāng)發(fā)現(xiàn)1.1.16.gray.mysql.1有bug時,我們有兩個措施:
- 向管理機(jī)發(fā)新的1.1.16.gray.mysql.2,因為1.1.16.gray.mysql.2比1.1.16.gray.mysql.1大,所以會下載1.1.16.gray.mysql.2的工具庫;
- 刪除1.1.16.gray.mysql.1的灰度版本,在正式版本自升降流程中,會完成該數(shù)據(jù)庫主機(jī)從管理機(jī)下載1.1.15正式版本,從而覆蓋有bug的1.1.16.gray.mysql.1版本。
總結(jié)
以上是一個實現(xiàn)思路,筆者也打算按照這個思路去構(gòu)建DBA工具庫的分發(fā),簡化我們現(xiàn)在的版本管理流程。
如果讀者有更好的方法,歡迎一起探討和交流。