1. 程式人生 > >一致性hash理解、拜占庭將軍問題解讀和CAP理論總結

一致性hash理解、拜占庭將軍問題解讀和CAP理論總結

一致性hash理解

  1. 白話概述:
    • 比如說儲存圖片,有10臺伺服器用來儲存,對圖片名進行hash(pic_name)%10得到的值就是圖片存放的伺服器序號。這是正常的hash演算法分散圖片儲存。但是有一天,你覺得伺服器不夠了,需要加幾臺機器擴容儲存。這時候,假設加了10臺,變成20臺,那麼原先譬如11%10=1現在11%20=11,則存取圖片會跑到11號伺服器,如果仍舊用原來的演算法,那所有圖片幾乎都要重新移動位置,這明顯非常消耗效能。
    • 一致性hash就是為了解決這一問題,它建立了hash環的概念,2^32個點,圍城一個環,表示從0-2^32-1的數,比如3臺伺服器,根據ip地址hash後%2^32餘數就是hash環上的位置A,B,C,假設按從小到大順時針排序,儲存圖片的時候同樣算出圖片位置,如果在A,B之間,按順時針則放在B,在B,C之間順時針放C,CA之間,順時針放A,理想情況下,A,B,C均勻排列則圖片均勻分佈在ABC三臺伺服器上。這時候,若多加了臺伺服器D,算出位置為 CA之間那麼,落在CD之間的圖片存在D,落在DA之間的圖片依舊存在A,這臺伺服器D只是負擔了一部分資源儲存,減少了A的負擔,並不會影響其他伺服器
    • 當然以上演算法都是理想狀態,實際情況可能A,B,C都擠在一起,靠的比較近,使大部分資源都落到一個伺服器上,為了解決這一問題,它引入了虛擬節點,也就是說,A可以建立多個A1,A2...節點分散在整個hash環,存入的圖片位置,順時針若落入A1,則代表它粗怒A伺服器,虛擬節點越多,分佈也就越均勻

詳細參考 http://www.zsythink.net/archives/1182

拜占庭將軍問題

  1. 問題白話概述:10支軍隊攻城,必須至少5支以上一起攻擊才能成功,10支軍隊通過通訊兵互相傳遞訊息決定要不要進攻和進攻時間。但是需要考慮通訊兵中可能存在間諜會改變攻擊時間和意圖。所以問題歸結就是將軍能否找到一種分散式協議能夠讓他們遠端協調10支軍隊有效進攻。(前提假設通訊不會被中斷,訊息傳遞可靠性有保障)
  2. 兩軍問題:A軍隊分為A1和A2分隔兩地,只有兩軍同時進攻中間的B軍隊才能獲勝。現在需要通訊兵實現A1、A2通訊,表達何時進攻的意圖。A1通知A2,A2收到通知後,需要確認資訊,通知A1我收到了,A1收到訊息後又要通知A2,告訴它我收到你的確認訊息了,A2收到後同樣要確認A1我收到了,這樣無休止迴圈,不能保證訊息的可靠性。
  3. 由兩軍問題,可以看出TCP協議就是為了解決兩軍問題訊息的一致性。A傳送隨機數x給B,B收到後把x+1,再生產隨機數y,把兩數都發給A,A收到後確認了B收到了訊息,再把y+1,返回給B。這樣B也確認了A收到了訊息。這就是TCP協議的重點,但它任然不能夠絕對的保證訊息的可靠性,因為傳輸途中可能被攔截修改內容。

詳細參考 https://www.cnblogs.com/zpfbuaa/p/6846966.html

CAP理論

  1. C一致性,比如客戶端請求服務端,獲取的資料要麼是最新資料,要麼返回錯誤,==強調資料正確性==
  2. A可靠性,比如客戶端請求服務端,一定會獲得資料,但不保證最新,==強調不錯出==
  3. P分割槽容錯性,不管分散式系統內部出現何種問題,大量資料丟失,資料同步延遲,但系統持續工作,==強調不掛掉==

詳細參考 https://blog.csdn.net/guitar___/article/details/80656681