本文為本人讀《從Paxos到ZooKeeper》一書的一些讀書筆記周拐,僅供學(xué)習(xí)使用,謝謝凰兑。
一妥粟、從集中式到分布式
1.1 分布式的定義:
分布式系統(tǒng)是一個(gè)硬件或軟件組件分布在不同的網(wǎng)絡(luò)計(jì)算機(jī)上,彼此之間僅僅通過消息傳遞進(jìn)行通信和協(xié)調(diào)的系統(tǒng)吏够。
一個(gè)標(biāo)準(zhǔn)的分布式系統(tǒng)在沒有任何業(yè)務(wù)邏輯約束的情況下勾给,都會(huì)有以下特征:
- 分布性
- 對(duì)等性
- 并發(fā)性
- 缺乏全局時(shí)鐘
- 故障總是會(huì)發(fā)生
1.2 分布式環(huán)境的各種問題
通信異常
由于網(wǎng)絡(luò)本身的不可靠性,導(dǎo)致各網(wǎng)絡(luò)節(jié)點(diǎn)之間進(jìn)行網(wǎng)絡(luò)通信時(shí)锅知,會(huì)伴隨著不可預(yù)知的風(fēng)險(xiǎn)播急,網(wǎng)絡(luò)光纖、路由器或是DNS等硬件設(shè)備或是系統(tǒng)不可用都會(huì)導(dǎo)致最終分布式系統(tǒng)無法順利完成一次網(wǎng)絡(luò)通信售睹。另外桩警,集群的延時(shí)通常會(huì)遠(yuǎn)大于單機(jī)操作。
網(wǎng)絡(luò)分區(qū)
網(wǎng)絡(luò)的異常會(huì)導(dǎo)致分布式系統(tǒng)中昌妹,只有部分節(jié)點(diǎn)能夠正常通信捶枢,從而形成了網(wǎng)絡(luò)分區(qū)握截。
三態(tài)
相比于單機(jī)的失敗或者成功,集群會(huì)出現(xiàn)“三態(tài)”的概念烂叔,即成功谨胞、失敗與超時(shí)。有兩種丟消息的情況:
- 由于網(wǎng)絡(luò)原因蒜鸡,消息沒有成功發(fā)送到接收方胯努,而是在發(fā)送過程就發(fā)生了丟失現(xiàn)象。
- 接收方處理后逢防,響應(yīng)給發(fā)送方的過程中叶沛,發(fā)生消息丟失現(xiàn)象。
節(jié)點(diǎn)故障
分布式服務(wù)器節(jié)點(diǎn)宕機(jī)或“僵死”現(xiàn)象胞四。
二恬汁、從ACID到CAP/BASE
2.1 ACID
事務(wù)(Transaction)是由一系列對(duì)系統(tǒng)中數(shù)據(jù)進(jìn)行訪問和更新的操作鎖組成的一個(gè)程序執(zhí)行邏輯單元(Unit),狹義上的事務(wù)特指數(shù)據(jù)庫(kù)事務(wù)辜伟。一方面氓侧,當(dāng)多個(gè)應(yīng)用程序并發(fā)訪問數(shù)據(jù)庫(kù)時(shí),事務(wù)可以在這些應(yīng)用程序之間提供一個(gè)隔離方法导狡,以防止彼此的操作互相干擾约巷。另一方面,事務(wù)為數(shù)據(jù)庫(kù)操作序列提供了一個(gè)從失敗恢復(fù)到正常狀態(tài)的方法旱捧,同時(shí)提供了數(shù)據(jù)庫(kù)即使在異常狀態(tài)下仍能保持?jǐn)?shù)據(jù)一致性的方法独郎。
事務(wù)具有四個(gè)特征,分別是原子性(Atomicity)枚赡、一致性(Consistency)氓癌、隔離性(Isolation)和持久性(Durability),簡(jiǎn)稱事務(wù)的ACID特性贫橙。
原子性
指事務(wù)必須是一個(gè)院子的操作序列單元贪婉。事務(wù)中包含的各項(xiàng)操作在一次執(zhí)行過程中,只允許出現(xiàn)以下兩種狀態(tài)之一卢肃。
- 全部成功執(zhí)行疲迂。
- 全部不執(zhí)行。
任何一項(xiàng)操作失敗都將導(dǎo)致整個(gè)事務(wù)失敗莫湘,同時(shí)其他已經(jīng)被執(zhí)行的操作豆?jié){杯撤銷并回滾尤蒿,只有所有的操作全部成功,整個(gè)事務(wù)才算是成功完成幅垮。
一致性
事務(wù)的一致性是指事務(wù)的執(zhí)行不能破壞數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和一致性腰池,一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫(kù)都必須處于一致性狀態(tài)。
隔離性
是指在并發(fā)環(huán)境中巩螃,并發(fā)的事務(wù)是相互隔離的演怎,一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。在標(biāo)準(zhǔn)的SQL規(guī)范中避乏,定義了4個(gè)事務(wù)隔離級(jí)別,不同的隔離級(jí)別對(duì)事務(wù)的處理不同甘桑,如未授權(quán)讀取(Read Uncommitted)拍皮、授權(quán)讀取(Read Committed)、可重復(fù)讀(Repeatable Read,MYSQL 默認(rèn)采用)和串行化(Serializable)跑杭。
持久性
是指事務(wù)一旦提交铆帽,他對(duì)數(shù)據(jù)庫(kù)中對(duì)應(yīng)數(shù)據(jù)的狀態(tài)變更就應(yīng)該是永久性的。
2.2 分布式事務(wù)
分布式shi'wu事務(wù)是指事務(wù)的參與者德谅、支持事務(wù)的服務(wù)器爹橱、資源服務(wù)器以及事務(wù)管理器分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)之上。通常一個(gè)分布式事務(wù)中會(huì)涉及到對(duì)多個(gè)數(shù)據(jù)源或業(yè)務(wù)系統(tǒng)的操作窄做。
2.3 CAP和BASE理論
對(duì)于一個(gè)高訪問量愧驱、高并發(fā)的互聯(lián)網(wǎng)分布式系統(tǒng)來說,如果我們期望實(shí)現(xiàn)一套嚴(yán)格滿足ACID特性的分布式事務(wù)椭盏,很可能出現(xiàn)的情況就是在系統(tǒng)的可用性和嚴(yán)格一致性之間出現(xiàn)沖突-因?yàn)楫?dāng)我們要求分布式系統(tǒng)具有嚴(yán)格一致性時(shí)组砚,很可能就需要犧牲掉系統(tǒng)的可用性。但是掏颊,可用性優(yōu)勢(shì)一個(gè)不允許我們討價(jià)還價(jià)的系統(tǒng)屬性糟红,對(duì)于一致性,則更加是所有消費(fèi)者對(duì)于一個(gè)軟件系統(tǒng)的剛需乌叶。因此盆偿,在可用性和一致性之間永遠(yuǎn)無法存在一個(gè)兩全其美的方案,于是出現(xiàn)了諸如CAP和BASE這樣的分布式系統(tǒng)經(jīng)典理論准浴。
CAP定理
一個(gè)分布式系統(tǒng)不可能同時(shí)滿足一致性(Consistency)事扭、可用性(Availability)和分區(qū)容錯(cuò)性(Partition tolerance)這三個(gè)基本需求,最多只能同時(shí)滿足其中的兩項(xiàng)兄裂。
需要明確的一點(diǎn)是句旱,對(duì)于一個(gè)分布式系統(tǒng)而言,分區(qū)容錯(cuò)性可以說是一個(gè)最基本的要求晰奖。因?yàn)榧热皇且粋€(gè)分布式系統(tǒng)谈撒,那么分布式系統(tǒng)中的組件必然需要被部署到不同的節(jié)點(diǎn),否則也就無所謂分布式系統(tǒng)了匾南,因此必然出現(xiàn)子網(wǎng)絡(luò)啃匿。而對(duì)于分布式系統(tǒng)而言,網(wǎng)絡(luò)問題又是一個(gè)必定會(huì)出現(xiàn)的異常情況,因此分區(qū)容錯(cuò)性也就成為了一個(gè)分布式系統(tǒng)必然要面對(duì)和解決的問題溯乒。因此系統(tǒng)架構(gòu)設(shè)計(jì)師往往需要把經(jīng)歷花在如何根據(jù)業(yè)務(wù)特點(diǎn)在C和A之間尋求平衡夹厌。
BASE理論
BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)三個(gè)短語的簡(jiǎn)寫裆悄。
總的來說矛纹,BASE理論面向的是大型高可用可擴(kuò)展的分布式系統(tǒng),和傳統(tǒng)事務(wù)的ACID特性是相反的光稼,他完全不同于ACID的強(qiáng)一致性模型或南,而是提出通過犧牲強(qiáng)一致性來獲得可用性,并允許數(shù)據(jù)在一段時(shí)間內(nèi)是不一致的艾君,但最終達(dá)到一致狀態(tài)采够。但同時(shí),在實(shí)際的分布式場(chǎng)景中冰垄,不同業(yè)務(wù)單元和組件對(duì)數(shù)據(jù)一致性的要求是不同的蹬癌,因此在具體的分布式系統(tǒng)架構(gòu)設(shè)計(jì)中,ACID特性和BASE理論往往會(huì)結(jié)合在一起使用虹茶。