成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式一致性方案有多難?看完這篇我驚出冷汗

云計算 分布式
分布式一致性方案確實很難,它涉及到網(wǎng)絡(luò)、節(jié)點故障、算法設(shè)計、性能優(yōu)化等多個方面,每一個環(huán)節(jié)都可能讓人頭疼不已。但它又是分布式系統(tǒng)的核心,是我們構(gòu)建高可靠、高可用分布式系統(tǒng)的基礎(chǔ)。

兄弟們,今天咱們來聊聊分布式系統(tǒng)里一個讓人又愛又恨的話題 —— 分布式一致性方案。為啥說又愛又恨呢?愛的是它是分布式系統(tǒng)的核心基石,恨的是它實在太難搞了,分分鐘讓人驚出冷汗。別著急,咱們慢慢嘮,盡量用大白話,帶點小幽默,讓大家舒舒服服地把這硬骨頭啃下來。

一、先搞懂啥是分布式一致性

咱先不著急上技術(shù),先打個比方。假設(shè)你和幾個好兄弟一起開了個小超市,每個人負責一個貨架,記錄商品的庫存。突然有一天,你們覺得單干不行,得搞個聯(lián)合庫存系統(tǒng),大家的庫存數(shù)據(jù)得保持一致,不然顧客來買東西,這邊說有貨,那邊說沒貨,那就鬧笑話了。這時候,你們就面臨著分布式一致性的問題 —— 多個節(jié)點(你們各自的貨架記錄)的數(shù)據(jù)要保持一致。

在分布式系統(tǒng)中,一致性指的是多個副本之間的數(shù)據(jù)是否一致。這里的副本可以是數(shù)據(jù)庫的副本、緩存的副本等等。分布式系統(tǒng)為啥會有一致性問題呢?因為它由多個節(jié)點組成,節(jié)點之間通過網(wǎng)絡(luò)通信,而網(wǎng)絡(luò)是不可靠的,可能會出現(xiàn)延遲、丟包,甚至節(jié)點故障等情況。這就好比你和兄弟之間打電話溝通庫存,電話可能會斷,信號可能不好,導(dǎo)致信息傳遞有誤。

二、一致性模型:不同的一致性要求

在分布式系統(tǒng)中,根據(jù)一致性的強弱,有幾種不同的一致性模型。

強一致性

強一致性是最嚴格的一致性模型,要求更新操作完成后,所有節(jié)點在同一時間看到的最新數(shù)據(jù)都是一致的。就像你和兄弟說,我剛剛把蘋果的庫存從 10 個改成 8 個,那不管誰去查,都得馬上看到 8 個,不能有的看到 10 個,有的看到 8 個。這種一致性很好理解,但實現(xiàn)起來最難,因為要處理各種網(wǎng)絡(luò)問題和節(jié)點故障,確保所有節(jié)點都收到更新并應(yīng)用。

弱一致性

弱一致性就比較寬松了,允許在更新操作后,不是所有節(jié)點都立即看到最新數(shù)據(jù),而是過一段時間后才會逐漸一致。比如你改了蘋果庫存,可能有的兄弟節(jié)點過一會兒才收到消息更新庫存。這種一致性實現(xiàn)起來簡單一些,但可能會出現(xiàn)數(shù)據(jù)不一致的情況,比如顧客在不同節(jié)點查詢到不同的庫存數(shù)據(jù)。

最終一致性

最終一致性是弱一致性的一種特殊情況,它保證在沒有新的更新操作的情況下,經(jīng)過一段時間后,所有節(jié)點的數(shù)據(jù)最終會達到一致。這是分布式系統(tǒng)中最常用的一致性模型,比如分布式緩存 Redis 的集群模式就采用了最終一致性。就像你和兄弟雖然一開始庫存數(shù)據(jù)不一樣,但隨著時間推移,通過各種同步機制,最終會變成一樣的。

三、分布式一致性方案大起底

接下來,咱們就來看看那些讓人又愛又恨的分布式一致性方案。

