成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于分布式系統(tǒng)的思考(二)

cuieney / 2743人閱讀

摘要:收到所有參與者回應(yīng)后,完成事務(wù)。不管是還是,都是通過(guò)節(jié)點(diǎn)間的交換消息去達(dá)到一致的狀態(tài),這也是分布式系統(tǒng)的常用做法。從業(yè)期間,負(fù)責(zé)過(guò)訂閱系統(tǒng)制作云服務(wù)開(kāi)源平臺(tái)分布式任務(wù)調(diào)度系統(tǒng)等產(chǎn)品的設(shè)計(jì)研發(fā)工作。

接著上一篇的內(nèi)容,詳細(xì)介紹一些主流數(shù)據(jù)庫(kù)在分布式場(chǎng)景下用到的算法和思想,主要提及數(shù)據(jù)一致性相關(guān)的一些策略,并分析其利弊和典型應(yīng)用場(chǎng)景。

對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),可能關(guān)心的最多的就是數(shù)據(jù)的一致性了,由此衍生出了不同場(chǎng)景下的算法和策略。
在上一篇末尾提及了兩種集群結(jié)構(gòu):中心化去中心化。

中心化

一種是中心化的,由中心節(jié)點(diǎn)去存儲(chǔ)集群信息并管理集群狀態(tài),其它節(jié)點(diǎn)只需響應(yīng)數(shù)據(jù)請(qǐng)求,而無(wú)需知道集群中其它節(jié)點(diǎn)的情況。
這種模式的核心便是選舉或者指定一個(gè)節(jié)點(diǎn)作為集群的管理者,由管理者去協(xié)調(diào)跨節(jié)點(diǎn)的操作、備份數(shù)據(jù)和處理故障等。

一般的,對(duì)于跨節(jié)點(diǎn)的操作,為了保證事務(wù)的原子性,提出了兩步提交協(xié)議或三步提交協(xié)議,下面分別介紹。

2pc

兩步提交協(xié)議,顧名思義,就是將數(shù)據(jù)的提交分為兩步:投票和決策。

首先,在第一階段,

中心節(jié)點(diǎn)(在這里我們稱之為協(xié)調(diào)者)發(fā)起事務(wù)操作請(qǐng)求,包含事務(wù)內(nèi)容,詢問(wèn)是否可以執(zhí)行提交操作并等待響應(yīng);

其它節(jié)點(diǎn)(在這里稱之為參與者)執(zhí)行事務(wù)操作并記錄undo/redo log,最后返回是否同意提交。

然后,在第二階段,協(xié)調(diào)者根據(jù)所有參與者的投票結(jié)果,如果是都同意則通知所有參與者提交事務(wù),否則回滾事務(wù)。
收到所有參與者回應(yīng)后,完成事務(wù)。

接著,我們考慮下兩步提交過(guò)程中如果發(fā)生異常,會(huì)出現(xiàn)什么樣的情況,會(huì)不會(huì)影響結(jié)果的一致性,并嘗試解決。

在第一階段時(shí),有節(jié)點(diǎn)宕機(jī)

有參與者宕機(jī),此時(shí)協(xié)調(diào)者接收到錯(cuò)誤響應(yīng),可認(rèn)為是失敗,將中斷事務(wù)。

協(xié)調(diào)者宕機(jī),此時(shí)參與者等待協(xié)調(diào)者的操作通知,事務(wù)會(huì)阻塞直到協(xié)調(diào)者恢復(fù)。
對(duì)于此種情況,解決的辦法是可以設(shè)置多個(gè)協(xié)調(diào)者,一主多從,宕機(jī)后指定一臺(tái)從作為新的主。

參與者也需要記錄事務(wù)的投票狀態(tài),以便新的協(xié)調(diào)者重新找回事務(wù)狀態(tài)。

參與者和協(xié)調(diào)者都宕機(jī)了,如上一條,新的協(xié)調(diào)者將會(huì)獲取不到參與者的事務(wù)狀態(tài)(該參與者的狀態(tài)只有自己和原協(xié)調(diào)者知道),會(huì)一直阻塞地等待所有參與者恢復(fù)。
其它參與者也會(huì)處于兩階段之間,直到宕機(jī)的參與者恢復(fù)。

在第二階段,有節(jié)點(diǎn)宕機(jī)

有參與者宕機(jī),此時(shí)未宕機(jī)的參與者會(huì)正常地提交/回滾事務(wù),而由于并不知道宕機(jī)的時(shí)機(jī),所以可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。

