對(duì)于CAP來(lái)說(shuō)图毕,放棄強(qiáng)一致性盈匾,追求分區(qū)容錯(cuò)性和可用性,這是很多分布式系統(tǒng)設(shè)計(jì)時(shí)的選擇淑仆。在工程實(shí)際中,基于CAP定理逐步演化加叁,就提出了Base理論倦沧。
1 .Base 理論
Base 是三個(gè)短語(yǔ)的簡(jiǎn)寫(xiě),即基本可用(Basically Available)它匕、軟狀態(tài)(Soft State) 和最終一致性(Eventually Consistent)
Base 理論的核心思想是最終一致性展融,即使無(wú)法做法強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點(diǎn)采用適當(dāng)?shù)姆椒▉?lái)使系統(tǒng)達(dá)到最終一致性豫柬。
1) 基本可用
就是不追求CAP中的【任何時(shí)候告希,讀寫(xiě)都是成功的】,而是系統(tǒng)能夠基本運(yùn)行烧给,一直提供服務(wù)燕偶。基本可用強(qiáng)調(diào)了分布式系統(tǒng)在出現(xiàn)不可預(yù)知的故障的時(shí)候础嫡,允許損失部分可用性指么,相比正常系統(tǒng),可能響應(yīng)時(shí)間延長(zhǎng)驰吓,或者服務(wù)被降級(jí)涧尿。
比如:在雙十一秒殺活動(dòng)中,如果搶購(gòu)人數(shù)太多超過(guò)了系統(tǒng)的QPS峰值檬贰,可能會(huì)排隊(duì)或者提示限流姑廉,這就是通過(guò)合理的手段保護(hù)系統(tǒng)的穩(wěn)定性,保證主要的服務(wù)正常翁涤,保證基本可用桥言。
2) 軟狀態(tài)
軟狀態(tài)可以對(duì)應(yīng)ACID事務(wù)中的原子性,在ACID的事務(wù)中葵礼,實(shí)現(xiàn)的是強(qiáng)一致性号阿,要么全做要么全不做,所有用戶看到的數(shù)據(jù)一致鸳粉。其中原子性要求多個(gè)節(jié)點(diǎn)的數(shù)據(jù)副本都是一致的扔涧,強(qiáng)調(diào)數(shù)據(jù)一致性。
原子性可以理解為一種“硬狀態(tài)”届谈,軟狀態(tài)則是允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)枯夜。并認(rèn)為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)存在多個(gè)不同節(jié)點(diǎn)的數(shù)據(jù)副本存在數(shù)據(jù)延遲艰山。
3) 最終一致性
數(shù)據(jù)不可能一直是軟狀態(tài)湖雹,必須在一個(gè)時(shí)間期限之后達(dá)到各個(gè)節(jié)點(diǎn)的一致性,在期限過(guò)后曙搬,應(yīng)當(dāng)保證所有的副本數(shù)據(jù)保持一致性摔吏,也就是達(dá)到數(shù)據(jù)的最終一致性鸽嫂。
在系統(tǒng)設(shè)計(jì)中,最終一致性實(shí)現(xiàn)的時(shí)間取決于網(wǎng)絡(luò)延時(shí)征讲,系統(tǒng)負(fù)載据某、不同的存儲(chǔ)選型、不同的數(shù)據(jù)復(fù)制方案設(shè)計(jì)等因素稳诚。
2. 不同數(shù)據(jù)一致性模型
一般來(lái)說(shuō)哗脖,數(shù)據(jù)一致性模型可以分為強(qiáng)一致性和弱一致性瀑踢,強(qiáng)一致性也叫做線性一致性扳还,除此之外,所有其他的一致性都是弱一致性的特殊情況橱夭。弱一致性根據(jù)不同的業(yè)務(wù)場(chǎng)景氨距,又可以分解為更細(xì)分的模型,不同一致性模型又有不同的應(yīng)用場(chǎng)景棘劣。
在互聯(lián)網(wǎng)領(lǐng)域的絕大多數(shù)場(chǎng)景中俏让,都需要犧牲強(qiáng)一致性來(lái)?yè)Q取系統(tǒng)的高可用性,系統(tǒng)往往值需要保證“最終一致性”茬暇,只要在這個(gè)最終時(shí)間是在用戶可以接受范圍內(nèi)即可首昔。
1) 強(qiáng)一致性
當(dāng)數(shù)據(jù)更新完成之后,任何多個(gè)后續(xù)進(jìn)程的訪問(wèn)都會(huì)返回最新的更新過(guò)的值糙俗,這種是對(duì)用戶最友好的勒奇,就是用戶上一次寫(xiě)什么,下一次就保證能讀到什么巧骚,根據(jù)CAP理論赊颠,這種實(shí)現(xiàn)需要犧牲可用性。
2)弱一致性
系統(tǒng)在數(shù)據(jù)寫(xiě)入成功之后劈彪,不承諾立即可以讀到最新寫(xiě)入的數(shù)據(jù)竣蹦,也不會(huì)具體的承諾多久可以讀到。用戶讀到某一操作對(duì)系統(tǒng)數(shù)據(jù)的更新需要一段時(shí)間沧奴,我們稱這段時(shí)間為“不一致性窗口”痘括。
3) 最終一致性
最終一致性是弱一致性的特例,強(qiáng)調(diào)的是所有的數(shù)據(jù)副本在經(jīng)過(guò)一段時(shí)間的同步之后滔吠,最終能夠達(dá)到一個(gè)一致的狀態(tài)纲菌。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致屠凶,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性驰后。
達(dá)到最終一致性的時(shí)間,就是不一致窗口時(shí)間矗愧,在沒(méi)有故障發(fā)生的前提下灶芝,不一致性窗口的時(shí)間主要受通信延遲郑原,系統(tǒng)負(fù)載和副本的個(gè)數(shù)影響。
最終一致性模型根據(jù)其提供的不同保證可以劃分為更多的模型夜涕,包括因果一致性和會(huì)話一致性等犯犁。
因果一致性
因果一致性要求有因果關(guān)系的操作順序得到保證,非因果關(guān)系的操作順序無(wú)所謂女器。
比如:在微博或者微信進(jìn)行評(píng)論的時(shí)候酸役,比如你在朋友圈發(fā)了一張照片,朋友給你評(píng)論了驾胆,而你對(duì)朋友的評(píng)論進(jìn)行了回復(fù)涣澡,這條朋友圈的顯示中,你的回復(fù)必須在朋友之后丧诺,這是一個(gè)因果關(guān)系入桂,而其他沒(méi)有因果關(guān)系的數(shù)據(jù),可以允許不一致驳阎。
會(huì)話一致性
會(huì)話一致性對(duì)系統(tǒng)數(shù)據(jù)的訪問(wèn)過(guò)程框定在了一個(gè)會(huì)話中抗愁,約定了系統(tǒng)能保證在同一個(gè)有效的會(huì)話中實(shí)現(xiàn)“讀己之所寫(xiě)”的一致性,就是在你的一次訪問(wèn)中呵晚,執(zhí)行更新操作之后蜘腌,客戶端能夠在同一會(huì)話中始終讀取到該數(shù)據(jù)項(xiàng)的最新值。
比如:分布式的Session 一致性問(wèn)題饵隙,可以認(rèn)為是會(huì)話一致性的一個(gè)應(yīng)用撮珠。
3. CAP及Base的關(guān)系
Base 理論是在CAP上發(fā)展的,CAP理論描述了分布式系統(tǒng)中數(shù)據(jù)一致性癞季、可用性劫瞳、分區(qū)容錯(cuò)性之間的制約關(guān)系,當(dāng)你選擇了其中的兩個(gè)時(shí)绷柒,就不得不對(duì)剩下的一個(gè)做一定程度的犧牲志于。
Base理論是對(duì)CAP理論的實(shí)際應(yīng)用,也就是在分區(qū)和副本存在的前提下废睦,通過(guò)一定的系統(tǒng)設(shè)計(jì)方案伺绽,放棄強(qiáng)一致性,實(shí)現(xiàn)基本可用嗜湃,這是絕大部分分布式系統(tǒng)的選擇奈应。比如NoSQL系統(tǒng)、為服務(wù)架構(gòu)购披。在這個(gè)前提下杖挣,如何把基本可用做到最好,就是分布式工程師追求的刚陡。
除了 CAP 和 Base惩妇,上面還提到了 ACID 原理株汉,ACID 是一種強(qiáng)一致性模型,強(qiáng)調(diào)原子性歌殃、一致性乔妈、隔離性和持久性,主要用于在數(shù)據(jù)庫(kù)實(shí)現(xiàn)中氓皱。Base 理論面向的是高可用路召、可擴(kuò)展的分布式系統(tǒng),ACID 適合傳統(tǒng)金融等業(yè)務(wù)波材,在實(shí)際場(chǎng)景中股淡,不同業(yè)務(wù)對(duì)數(shù)據(jù)的一致性要求不一樣,ACID 和 Base 理論往往會(huì)結(jié)合使用各聘。
4. 邏輯時(shí)鐘
分布式解決了傳統(tǒng)單體架構(gòu)的單點(diǎn)問(wèn)題和性能問(wèn)題揣非,另一方面也帶來(lái)了很多新的問(wèn)題,其中一個(gè)問(wèn)題就是多節(jié)點(diǎn)的時(shí)間同步問(wèn)題:不同機(jī)器上的物理時(shí)鐘難以同步躲因,導(dǎo)致無(wú)法區(qū)分在分布式中多個(gè)節(jié)點(diǎn)的事件時(shí)序。
比如:兩臺(tái)機(jī)同時(shí)發(fā)送消息忌傻,由于機(jī)器A上的時(shí)間要比機(jī)器B上的時(shí)間快大脉,即使機(jī)器B后發(fā)送消息,最終看到的還是A上發(fā)送的消息是最新的水孩,這樣就有可能導(dǎo)致問(wèn)題的出現(xiàn)镰矿。
于是就有人提出了邏輯時(shí)鐘的概念。
1) 什么是邏輯時(shí)鐘
邏輯時(shí)鐘是為了區(qū)分現(xiàn)實(shí)中的物理時(shí)鐘提出來(lái)的概念俘种,一般情況下我們提到的時(shí)間都是指物理時(shí)間秤标,但在實(shí)際很多應(yīng)用中,只要所有的機(jī)器有相同的時(shí)間就夠了宙刘,這個(gè)時(shí)間不一定要跟實(shí)際的時(shí)間相同苍姜。更進(jìn)一步,如果兩個(gè)節(jié)點(diǎn)之間不進(jìn)行交互悬包,那么它們的時(shí)間甚至都不需要同步衙猪。因此問(wèn)題的關(guān)鍵點(diǎn)在于節(jié)點(diǎn)間的交互要在事件的發(fā)生順序上達(dá)成一致,而不是對(duì)于時(shí)間達(dá)成一致布近。
2)可以對(duì)不同的節(jié)點(diǎn)的物理時(shí)鐘做同步么垫释?
方法是有的,NTP就是常用的時(shí)間同步算法撑瞧。比如
/usr/sbin/ntpdate 10.8.1.2 10.8.1.3 10.8.1.4
通過(guò)上面的命令可以同步三臺(tái)機(jī)的時(shí)間棵譬,但是這樣也不是完全沒(méi)有誤差,這種誤差在某些場(chǎng)景下(金融分布式事務(wù))是不能接受的预伺。
因此订咸,Lamport提出邏輯時(shí)鐘就是為了解決分布式系統(tǒng)中的時(shí)序問(wèn)題琅束,即如何定義a在b之前發(fā)生。值得注意的是算谈,并不是說(shuō)分布式系統(tǒng)只能用邏輯時(shí)鐘來(lái)解決這個(gè)問(wèn)題涩禀,如果以后有某種技術(shù)能夠讓不同節(jié)點(diǎn)的時(shí)鐘完全保持一致,那么使用物理時(shí)鐘來(lái)區(qū)分先后是一個(gè)更簡(jiǎn)單有效的方式然眼。
參考資料:不同數(shù)據(jù)一致性模型有哪些應(yīng)用艾船?
這里關(guān)于邏輯時(shí)鐘的原理就不詳細(xì)介紹了,后面會(huì)補(bǔ)充上高每。