《持續(xù)交付發(fā)布可靠軟件的系統(tǒng)方法》讀書筆記
應用程序可以通過刪除前一個版本,使用新版本替換舊版本的方式部署怎炊,但是大多數(shù)系統(tǒng)棋傍,數(shù)據(jù)無法使用這種方式進行變更蚜锨,一旦某個系統(tǒng)發(fā)布到了生產(chǎn)環(huán)境中,關聯(lián)的數(shù)據(jù)將不斷增加沙绝。數(shù)據(jù)往往是系統(tǒng)中最有價值的部分搏明。當我們需要對數(shù)據(jù)系統(tǒng)進行結構修改或者內(nèi)容修改時,就需要相關的策略闪檬。
對數(shù)據(jù)的修改是不可避免的星著,關鍵在于將數(shù)據(jù)遷移過程自動化。目前有一些工具對數(shù)據(jù)遷移提供了較多支持粗悯,它們還允許對數(shù)據(jù)庫進行版本化管理虚循。
另一個重要部分是測試數(shù)據(jù)的管理。
數(shù)據(jù)庫腳本化
任何數(shù)據(jù)庫的修改都應該通過自動化過程來管理样傍。包括數(shù)據(jù)庫的初始化
横缔,數(shù)據(jù)庫所有的遷移
都需要腳本化,并將腳本提交到版本控制庫中衫哥。
幾乎所有的數(shù)據(jù)管理系統(tǒng)都支持通過自動化腳本進行數(shù)據(jù)存儲的初始化工作茎刚。
- 清除原有的數(shù)據(jù)庫
- 創(chuàng)建數(shù)據(jù)庫結構、數(shù)據(jù)彎路實例以及模式等
- 向數(shù)據(jù)庫加載數(shù)據(jù)
在大多數(shù)據(jù)項目中炕檩,數(shù)據(jù)庫的使用要復雜得多斗蒋。
增量式修改
絕大多數(shù)據(jù)系統(tǒng),對數(shù)據(jù)庫更新時笛质,要保留它們的數(shù)據(jù)泉沾。由于在部署時需要保留數(shù)據(jù)庫中的已有數(shù)據(jù),所以需要有回滾策略妇押,以便部署失敗時使用跷究。這就需要對數(shù)據(jù)庫進行版本控制。
- 在數(shù)據(jù)庫中創(chuàng)建一個數(shù)據(jù)敲霍,用來保存版本號
- 每次數(shù)據(jù)庫進行修改時俊马,需要創(chuàng)建兩個腳本:升級腳本、回滾腳本
- 有一個配置項來設置數(shù)據(jù)庫與應用版本對應關系
在很多項目中肩杈,多個程序共用一套數(shù)據(jù)庫存儲柴我。雖然這種方式并不推薦,最好是讓程序直接交互扩然,但是這種情況卻是常見的艘儒。這種環(huán)境下對數(shù)據(jù)庫變更,就需要對程序做完全的集成測試,確保數(shù)據(jù)庫變更對相關影響到的程序都能測試到界睁。同時對哪個應用使用了數(shù)據(jù)庫哪個對象做登記也是可以的觉增。
數(shù)據(jù)庫回滾和無停機發(fā)布
生產(chǎn)環(huán)境部署有兩個需求會成為數(shù)據(jù)庫回滾的約束。
- 回滾時需要保留本次升級后產(chǎn)生的數(shù)據(jù)
- 保持應用程序的可用狀態(tài)
- 保留數(shù)據(jù)的回滾
回滾腳本要滿足以下條件
- 包括模式修改翻斟,即不遷移任何數(shù)據(jù)
- 只刪除新版本使用的那些數(shù)據(jù)逾礁,即使這些數(shù)據(jù)丟失了也沒問題
對于以下情況
- 涉及從臨時表中將數(shù)據(jù)導回來
- 刪除那些舊版本系統(tǒng)無法接受的數(shù)據(jù)
第一種方法是將那些不想丟失的數(shù)據(jù)庫事務緩存,一旦應用程序被成功地重新部署访惜,這些事件就可以重新播放一遍嘹履。
第三種方法是使用藍綠部署,發(fā)布時對生產(chǎn)數(shù)據(jù)庫(藍環(huán)境)做一個備份疾牲,將備份放在綠環(huán)境中應用植捎,遷移數(shù)據(jù),將用戶切換到綠環(huán)境中阳柔⊙媸啵回滾時,將用戶切回藍環(huán)境舌剂,再把綠環(huán)境的數(shù)據(jù)庫上發(fā)生的新事務回收济锄,在下一次更新之前重新應用這些事務到藍數(shù)據(jù)庫上。
- 應用程序部署與數(shù)據(jù)庫遷移解耦
第三種方法是將應用程序部署過程與數(shù)據(jù)遷移過程解耦霍转,分別執(zhí)行荐绝,這種可用于管理熱部署。
開發(fā)應用程序升級的中間版本避消,它既與數(shù)據(jù)庫上個版本兼容低滩,也與數(shù)據(jù)庫下個版本兼容。
測試數(shù)據(jù)的管理
- 為單元測試進行數(shù)據(jù)庫模擬
單元測試不使用真正的數(shù)據(jù)庫岩喷,通常它會使用測試替身對象來取代與數(shù)據(jù)庫打交道的服務恕沫。如果做不到的話:
- 用測試替身對象來替代那些訪問數(shù)據(jù)庫的代碼,通常使用repository模式
- 使用假的數(shù)據(jù)庫纱意,如H2/SQLite/JavaDB婶溯。單元測試運行在一個內(nèi)存數(shù)據(jù)庫上,讓驗收測試運行在平時使用的磁盤的數(shù)據(jù)庫上偷霉。
- 管理測試與數(shù)據(jù)之間的耦合
以下三種方法可以用來做測試設計迄委,便于管理好數(shù)據(jù)的狀態(tài):
- 測試的獨立性[推薦],合理組織測試类少,讓每個測試的數(shù)據(jù)只對該測試可見
- 適應性測試叙身,運行時先對數(shù)據(jù)環(huán)境進行檢查,用檢查的數(shù)據(jù)作為數(shù)據(jù)基礎進行測試
- 測試的順序硫狞,按某種已知的序列運行信轿,每次測試輸入依賴于前一個輸出
保持測試的獨立性最簡單的方法是確保在測試結束時赞警,總是把數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)恢復到測試之前。
對于支持事務的數(shù)據(jù)庫來說虏两,測試開始時創(chuàng)建一個事務,在事務內(nèi)執(zhí)行所需的數(shù)據(jù)庫操作與交互世剖,測試結束后定罢,將該事務進行回滾。
不建議創(chuàng)建一個連貫的“故事”進行順序執(zhí)行旁瘫,這個有序的測試無法真正地代表測試的目的和內(nèi)容祖凫。
數(shù)據(jù)管理和部署流水線
- 提交階段的測試數(shù)據(jù),避免復雜的數(shù)據(jù)準備酬凳。
- 驗收測試的數(shù)據(jù)惠况,盡可能減少測試對大型復雜數(shù)據(jù)結構的依賴。測試專屬數(shù)據(jù)宁仔、測試引用數(shù)據(jù)稠屠、應用程序引用數(shù)據(jù)
- 容量測試的數(shù)據(jù),為測試提供足夠的輸入數(shù)據(jù)翎苫,準備適當?shù)囊脭?shù)據(jù)支持測試中的用例
- 其他測試階段的數(shù)據(jù)权埠,推薦利用生產(chǎn)數(shù)據(jù)的一個子集或者運行一些自動化驗收測試或者容量測試之后產(chǎn)生的數(shù)據(jù)庫,為其他測試階段提供數(shù)據(jù)煎谍。