協(xié)調(diào)者宕機(jī),若是在發(fā)送通知前,那么參與者將阻塞地等待協(xié)調(diào)者恢復(fù)??赏ㄟ^(guò)設(shè)置協(xié)調(diào)者的備份來(lái)解決,要求參與者記錄事務(wù)狀態(tài)。若是在發(fā)送通知后,不影響可忽略。

參與者與協(xié)調(diào)者都宕機(jī)了,如上兩條,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致或阻塞。

注意,以上的宕機(jī)如果替換為網(wǎng)絡(luò)分區(qū),也會(huì)是同樣的情況。

可以看出,2pc的優(yōu)點(diǎn)是簡(jiǎn)單直接,缺點(diǎn)是:

當(dāng)有故障發(fā)生會(huì)阻塞事務(wù)的執(zhí)行,進(jìn)而影響到相關(guān)資源的釋放;

協(xié)調(diào)者的單點(diǎn)問(wèn)題;

當(dāng)二階段有參與者宕機(jī)或者網(wǎng)絡(luò)分區(qū)時(shí),可能會(huì)導(dǎo)致數(shù)據(jù)不一致。

針對(duì)這些缺陷,出現(xiàn)了3pc。

3pc

三步提交協(xié)議,改進(jìn)了2pc的一些缺陷,它增加了一個(gè)詢問(wèn)是否可提交階段。如圖所示:

第一階段時(shí),協(xié)調(diào)者詢問(wèn)各參與者是否可以執(zhí)行事務(wù)提交,包含事務(wù)內(nèi)容,并等待參與者的響應(yīng)。
參與者收到請(qǐng)求后,如果認(rèn)為可以成功執(zhí)行事務(wù),則返回同意,否則中止事務(wù)。

第二階段時(shí),協(xié)調(diào)者根據(jù)第一階段參與者的返回消息,決定是準(zhǔn)備提交或是中止事務(wù)。如果都是同意,那么發(fā)送預(yù)提交請(qǐng)求。
參與者收到請(qǐng)求后,會(huì)執(zhí)行事務(wù)操作,并記錄undo/redo log, 最后返回提交/中止事務(wù)。

第三階段時(shí),協(xié)調(diào)者根據(jù)第二階段的響應(yīng),決定通知參與者提交/回滾事務(wù),收到響應(yīng)后完成事務(wù)。

3pc相比于2pc的優(yōu)點(diǎn)在于:

在協(xié)調(diào)者和參與者端都添加了超時(shí)機(jī)制,其中:參與者超時(shí)未應(yīng)答均認(rèn)為是失??;協(xié)調(diào)者在第二階段超時(shí)未發(fā)送請(qǐng)求視為失敗,而第三階段超時(shí)未發(fā)送請(qǐng)求視為成功,參與者在經(jīng)過(guò)了指定超時(shí)時(shí)間后提交事務(wù)。這樣便具備了一定的容錯(cuò)性。
不僅如此,這樣還可以有效減少阻塞時(shí)間。

提供了協(xié)調(diào)者的主備方案,避免了單點(diǎn)問(wèn)題。

缺點(diǎn):

第二階段時(shí),參與者在接收到預(yù)提交請(qǐng)求后發(fā)生網(wǎng)絡(luò)分區(qū),此參與者在超時(shí)后提交事務(wù),而協(xié)調(diào)者在超時(shí)后認(rèn)為事務(wù)失敗并通知其它參與者回滾事務(wù),最終導(dǎo)致數(shù)據(jù)不一致。若發(fā)生此情況,只能通過(guò)上層去協(xié)調(diào)解決這個(gè)問(wèn)題,如上一篇提到的兩種解決方案。(2pc也有類似缺陷)

比2pc多了一個(gè)階段,意味著同等情況下,耗時(shí)要多一點(diǎn)。

去中心化

另一種則是去中心化的,由節(jié)點(diǎn)之間互相通信去協(xié)商一致。比較有名的算法如Paxos。

Paxos算法在分布式領(lǐng)域具有非常重要的地位,Google Chubby的作者M(jìn)ike Burrows曾經(jīng)說(shuō)過(guò),這個(gè)世界上只有一種一致性算法,那就是Paxos,其它的都是殘次品。

不過(guò)這個(gè)算法實(shí)在是難理解,難實(shí)現(xiàn);以后有機(jī)會(huì)我會(huì)專門總結(jié)一篇文章分享下,有興趣的道友可以先去看看《Paxos Made Simple》,寫得很不錯(cuò)。