二階段提交(2PC):理想很豐滿,現(xiàn)實很骨感

二階段提交是分布式事務(wù)中常用的一致性方案,它把事務(wù)的提交過程分成兩個階段:準備階段和提交階段。

準備階段(投票階段)

協(xié)調(diào)者(可以看作是分布式系統(tǒng)中的一個中心節(jié)點)向所有參與者(其他節(jié)點)發(fā)送準備請求,詢問是否可以執(zhí)行事務(wù)提交操作。參與者收到請求后,會執(zhí)行事務(wù)的所有操作,但不會真正提交事務(wù),而是記錄日志,然后向協(xié)調(diào)者返回是否同意提交的響應(yīng)。比如在數(shù)據(jù)庫的分布式事務(wù)中,參與者會執(zhí)行數(shù)據(jù)庫的更新操作,但只是把數(shù)據(jù)寫入日志,不真正更新數(shù)據(jù)庫的數(shù)據(jù)。

這就好比公司要組織一次團建,領(lǐng)導(dǎo)(協(xié)調(diào)者)先問各個部門(參與者),下周六大家有沒有空參加團建呀?各個部門回去看看自己的工作安排,然后告訴領(lǐng)導(dǎo)能不能參加。

提交階段(執(zhí)行階段)

如果協(xié)調(diào)者收到所有參與者都同意提交的響應(yīng),那么就向所有參與者發(fā)送提交請求,參與者收到后就會真正提交事務(wù)。如果有任何一個參與者不同意提交,或者在規(guī)定時間內(nèi)沒有收到參與者的響應(yīng),協(xié)調(diào)者就會向所有參與者發(fā)送回滾請求,參與者回滾事務(wù)。

接著上面的例子,領(lǐng)導(dǎo)收到所有部門都說有空,那就通知大家下周六去團建;要是有一個部門說沒空,領(lǐng)導(dǎo)就只能取消團建,通知大家各忙各的。

看起來挺合理的吧?但在實際應(yīng)用中,二階段提交有很多問題。首先,它是同步阻塞的,在準備階段和提交階段,所有參與者都處于阻塞狀態(tài),不能處理其他事務(wù),這會影響系統(tǒng)的性能。其次,它對協(xié)調(diào)者的依賴很強,如果協(xié)調(diào)者在提交階段發(fā)生故障,比如發(fā)送提交請求到一半死機了,有的參與者收到了提交請求,有的沒收到,就會導(dǎo)致數(shù)據(jù)不一致。還有,網(wǎng)絡(luò)延遲和超時處理也很麻煩,比如參與者在準備階段同意提交,但在提交階段因為網(wǎng)絡(luò)問題沒收到提交請求,一直處于阻塞狀態(tài),不知道該提交還是回滾。

三階段提交(3PC):想彌補 2PC 的缺陷,卻還是有漏洞

三階段提交是為了改進二階段提交的缺陷而提出的,它把提交過程分成了三個階段:CanCommit、PreCommit 和 DoCommit。

CanCommit 階段

協(xié)調(diào)者向參與者發(fā)送一個詢問請求,詢問是否可以執(zhí)行事務(wù)。參與者只需要檢查自身的資源是否足夠,比如數(shù)據(jù)庫的連接、鎖等,而不需要執(zhí)行實際的事務(wù)操作。如果可以,就返回同意;否則返回不同意。這相當于領(lǐng)導(dǎo)先問大家,下周六理論上有沒有可能參加團建,不考慮具體的工作安排,只是看看時間上是否有沖突。

PreCommit 階段

如果 CanCommit 階段所有參與者都同意,協(xié)調(diào)者就會進入 PreCommit 階段,向參與者發(fā)送預(yù)提交請求,參與者執(zhí)行事務(wù)操作,但和 2PC 一樣,不真正提交,記錄日志,然后返回確認。如果有參與者不同意,或者協(xié)調(diào)者超時,就會進入中斷流程,發(fā)送中斷請求,參與者不執(zhí)行事務(wù)。

