在WinOps 2017大會(huì)上,Sabin.io首席顧問(wèn)Simon Sabin做了一個(gè)演講,介紹如何將數(shù)據(jù)庫(kù)更改加入到持續(xù)部署模型中。從數(shù)據(jù)庫(kù)所有者的角度看,要實(shí)現(xiàn)在多個(gè)服務(wù)或應(yīng)用間共享數(shù)據(jù)庫(kù),關(guān)鍵之一就是將這些共享數(shù)據(jù)庫(kù)看成是API。
Sabin建議考慮使用視圖、觸發(fā)器和存儲(chǔ)過(guò)程等機(jī)制。它們可以更改數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu),并同時(shí)保持向后兼容的應(yīng)用數(shù)據(jù)操作。他舉了一個(gè)例子,一個(gè)存儲(chǔ)信用卡號(hào)的數(shù)據(jù)庫(kù)表已經(jīng)從純文本改為被加密的,但要保證應(yīng)用依然以純文本方式檢索卡號(hào)。例子中是通過(guò)查詢視圖實(shí)現(xiàn)的,而實(shí)際的數(shù)據(jù)庫(kù)表通過(guò)觸發(fā)器實(shí)現(xiàn)信息的加密和解密。處理結(jié)構(gòu)如下圖所示:
數(shù)據(jù)庫(kù)向應(yīng)用提供隱式的合約和接口,其中數(shù)據(jù)庫(kù)的內(nèi)部更改(通常出于性能、安全和其它一些改進(jìn)的需要)不應(yīng)該影響到應(yīng)用。這一原則可以類比為API,突破性更改同樣遵循最小化原則,并應(yīng)給出大量的通知信息,保證應(yīng)用在實(shí)際數(shù)據(jù)更改之前采納和部署前向兼容更改。對(duì)數(shù)據(jù)庫(kù)應(yīng)用消費(fèi)者驅(qū)動(dòng)合約,這樣的方法是可延展的。
按Sabin的說(shuō)法,需要這一方法去調(diào)和對(duì)共享數(shù)據(jù)庫(kù)的不同視角。應(yīng)用開(kāi)發(fā)人員總是將數(shù)據(jù)庫(kù)看成是“沉默的存儲(chǔ)”,而數(shù)據(jù)庫(kù)管理員(DBA)則將數(shù)據(jù)庫(kù)看成是關(guān)鍵業(yè)務(wù)數(shù)據(jù)的倉(cāng)儲(chǔ)之所。理想情況下,每個(gè)應(yīng)用團(tuán)隊(duì)會(huì)有自己的數(shù)據(jù)庫(kù),團(tuán)隊(duì)中也應(yīng)具有DBA角色,但這通常難以達(dá)到。
當(dāng)應(yīng)用本身就需要模式或其它更改時(shí),Sabin建議降低批處理的規(guī)模(因?yàn)樵跀?shù)據(jù)庫(kù)中實(shí)現(xiàn)可靠性和一致性是一個(gè)復(fù)雜的任務(wù)),一次應(yīng)用一個(gè)小更改,并更改相應(yīng)的應(yīng)用代碼。選取何種遷移機(jī)制,是金模式(Gold Schema)還是遷移腳本方式,依賴于更改的具體類型。在Sabin看來(lái),相比于對(duì)抗式的,這一機(jī)制更多是補(bǔ)充式的。對(duì)于模式更改,適用于金模式機(jī)制。金模式定義了目標(biāo)模式(期望狀態(tài)),并使用類似于SQLCompare這類的工具做了當(dāng)前狀態(tài)和期望狀態(tài)間的“差異比較”。遷移腳本包括DBDeploy、Flyway或ReadyRoll等,該機(jī)制可能更適用于更復(fù)雜的修改。
Sabin還推薦了其它一些方法,包括:指定數(shù)據(jù)庫(kù)去適合自身工具而非其它方法,將部署信息添加到數(shù)據(jù)庫(kù)自身中以便于追蹤和診斷問(wèn)題,將數(shù)據(jù)庫(kù)更改作為交付流水線一部分看待以提升可審校性和合規(guī)性。演講的最后,Sabin建議使用區(qū)分在“私有”和“公開(kāi)”的方法極大地改進(jìn)數(shù)據(jù)安全(在持續(xù)發(fā)生關(guān)鍵數(shù)據(jù)泄漏時(shí))。例如,讓一個(gè)可訪問(wèn)(“公開(kāi)”)的小型數(shù)據(jù)庫(kù)中提供對(duì)較大規(guī)模的安全(“私有”)數(shù)據(jù)庫(kù)的視圖,而“私有”數(shù)據(jù)庫(kù)是不應(yīng)被應(yīng)用本身直接訪問(wèn)的。
正如DevSecOps運(yùn)動(dòng)是經(jīng)過(guò)一段時(shí)間后才得以確立,將數(shù)據(jù)庫(kù)更改加入到集成持續(xù)部署過(guò)程中的理念業(yè)已存在一段時(shí)間了,并被冠以各種稱法。Sabin將其稱為“Data DevOps”,也有人將其稱為“數(shù)據(jù)庫(kù)生命周期管理”(DLM,Database Lifecycle Management)。另一位WinOps 2017大會(huì)演講者,Eduardo Piairo,指出:
DevOps并非是要定義一個(gè)處理數(shù)據(jù)庫(kù)更改的新過(guò)程,而是將數(shù)據(jù)庫(kù)更改和應(yīng)用及架構(gòu)代碼一并集成到服務(wù)生命周期中。
查看英文原文: Treating Shared Databases Like APIs in a DevOps World