如何為分布式系統(tǒng)設(shè)計數(shù)據(jù)庫
譯文譯者 | 李睿
審校 | 重樓
數(shù)據(jù)庫設(shè)計是微服務(wù)和云原生解決方案中的一個關(guān)鍵因素,因為基于微服務(wù)的架構(gòu)會導(dǎo)致出現(xiàn)分布式數(shù)據(jù)。多個進(jìn)程可以操作數(shù)據(jù),而不是在單個進(jìn)程中進(jìn)行數(shù)據(jù)管理。云計算的興起使得數(shù)據(jù)更加分散。
為了應(yīng)對這種復(fù)雜性,針對微服務(wù)和云原生解決方案的數(shù)據(jù)管理已經(jīng)出現(xiàn)了幾種模式。本文將介紹可以幫助企業(yè)在分布式環(huán)境中管理數(shù)據(jù)的重要模式。
面向微服務(wù)和云的數(shù)據(jù)庫設(shè)計的挑戰(zhàn)
在深入研究具體的數(shù)據(jù)管理模式之前,先了解微服務(wù)和云數(shù)據(jù)庫設(shè)計面臨的關(guān)鍵挑戰(zhàn):
- 在微服務(wù)架構(gòu)中,數(shù)據(jù)分布在不同的節(jié)點上。其中一些節(jié)點可能位于世界各地完全不同地理區(qū)域的不同數(shù)據(jù)中心。在這種情況下,很難保證跨所有節(jié)點的數(shù)據(jù)一致性。在任何給定的時間點,不同節(jié)點之間的數(shù)據(jù)狀態(tài)可能存在差異。這也被稱為最終一致性問題。
- 由于數(shù)據(jù)是分布式的,因此沒有像單節(jié)點整體系統(tǒng)那樣的中央機構(gòu)來管理數(shù)據(jù)。對于各個參與系統(tǒng)來說,使用一種機制(例如共識算法)進(jìn)行數(shù)據(jù)管理是很重要的。
- 在微服務(wù)架構(gòu)中,惡意行為者的攻擊面更大,因為有多個活動部分。這意味著開發(fā)人員需要在構(gòu)建微服務(wù)時建立一個更健壯的安全態(tài)勢。
- 微服務(wù)和云計算的主要承諾是可擴展性。雖然擴展應(yīng)用程序進(jìn)程變得更容易,但橫向擴展數(shù)據(jù)庫節(jié)點就不那么容易了。如果沒有適當(dāng)?shù)目蓴U展性,數(shù)據(jù)庫可能會變成性能瓶頸。
深入研究數(shù)據(jù)管理模式
考慮到相關(guān)的挑戰(zhàn),有幾種模式可用于管理微服務(wù)和云原生應(yīng)用程序中的數(shù)據(jù)。這些模式的主要工作是幫助開發(fā)人員解決以下提到的各種挑戰(zhàn)。以下逐一看看這些模式。
1.每個微服務(wù)的數(shù)據(jù)庫
顧名思義,這種模式建議每個微服務(wù)管理自己的數(shù)據(jù)。這意味著沒有其他微服務(wù)可以直接訪問或操作由另一個微服務(wù)管理的數(shù)據(jù)。任何數(shù)據(jù)交換或操作都只能通過使用一組定義良好的API來完成。下圖顯示了每個微服務(wù)的數(shù)據(jù)庫模式的示例。
圖1每個微服務(wù)數(shù)據(jù)庫模式
從表面上看,這個模式似乎很簡單。當(dāng)從一個全新的應(yīng)用程序開始時,它可以相對容易地實現(xiàn)。然而,當(dāng)將現(xiàn)有的單片應(yīng)用程序遷移到微服務(wù)架構(gòu)時,服務(wù)之間的界限就不那么清晰了。
大多數(shù)功能都是以一種方式編寫的,即系統(tǒng)的不同部分可以非正式地從其他部分訪問數(shù)據(jù)。
在使用數(shù)據(jù)庫服務(wù)模式時,需要關(guān)注兩個主要方面:
- 為每個微服務(wù)定義有界場景。
- 管理跨多個微服務(wù)的業(yè)務(wù)事務(wù)。
2.共享數(shù)據(jù)庫
下一個重要的模式是共享數(shù)據(jù)庫模式。盡管這一模式支持微服務(wù)架構(gòu),但它采用了一種更為寬松的方法,即使用可被多個微服務(wù)訪問的共享數(shù)據(jù)庫。對于正在向微服務(wù)架構(gòu)過渡的現(xiàn)有應(yīng)用程序,這是一種更安全的模式,因為可以在不改變數(shù)據(jù)庫設(shè)計的情況下慢慢地發(fā)展應(yīng)用層。然而,這種方法剝奪了微服務(wù)的一些好處:
- 跨團(tuán)隊的開發(fā)人員需要協(xié)調(diào)表的模式更改。
- 當(dāng)多個服務(wù)試圖訪問相同的數(shù)據(jù)庫資源時,可能會出現(xiàn)運行時沖突。
3.CQRS和事件溯源
在命令-查詢-責(zé)任分離(CQRS)模式中,應(yīng)用程序偵聽來自其他微服務(wù)的域事件,并更新單獨的數(shù)據(jù)庫以支持視圖和查詢。然后,可以從這個單獨的數(shù)據(jù)庫中提供復(fù)雜的聚合查詢,同時優(yōu)化性能并根據(jù)需要進(jìn)行擴展。
事件溯源通過將實體或聚合的狀態(tài)存儲為事件序列而更進(jìn)一步。每當(dāng)對對象進(jìn)行更新或插入操作時,就會創(chuàng)建一個新事件并將其存儲在事件存儲庫中。你可以一起使用CQRS和事件溯源來解決事件處理和維護(hù)獨立查詢數(shù)據(jù)方面的許多挑戰(zhàn)。這樣,就可以根據(jù)各自的需求分別擴展寫操作和讀操作。
圖2事件溯源和CQRS一起行動
對于大多數(shù)開發(fā)人員來說,不利的一面是,這是一種不熟悉的構(gòu)建應(yīng)用程序的風(fēng)格,并且需要管理更多的活動部分。
4.Saga模式
Saga模式是跨多個微服務(wù)處理業(yè)務(wù)事務(wù)的另一種解決方案。例如,在快餐配送應(yīng)用程序上下訂單是一種商業(yè)交易。在Saga模式中,將這一業(yè)務(wù)事務(wù)分解為由不同服務(wù)處理的本地事務(wù)序列。對于每個本地事務(wù),執(zhí)行該事務(wù)的服務(wù)都會發(fā)布一個事件。
該事件觸發(fā)另一個服務(wù)中的后續(xù)事務(wù),該鏈將會繼續(xù),直到整個業(yè)務(wù)事務(wù)完成。如果鏈中的任何特定事務(wù)失敗,則通過執(zhí)行一系列補償事務(wù)來回滾,這些事務(wù)撤消所有先前事務(wù)的影響。
有兩種類型的Saga實現(xiàn):
- 基于編配的Saga
- 基于Choreography的Saga
5.分片
分片有助于構(gòu)建云原生應(yīng)用程序。它涉及到將一個表的行分成多個不同的表。這也被稱為水平分區(qū),但是當(dāng)分區(qū)位于不同的節(jié)點上時,它們被稱為分片。分片幫助開發(fā)人員提高數(shù)據(jù)庫的讀寫可擴展性。此外,它還提高了查詢的性能,因為由于分片,特定查詢必須處理更少的記錄。
6.復(fù)制
復(fù)制是一種非常重要的數(shù)據(jù)管理模式。它涉及到創(chuàng)建數(shù)據(jù)庫的多個副本。每個副本都是相同的,并且在不同的服務(wù)器或節(jié)點上運行。對一個副本所做的更改將傳播到其他副本。這就是所謂的復(fù)制。有幾種類型的復(fù)制方法,例如:
- 單領(lǐng)導(dǎo)者復(fù)制
- 多領(lǐng)導(dǎo)者復(fù)制
- 無領(lǐng)導(dǎo)者復(fù)制
復(fù)制幫助實現(xiàn)高可用性和提高可靠性,并且它允許擴展讀取操作,因為讀取請求可以轉(zhuǎn)移到多個服務(wù)器。圖3顯示了分片和復(fù)制的組合工作。
圖3同時使用分片和復(fù)制
云原生環(huán)境中數(shù)據(jù)庫設(shè)計的最佳實踐
雖然這些模式在解決微服務(wù)和云原生架構(gòu)中的數(shù)據(jù)管理問題方面大有幫助,但還需要遵循一些最佳實踐,以使工作和生活更輕松。
以下是一些最佳實踐:
- 必須設(shè)法設(shè)計一個具有彈性的解決方案。這是因為故障在微服務(wù)架構(gòu)中是不可避免的,設(shè)計應(yīng)該適應(yīng)故障,并在不中斷業(yè)務(wù)的情況下從中恢復(fù)。
- 當(dāng)轉(zhuǎn)換到其中一種模式時必須實現(xiàn)適當(dāng)?shù)倪w移策略??梢栽u估的一些常見策略是模式優(yōu)先與數(shù)據(jù)優(yōu)先、藍(lán)綠部署或使用扼殺模式。
- 不要忽視備份和經(jīng)過良好測試的災(zāi)難恢復(fù)系統(tǒng)。即使對于單節(jié)點數(shù)據(jù)庫,這些也很重要。然而,在分布式數(shù)據(jù)管理方法中,災(zāi)難恢復(fù)變得更加重要。
- 在微服務(wù)或云原生應(yīng)用中,持續(xù)監(jiān)控和可觀察性同樣重要。例如,分片之類的技術(shù)可能導(dǎo)致分區(qū)和熱點不平衡。如果沒有適當(dāng)?shù)谋O(jiān)控解決方案,對這種情況的任何反應(yīng)都可能來得太晚,并可能使業(yè)務(wù)面臨風(fēng)險。
結(jié)論
因此可以得出結(jié)論,良好的數(shù)據(jù)庫設(shè)計在微服務(wù)和云原生環(huán)境中絕對是至關(guān)重要的。由于分布式數(shù)據(jù)固有的復(fù)雜性,如果沒有適當(dāng)?shù)脑O(shè)計,應(yīng)用程序?qū)⒚媾R多種問題。有多種數(shù)據(jù)管理模式能夠以更可靠和可擴展的方式處理數(shù)據(jù)。然而,每種模式都有自己的挑戰(zhàn)以及優(yōu)點和缺點。沒有任何一種模式能夠適合所有可能的場景,開發(fā)人員應(yīng)該在進(jìn)行各種權(quán)衡之后選擇一個特定的模式。
原文標(biāo)題:Designing Databases for Distributed Systems,作者:Saurabh Dashora