這一步和 2PC 的準備階段有點類似,但這里協(xié)調(diào)者在發(fā)送預(yù)提交請求之前,會先發(fā)送一個心跳包,檢查參與者的狀態(tài),避免 2PC 中協(xié)調(diào)者故障導(dǎo)致的問題。

DoCommit 階段

如果 PreCommit 階段所有參與者都確認,協(xié)調(diào)者就發(fā)送提交請求,參與者真正提交事務(wù);如果有問題,就發(fā)送回滾請求。

三階段提交相比二階段提交,減少了阻塞的時間,在 CanCommit 階段可以提前發(fā)現(xiàn)一些無法執(zhí)行事務(wù)的情況,避免后續(xù)的無用操作。而且引入了超時機制,當參與者超時沒收到協(xié)調(diào)者的請求時,會自動進行提交或回滾,一定程度上解決了協(xié)調(diào)者故障的問題。但它還是沒有完全解決分布式系統(tǒng)中的一致性問題,比如在 DoCommit 階段,協(xié)調(diào)者發(fā)送提交請求后故障,部分參與者收到了,部分沒收到,還是會導(dǎo)致數(shù)據(jù)不一致。而且實現(xiàn)起來比 2PC 更復(fù)雜,所以在實際應(yīng)用中也不是特別廣泛。

Paxos 算法:分布式一致性的經(jīng)典之作,卻難倒一片英雄漢

Paxos 算法是分布式一致性領(lǐng)域的經(jīng)典算法,由 Leslie Lamport 提出。它的目標是在一個可能發(fā)生消息丟失、重復(fù)、延遲的分布式系統(tǒng)中,確保多個進程對某個值達成一致。

基本概念

  • 提案(Proposal):包含一個提案編號和一個值,提案編號是唯一的,且單調(diào)遞增。
  • 提議者(Proposer):提出提案的節(jié)點,負責發(fā)起一致性過程。
  • 接受者(Acceptor):接收提案的節(jié)點,決定是否接受提案。
  • 學習者(Learner):只需要知道最終達成一致的值,不參與提案的過程。

算法過程

Paxos 算法的過程可以分為兩個階段:prepare 階段和 accept 階段。

prepare 階段

提議者選擇一個提案編號 n,向大多數(shù)接受者發(fā)送 prepare 請求。接受者收到 prepare 請求后,如果提案編號 n 大于之前收到的所有提案編號,就會返回自己之前接受過的提案中編號最大的那個提案的值(如果有的話),并承諾不再接受編號小于 n 的提案。

這就好比在一個會議上,大家要決定選哪個方案,第一個人(提議者)說我要提一個方案,編號是 1,然后問大部分人(接受者),你們之前有沒有接受過其他方案呀?如果沒有,或者我的編號比你們之前的都大,你們就告訴我你們之前的情況,并且以后別接受比我編號小的方案。

accept 階段

提議者收到大多數(shù)接受者的 prepare 響應(yīng)后,就可以確定一個值。如果有接受者在 prepare 響應(yīng)中返回了之前接受過的提案的值,提議者就把這個值作為當前提案的值;否則,提議者可以自己確定一個值。然后提議者向這些接受者發(fā)送 accept 請求,包含提案編號 n 和確定的值。接受者收到 accept 請求后,如果提案編號 n 不小于之前承諾的最小提案編號,就接受這個提案,并記錄下來。

當有一個提案被大多數(shù)接受者接受后,這個值就被選定了,所有學習者就可以學習這個值,達成一致。

Paxos 算法的正確性證明非常復(fù)雜,需要滿足一系列的條件,比如安全性和活性。安全性保證不會有錯誤的決定,活性保證最終會達成一致。但它的實現(xiàn)也很困難,因為要處理各種異常情況,比如提議者故障、接受者故障、網(wǎng)絡(luò)分區(qū)等。而且 Paxos 算法的描述比較抽象,很多人第一次看都覺得云里霧里,這也是它難倒眾多開發(fā)者的原因。不過,基于 Paxos 算法衍生出了很多實用的方案,比如 Raft 算法。