此外,考慮到集群中的節(jié)點(diǎn)數(shù)量并不是一成不變的,所以如果使用的是一般的Hash算法,那么在集群新增節(jié)點(diǎn)或刪除節(jié)點(diǎn)時(shí),會(huì)導(dǎo)致節(jié)點(diǎn)間大量數(shù)據(jù)的遷移,進(jìn)而影響可用性,故而提出了一致性Hash算法以減少數(shù)據(jù)的遷移量。

一致性Hash

一般的Hash算法,如對(duì)key取模然后分散到不同的節(jié)點(diǎn)中:假設(shè)有3個(gè)節(jié)點(diǎn),共有key分別為1~7的數(shù)據(jù),分配結(jié)果如下圖

現(xiàn)在,如果新增一個(gè)節(jié)點(diǎn),那么分配結(jié)果變?yōu)椋?

可以發(fā)現(xiàn)大部分的節(jié)點(diǎn)都被重新分配到了不同的節(jié)點(diǎn)上,即遷移數(shù)據(jù)是O(n)復(fù)雜度(n為數(shù)據(jù)總量),無(wú)法平滑地?cái)U(kuò)縮容。
接下來(lái)再來(lái)看下一致性Hash,它的分配方式是對(duì)key和節(jié)點(diǎn)做相同的Hash運(yùn)算,然后將key分配到剛好大于或等于它Hash值的節(jié)點(diǎn)上(若節(jié)點(diǎn)都比它Hash值小,則分配到最小的節(jié)點(diǎn)上,即形成一個(gè)“環(huán)”);

還是上面的那個(gè)例子,對(duì)key和節(jié)點(diǎn)都做對(duì)7取模的Hash計(jì)算,然后分配。先是有三個(gè)節(jié)點(diǎn):

新增一個(gè)節(jié)點(diǎn):

可以看出,增加一個(gè)節(jié)點(diǎn)后只有少量數(shù)據(jù)從5節(jié)點(diǎn)移動(dòng)到4節(jié)點(diǎn),極大的減少了數(shù)據(jù)遷移量。
但是,一致性Hash也有缺陷:查找效率低。一般需要逐個(gè)去比較Hash值直到找到剛好大于等于的節(jié)點(diǎn),故查找復(fù)雜度為O(k)(k為節(jié)點(diǎn)數(shù)量)。
可以通過(guò)在節(jié)點(diǎn)中冗余一份節(jié)點(diǎn)表來(lái)加快查找。

總結(jié)

保證一致性,要么是通過(guò)共享存儲(chǔ),要么是通過(guò)消息協(xié)調(diào)。
數(shù)據(jù)庫(kù)本身就是共享存儲(chǔ)。
不管是2pc、3pc還是paxos,都是通過(guò)節(jié)點(diǎn)間的交換消息去達(dá)到一致的狀態(tài),這也是分布式系統(tǒng)的常用做法。
了解了這些策略的原理后,不管是用Zookeeper、RabbitMQ、Redis或其它消息組件(甚至是基于socket通信)去實(shí)現(xiàn)它,都是水到渠成的事情了。

超時(shí)是個(gè)好設(shè)計(jì),因?yàn)樗遣恍柙儐?wèn)便可以察覺(jué)錯(cuò)誤的方式(畢竟沒(méi)有錯(cuò)誤就不會(huì)超時(shí)了),很多設(shè)計(jì)中都會(huì)將超時(shí)作為一種信號(hào),并嘗試容錯(cuò)/修復(fù)等操作。

在運(yùn)行過(guò)程的一些錯(cuò)誤并不能通過(guò)底層的策略完全規(guī)避,需要根據(jù)具體業(yè)務(wù)在上層做相應(yīng)的容錯(cuò)措施。

冗余是個(gè)好設(shè)計(jì),幾乎在各種組件的設(shè)計(jì)都能見(jiàn)到,通過(guò)犧牲一點(diǎn)空間較大地提高檢索效率。

有機(jī)會(huì)的話,之后的篇章我會(huì)收集并比較幾種典型分布式組件的具體實(shí)現(xiàn),對(duì)這些組件有個(gè)更加直觀和深入的理解,以便充實(shí)和改進(jìn)自己的知識(shí)結(jié)構(gòu)并分享出來(lái)。

最后為方便查詢,整理了下往期文章到github中:https://github.com/dengyuankai272/blog


