消息丟失、消息亂序(能夠經過增長序列號解決)以及數據錯誤算法
在單機,只要不宕機,一個函數執行要麼成功、要麼失敗,可是分佈式系統共下存在成功、失敗和超時。下面解釋一下超時的不肯定性:數據庫
某個節點 A 向另外一個節點 B 發送一個消息,若是請求 RPC 的節點 A 在給定的時間內沒有收到執行 RPC 的節點 B 返回的消息,則認爲該操做「超時」。對於超時的請求,咱們沒法獲知該請求是否被節點 B 成功執行了。這是由於,若是超時是因爲節點 A 發向節點 B 的請求消息丟失形成的,則該操做確定沒有被節點 B 成功執行;但若是節點 A 成功的向節點 B 發送了請求消息,且節點 B 也成功的執行了該請求,但節點 B 發向節點 A 的結果消息被網絡丟失了或者節點 B 在執行完該操做後馬上宕機沒有可以發出結果消息,從而形成從節點 A 看來請求超時。因此一旦發生超時,請求方是沒法獲知 RPC 的執行結果的。服務器
A 當出現「超時」時,能夠經過發起讀取數據的操做以驗證 RPC 是否成功 (例如銀行系統的作法)。網絡
B 設計分佈式協議時將執行步驟設計爲可重試的,即具備所謂的「冪等性」。例如覆蓋寫就是一種常見的冪等性操做,由於重複的覆蓋寫最終的結果都相等。若是使用可重試的設計,當出現「失敗」和「超時」時,一概重試操做直到「成功」。這樣,即便超時的操做實際上已經成功了,重試操做也不會對正確性形成影響,從而簡化了設計負載均衡
通常是硬盤機械故障。分佈式
哈希方式是最多見的數據分佈方式,其方法是按照數據的某一特徵計算哈希值,並將哈希值與機器中的機器創建映射關係,從而將不一樣哈希值的數據分佈到不一樣的機器上。函數
優勢:設計
哈希方式須要記錄的元信息也很是簡單,任什麼時候候,任何節點只須要知道哈希函數的計算方式及模的服務器總數就能夠計算出處理具體數據的機器是哪臺。blog
缺點:ip
A 突出表現爲可擴展性不高,一旦集羣規模須要擴展,則幾乎全部的數據須要被遷移並從新分佈
B 一旦某數據特徵值的數據嚴重不均,容易出現「數據傾斜」(data skew)問題,只能從新選擇須要哈希的數據特徵,例如選擇用戶 id 與另外一個數據維度的組合做爲哈希函數的輸入。
將數據按特徵值的值域範圍劃分爲不一樣的區間,使得集羣中每臺(組)服務器處理不一樣區間的數據。
優勢:
使用範圍分佈數據的方式的最大優勢就是能夠靈活的根據數據量的具體狀況拆分原有數據區間,拆分後的數據區間能夠遷移到其餘機器,一旦須要集羣完成負載均衡時,與哈希方式相比很是靈活。另外,當集羣須要擴容時,能夠隨意添加機器,而不限爲倍增的方式,只需將原機器上的部分數據分區遷移到新加入的機器上就能夠完成集羣擴容。
缺點:
按數據範圍分佈數據須要記錄全部的數據分佈狀況。通常的,每每須要使用專門的服務器在內存中維護數據分佈信息,稱這種數據的分佈信息爲一種元信息。
優勢:
因爲與具體的數據內容無關,按數據量分佈數據的方式通常沒有數據傾斜的問題,數據老是被均勻切分並分佈到集羣中。當集羣須要從新負載均衡時,只需經過遷移數據塊便可完成。集羣擴容也沒有太大的限制,只需將部分數據庫遷移到新加入的機器上便可以完成擴容。
缺點:
須要管理較爲複雜的元信息,與按範圍分佈數據的方式相似,當集羣規模較大時,元信息
的數據量也變得很大,高效的管理元信息成爲新的課題。
一致性哈希(consistent hashing)是另外一個種在工程中使用較爲普遍的數據分佈方式。一致性哈希最初在 P2P 網絡中做爲分佈式哈希表(DHT)的經常使用數據分佈算法。一致性哈希的基本方式是使用一個哈希函數計算數據或數據特徵的哈希值,令該哈希函數的輸出值域爲一個封閉的環,即哈希函數輸出的最大值是最小值的前序。將節點隨機分佈到這個環上,每一個節點負責處理從本身開始順時針至下一個節點的所有哈希值域上的數據。
例 2.1.3:某一致性哈希函數的值域爲[0, 10),系統有三個節點 A、B、C,這三個節點處於的一致性哈希的位置分別爲 1,4,9,則節點 A 負責的值域範圍爲[1,4),節點 B 負責的範圍爲[4, 9),節點 C 負責的範圍爲[9, 10)和[0, 1)。若某數據的哈希值爲 3,則該數據應由節點 A 負責處理。 圖 2-4給出了這個例子的示意圖。
哈希分佈數據的方式在集羣擴容時很是複雜,每每須要倍增節點個數,與此相比,一致性哈希的優勢在於能夠任意動態添加、刪除節點,每次添加、刪除一個節點僅影響一致性哈希環上相鄰的節點。
例 2.1.4:假設須要在例 2.1.3 中增長一個新節點 D,爲 D 分配的哈希位置爲 3,則首先將節點A 中[3, 4)的數據從節點 A 中拷貝到節點 D,而後加入節點 D 便可
優勢:
使用一致性哈希的方式須要將節點在一致性哈希環上的位置做爲元信息加以管理,這點比直接使用哈希分佈數據的方式要複雜。然而,節點的位置信息只於集羣中的機器規模相關,其元信息的量一般比按數據範圍分佈數據和按數據量分佈數據的元信息量要小不少。
缺點:
隨機分佈節點的方式使得很難均勻的分佈哈希值域,尤爲在動態增長節點後,即便原先的分佈均勻也很難保證繼續均勻,由此帶來的另外一個較爲嚴重的缺點是,當一個節點異常時,該節點的壓力所有轉移到相鄰的一個節點,當加入一個新節點時只能爲一個相鄰節點分攤壓力。
在實際工程實踐中,能夠根據需求及實施複雜度合理選擇數據分佈方式。另外,上述數據分佈方式是若是能夠靈活組合使用,每每能夠兼備各類方式的優勢,收到較好的綜合效果。
2.6 工程投影