Raft 算法:更易理解和實現(xiàn)的分布式一致性算法

Raft 算法是為了讓分布式一致性算法更易理解和實現(xiàn)而設(shè)計的,它把分布式系統(tǒng)中的節(jié)點狀態(tài)分為三種:領(lǐng)導(dǎo)者(Leader)、跟隨者(Follower)和候選人(Candidate)。

領(lǐng)導(dǎo)者選舉

Raft 算法中,首先需要選舉出一個領(lǐng)導(dǎo)者,領(lǐng)導(dǎo)者負責處理客戶端的請求,管理日志的復(fù)制,保證數(shù)據(jù)的一致性。當跟隨者在一段時間內(nèi)沒有收到領(lǐng)導(dǎo)者的心跳包(心跳包用于維持領(lǐng)導(dǎo)者的地位),就會認為領(lǐng)導(dǎo)者故障,進入候選人狀態(tài),發(fā)起選舉。候選人向其他節(jié)點發(fā)送請求投票,當獲得大多數(shù)節(jié)點的投票后,就成為新的領(lǐng)導(dǎo)者。

這就像一個班級選班長,一開始有一個班長(領(lǐng)導(dǎo)者),如果同學們(跟隨者)很久沒收到班長的消息,就覺得班長可能不干了,然后有人(候選人)站出來說我來當班長,大家投票,得票最多的就成為新班長。

日志復(fù)制

客戶端的寫請求由領(lǐng)導(dǎo)者處理,領(lǐng)導(dǎo)者收到請求后,會將請求作為日志條目添加到自己的日志中,然后發(fā)送給所有跟隨者。跟隨者收到日志條目后,會將其寫入自己的日志,并返回確認。當領(lǐng)導(dǎo)者收到大多數(shù)跟隨者的確認后,就會提交該日志條目,并通知跟隨者提交,這樣所有節(jié)點的數(shù)據(jù)就保持一致了。

對于讀請求,通??梢灾苯佑深I(lǐng)導(dǎo)者處理,或者如果跟隨者保存了最新的數(shù)據(jù),也可以處理讀請求,但需要確保跟隨者的數(shù)據(jù)是最新的,這可以通過領(lǐng)導(dǎo)者的心跳包來保證。

Raft 算法相比 Paxos 算法,更容易理解和實現(xiàn),因為它把問題分解成了領(lǐng)導(dǎo)者選舉、日志復(fù)制等幾個相對獨立的部分,每個部分都有明確的狀態(tài)和流程。而且它的安全性和活性也有很好的保證,在實際應(yīng)用中被廣泛采用,比如分布式存儲系統(tǒng) etcd 就采用了 Raft 算法。

其他一致性方案

除了上面提到的這些方案,還有一些其他的一致性方案,比如 ZAB 協(xié)議(ZooKeeper 原子廣播協(xié)議),它和 Raft 算法類似,也是通過領(lǐng)導(dǎo)者選舉和日志復(fù)制來保證一致性,主要用于 ZooKeeper 分布式協(xié)調(diào)服務(wù)中。還有基于時間戳的向量時鐘算法,用于解決分布式系統(tǒng)中的因果一致性問題,通過給每個操作分配一個時間戳向量,來判斷操作之間的因果關(guān)系,從而保證一致性。

四、分布式一致性方案的難點在哪里

說了這么多方案,咱們來總結(jié)一下分布式一致性方案的難點到底有哪些。

網(wǎng)絡(luò)的不可靠性

這是分布式系統(tǒng)面臨的最根本問題之一。網(wǎng)絡(luò)可能會出現(xiàn)延遲、丟包、分區(qū)等情況,導(dǎo)致節(jié)點之間的通信失敗。比如在二階段提交中,協(xié)調(diào)者發(fā)送的提交請求可能因為網(wǎng)絡(luò)分區(qū),只有部分參與者收到,導(dǎo)致數(shù)據(jù)不一致。在 Paxos 和 Raft 算法中,都需要處理網(wǎng)絡(luò)分區(qū)的情況,確保在網(wǎng)絡(luò)恢復(fù)后,系統(tǒng)能重新達成一致。

