什么是顺序一致性呢?
在講順序一致性之前,咱們思考一個問題,假如說zookeeper是一個最終一致性模型,那么他會發生什么情況?
ClientA/B/C假設只串行執行,?clientA更新zookeeper上的一個值x。ClientB和clientC分別讀取集群的不同副本,返回的x的值是不一樣的。clientC的讀取操作是發生在clientB之后,但是卻讀到了過期的值。很明顯,這是一種弱一致模型。如果用它來實現鎖機制是有問題的。
順序一致性提供了更強的一致性保證,我們來觀察下面這個圖,從時間軸來看,B0發生在A0之前,讀取的值是0,B2發生在A0之后,讀取到的x的值為1.而讀操作B1/C0/C1和寫操作A0在時間軸上有重疊,因此他們可能讀到舊的值為0,也可能讀到新的值1.?但是在強順序一致性模型,
如果B1得到的x的值為1,那么C1看到的值也一定是1.?
需要注意的是:由于網絡的延遲以及系統本身執行請求的不確定性,會導致請求發起的早的客戶端不一定會在服務端執行得早。最終以服務端執行的結果為準。
簡單來說:順序一致性是針對單個操作,單個數據對象。屬于CAP中C這個范疇。一個數據被更新后,能夠立馬被后續的讀操作讀到。
但是zookeeper的順序一致性實現是縮水版的,在下面這個網頁中,可以看到官網對于一致性這塊做了解釋?http://zookeeper.apache.org/doc/r3.5.5/zookeeperProgrammers.html#ch_zkGuarantees?zookeeper不保證在每個實例中,兩個不同的客戶端具有相同的zookeeper數據視圖,由于網絡延遲等因素,一個客戶端可能會在另外一個客戶端收到更改通知之前執行更新,考慮到2個客戶端A和B的場景,如果A把znode?/a的值從0設置為1,然后告訴客戶端B讀取?/a,?則客戶端B可能會讀取到舊的值0,具體取決于他連接到那個服務器,如果客戶端A和B要讀取必須要讀取到相同的值,那么client?B在讀取操作之前執行sync方法。
除此之外,zookeeper基于zxid以及阻塞隊列的方式來實現請求的順序一致性。如果一個client連接到一個最新的follower上,那么它read讀取到了最新的數據,然后client由于網絡原因重新連接到zookeeper節點,而這個時候連接到一個還沒有完成數據同步的follower節點,那么這一次讀到的數據不久是舊的數據嗎?實際上zookeeper處理了這種情況,client會記錄自己已經讀取到的最大的zxid,如果client重連到server發現client的zxid比自己大。連接會失敗
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的什么是顺序一致性呢?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper的一致性是什么情况?
- 下一篇: Single System Image的