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