節(jié)點的故障

節(jié)點可能會因為硬件故障、軟件崩潰等原因而失效。當領(lǐng)導(dǎo)者節(jié)點故障時,需要快速選舉出新的領(lǐng)導(dǎo)者,并且保證日志的一致性。在 Raft 算法中,領(lǐng)導(dǎo)者選舉的時間和日志復(fù)制的機制都需要考慮節(jié)點故障的情況,確保系統(tǒng)的可用性和一致性。

一致性和可用性的權(quán)衡

在分布式系統(tǒng)中,有一個著名的 CAP 定理,它指出一個分布式系統(tǒng)不可能同時滿足一致性(Consistency)、可用性(Availability)和分區(qū)容錯性(Partition Tolerance)這三個特性,最多只能同時滿足兩個。這就意味著我們在設(shè)計分布式一致性方案時,需要根據(jù)實際需求,在一致性和可用性之間做出權(quán)衡。比如在金融系統(tǒng)中,可能更注重一致性,而在一些高可用性的系統(tǒng)中,可能會選擇最終一致性,犧牲一定的強一致性來保證系統(tǒng)的可用性。

實現(xiàn)的復(fù)雜性

從上面介紹的各種方案可以看出,分布式一致性方案的實現(xiàn)都非常復(fù)雜,需要處理各種異常情況,保證算法的正確性和效率。比如 Paxos 算法的正確性證明需要嚴格的數(shù)學推導(dǎo),Raft 算法雖然更易理解,但實現(xiàn)起來也需要處理領(lǐng)導(dǎo)者選舉、日志復(fù)制、節(jié)點故障恢復(fù)等多個模塊,每個模塊都可能出現(xiàn)問題,需要仔細調(diào)試和測試。

五、如何選擇合適的分布式一致性方案

說了這么多難點,那我們在實際項目中該如何選擇合適的分布式一致性方案呢?

明確業(yè)務(wù)需求

首先要明確業(yè)務(wù)對一致性的要求。如果是金融交易、訂單支付等場景,要求強一致性,那就需要選擇像二階段提交、Paxos 算法、Raft 算法等能夠保證強一致性的方案,但也要考慮系統(tǒng)的性能和可用性。如果是一些對一致性要求不高的場景,比如用戶行為日志記錄、緩存數(shù)據(jù)同步等,可以選擇最終一致性的方案,比如分布式緩存的異步同步機制。

考慮系統(tǒng)的規(guī)模和復(fù)雜度

如果是小規(guī)模的分布式系統(tǒng),節(jié)點數(shù)量較少,業(yè)務(wù)邏輯簡單,可以選擇實現(xiàn)相對簡單的方案,比如 Raft 算法,或者一些基于開源框架的解決方案,比如 etcd 提供的 Raft 實現(xiàn),減少自己開發(fā)的難度和風險。如果是大規(guī)模的分布式系統(tǒng),節(jié)點數(shù)量眾多,業(yè)務(wù)復(fù)雜,可能需要結(jié)合多種方案,比如在分布式事務(wù)中使用二階段提交,在分布式存儲中使用 Paxos 或 Raft 算法,同時還要考慮系統(tǒng)的擴展性和容錯性。

參考開源項目和最佳實踐

開源項目是我們學習和借鑒的寶貴資源。比如 ZooKeeper 使用 ZAB 協(xié)議,etcd 使用 Raft 算法,Redis 的集群模式采用最終一致性,我們可以研究這些開源項目的實現(xiàn),了解它們在不同場景下的應(yīng)用和優(yōu)化策略。同時,行業(yè)內(nèi)的最佳實踐也很重要,比如在微服務(wù)架構(gòu)中,如何保證多個服務(wù)之間的數(shù)據(jù)一致性,通常會采用分布式事務(wù)、最終一致性等方案,結(jié)合業(yè)務(wù)的特點進行選擇。

六、總結(jié):分布式一致性,難,但值得挑戰(zhàn)