作者信息
本文系力譜宿云LeapCloud旗下MaxLeap團(tuán)隊(duì)_基礎(chǔ)服務(wù)組成員:呂舜 【原創(chuàng)】
力譜宿云LeapCloud 首發(fā):https://blog.maxleap.cn/archi...
呂舜,主攻Java,對(duì)Python、數(shù)據(jù)分析也有關(guān)注。從業(yè)期間,負(fù)責(zé)過(guò)訂閱系統(tǒng)、App制作云服務(wù)、開(kāi)源BaaS平臺(tái)、分布式任務(wù)調(diào)度系統(tǒng)等產(chǎn)品的設(shè)計(jì)研發(fā)工作?,F(xiàn)任MaxLeap基礎(chǔ)服務(wù)與架構(gòu)成員,負(fù)責(zé)云服務(wù)系統(tǒng)相關(guān)的設(shè)計(jì)與開(kāi)發(fā)。

相關(guān)文章
微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(一)
微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(二)
移動(dòng)云平臺(tái)的基礎(chǔ)架構(gòu)之旅(一):云應(yīng)用
從應(yīng)用到平臺(tái) – 云服務(wù)架構(gòu)的演進(jìn)過(guò)程

作者往期佳作
RabbitMQ在分布式系統(tǒng)的應(yīng)用
關(guān)于分布式系統(tǒng)的思考

歡迎掃以下二維碼,關(guān)注我們的微信訂閱號(hào):

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25189.html

相關(guān)文章

  • 關(guān)于布式系統(tǒng)思考

    摘要:收到所有參與者回應(yīng)后,完成事務(wù)。不管是還是,都是通過(guò)節(jié)點(diǎn)間的交換消息去達(dá)到一致的狀態(tài),這也是分布式系統(tǒng)的常用做法。從業(yè)期間,負(fù)責(zé)過(guò)訂閱系統(tǒng)制作云服務(wù)開(kāi)源平臺(tái)分布式任務(wù)調(diào)度系統(tǒng)等產(chǎn)品的設(shè)計(jì)研發(fā)工作。 接著上一篇的內(nèi)容,詳細(xì)介紹一些主流數(shù)據(jù)庫(kù)在分布式場(chǎng)景下用到的算法和思想,主要提及數(shù)據(jù)一致性相關(guān)的一些策略,并分析其利弊和典型應(yīng)用場(chǎng)景。 對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),可能關(guān)心的最多的就是數(shù)據(jù)的一致性了,由...

    fxp 評(píng)論0 收藏0
  • 關(guān)于公司架構(gòu)管控思考

    摘要:由此提出架構(gòu)審批流程不代表架構(gòu)設(shè)計(jì)架構(gòu)規(guī)劃部門要加強(qiáng)架構(gòu)管控。開(kāi)發(fā)團(tuán)隊(duì)對(duì)科技公共平臺(tái)的不熟悉強(qiáng)制使用業(yè)務(wù)數(shù)據(jù)模型混亂新需求控制創(chuàng)新三形成架構(gòu)管控目標(biāo)控制新增外購(gòu)系統(tǒng)的架構(gòu)方案的合理性梳理既存外購(gòu)系統(tǒng)的架構(gòu)提升開(kāi)發(fā)效率。 假想背景:現(xiàn)狀是,各子系統(tǒng)的新建及重大迭代都會(huì)形式化地走架構(gòu)審批流程,但應(yīng)用架構(gòu)是否設(shè)計(jì)以及是否合理,信息技術(shù)部門不能掌握。而架構(gòu)規(guī)劃部門的架構(gòu)師人屈指可數(shù),面對(duì)總?cè)藬?shù)...

    didikee 評(píng)論0 收藏0
  • 大型布式網(wǎng)站思考(一):大型網(wǎng)站發(fā)展歷程

    摘要:使用反向代理和加速網(wǎng)站響應(yīng)在性能權(quán)威指南中有講到,網(wǎng)站性能的瓶頸,大部分時(shí)間都浪費(fèi)在的握手和傳輸上。因此可以通過(guò)和反向代理的方式來(lái)加快響應(yīng)。分布式數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)拆分的最后手段,只用在單表數(shù)據(jù)規(guī)模特別龐大的時(shí)候才使用。 前幾天跟一個(gè)朋友聊了一些關(guān)于網(wǎng)站緩存分布式的一些東西,發(fā)現(xiàn)自己的知識(shí)還是太過(guò)貧瘠。理論+協(xié)議,這是現(xiàn)在我亟待加強(qiáng)的。這個(gè)周末買了兩本關(guān)于分布式網(wǎng)站的書(shū),本著好記性不如爛筆...

    NikoManiac 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<