分布式一致性方案確實很難,它涉及到網(wǎng)絡(luò)、節(jié)點故障、算法設(shè)計、性能優(yōu)化等多個方面,每一個環(huán)節(jié)都可能讓人頭疼不已。但它又是分布式系統(tǒng)的核心,是我們構(gòu)建高可靠、高可用分布式系統(tǒng)的基礎(chǔ)。

從二階段提交到三階段提交,從 Paxos 算法到 Raft 算法,每一個方案的出現(xiàn)都是為了解決之前方案的不足,都是無數(shù)開發(fā)者智慧的結(jié)晶。雖然實現(xiàn)起來復(fù)雜,但隨著技術(shù)的發(fā)展,越來越多的開源框架和工具提供了成熟的一致性解決方案,讓我們在實際項目中可以站在巨人的肩膀上,不用從頭開始造輪子。

作為 Java 開發(fā)者,我們需要了解這些分布式一致性方案的原理和適用場景,根據(jù)業(yè)務(wù)需求做出合適的選擇。同時,也要不斷學習和研究新的技術(shù),迎接分布式系統(tǒng)帶來的挑戰(zhàn)。也許現(xiàn)在覺得難,但只要慢慢啃,總有一天會豁然開朗。

責任編輯:武曉燕 來源: 石杉的架構(gòu)筆記
相關(guān)推薦

2019-10-11 23:27:19

分布式一致性算法開發(fā)

2017-09-22 12:08:01

數(shù)據(jù)庫分布式系統(tǒng)互聯(lián)網(wǎng)

2021-06-06 12:45:41

分布式CAPBASE

2019-09-05 08:43:34

微服務(wù)分布式一致性數(shù)據(jù)共享

2021-11-22 16:30:30

分布式一致性分布式系統(tǒng)

2021-06-16 08:33:02

分布式事務(wù)ACID

2021-07-28 08:39:25

分布式架構(gòu)系統(tǒng)

2022-06-07 12:08:10

Paxos算法

2021-06-03 15:27:31

RaftSOFAJRaft

2017-09-21 10:59:36

分布式系統(tǒng)線性一致性測試

2024-11-28 10:56:55

2018-07-05 09:41:08

一致性哈希算法

2024-06-04 10:58:30

2025-03-27 03:00:00

2015-10-19 10:42:37

分布式一致性應(yīng)用系統(tǒng)

2023-11-06 09:06:54

分布式一致性數(shù)據(jù)

2020-10-28 11:15:24

EPaxos分布式性算法

2018-03-19 09:50:50

分布式存儲系統(tǒng)

2021-08-13 11:50:23

AnalyticDB 分布式數(shù)據(jù)庫

2025-03-14 08:00:00

分布式系統(tǒng)服務(wù)器一致性
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 岛国毛片在线观看 | 日本精品一区二区三区视频 | 超碰在线97国产 | 国产免费麻豆视频 | 精品视频一区二区在线观看 | 欧美久久久久久久久中文字幕 | 中文字幕在线免费观看 | 国产在线网址 | 97伦理影院 | 日韩精品极品视频在线观看免费 | 操操操av | 亚洲免费一区二区 | 在线看国产 | 99精品欧美 | 99热这里都是精品 | 亚洲成人日韩 | a免费视频| aaa级片| 久久久女女女女999久久 | 久久新 | 国产成在线观看免费视频 | 国产精品成人一区二区 | 国产欧美日韩在线一区 | 日韩欧美在线观看视频 | 亚洲国产精品视频一区 | 丁香五月网久久综合 | 日韩中文字幕在线观看 | 国产婷婷色综合av蜜臀av | 99热在这里只有精品 | 91久久精品国产91久久 | 久久91精品 | 欧美精品在线一区 | 精品一区电影 | 91.com视频 | 国产丝袜av | 超碰在线97国产 | 亚洲三区视频 | 福利社午夜影院 | 午夜精品久久久久久久久久久久久 | 一a一片一级一片啪啪 | 99精品在线观看 |