分布式基礎 - ZAB協議&負載均衡策略
ZAB協議
- ZAB協議是為分布式協調服務Zookeeper專門設計的一種支持崩潰恢復的原子廣播協議,實現分布式數據一致性
- 所有客戶端的請求都是寫入到Leader進程中,然后,由Leader同步到其他節點,稱為Follower。在集群數據同步的過程中,如果出現Follower節點崩潰或者Leader進程崩潰時,都會通過Zab協議來保證數據一致性
ZAB協議的兩種模式
ZAB協議包括兩種基本的模式:消息廣播和崩潰恢復
消息廣播:
- 集群中所有的事務請求都由Leader節點來處理,其他服務器為Follower,Leader將客戶端的事務請求轉換為事務Proposal,并且將Proposal分發給集群中其他所有的Follower。
- 完成廣播之后,Leader等待Follwer反饋,當有過半數的Follower反饋信息后,Leader將再次向集群內Follower廣播Commit信息,Commit信息就是確認將之前的Proposal提交。
- Leader節點的寫入是一個兩步操作,第一步是廣播事務操作,第二步是廣播提交操作,其中過半數指的是反饋的節點數>=N/2+1,N是全部的Follower節點數量。
崩潰恢復
- 初始化集群,剛剛啟動的時候
- Leader崩潰,因為故障宕機的時候
- Leader失去了半數的機器支持,與集群中超過一半的節點斷連的時候
此時開啟新一輪Leader選舉,選舉產生的Leader會與過半的Follower進行同步,使數據一致,當與過半的機器同步完成后,就退出恢復模式,然后進入消息廣播模式。
整個ZooKeeper集群的一致性保證就是在上面兩個狀態之前切換,當Leader服務正常時,就是正常的消息廣播模式;當Leader不可用時,則進入崩潰恢復模式,崩潰恢復階段會進行數據同步,完成以后,重新進入消息廣播階段。
Zxid是Zab協議的一個事務編號,Zxid是一個64位的數字,其中低32位是一個簡單的單調遞增計數器,針對客戶端每一個事務請求,計數器加1;而高32位則代表Leader周期年代的編號。
Leader周期(epoch),可以理解為當前集群所處的年代或者周期,每當有一個新的Leader選舉出現時,就會從這個Leader服務器上取出其本地日志中最大事務的Zxid,并從中讀取epoch值,然后加1,以此作為新的周期ID。高32位代表了每代Leader的唯一性,低32位則代表了每代Leader中事務的唯一性。
Zab節點的三種狀態
- following:服從leader的命令
- leading:負責協調事務
- election/looking:選舉狀態
負載均衡策略有哪些
- 輪詢法
將請求按順序輪流地分配到后端服務器上,它均衡地對待后端的每一臺服務器,而不關心服務器實際的連接數和當前的系統負載。
- 加權輪詢法
不同的后端服務器可能機器的配置和當前系統的負載并不相同,因此它們的抗壓能力也不相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請;而配置低、負載高的機器,給其分配較低的權重,降低其系統負載,加權輪詢能很好地處理這一問題,并將請求順序且按照權重分配到后端。
- 隨機法
通過系統的隨機算法,根據后端服務器的列表大小值來隨機選取其中的一臺服務器進行訪問。由概率統計理論可以得知,隨著客戶端調用服務端的次數增多,其實際效果越來越接近于平均分配調用量到后端的每一臺服務器,也就是輪詢的結果。
- 加權隨機法
與加權輪詢法一樣,加權隨機法也根據后端機器的配置,系統的負載分配不同的權重。不同的是,它是按照權重隨機請求后端服務器,而非順序。
- 源地址哈希法
源地址哈希的思想是根據獲取客戶端的IP地址,通過哈希函數計算得到的一個數值,用該數值對服務器列表的大小進行取模運算,得到的結果便是客服端要訪問服務器的序號。采用源地址哈希法進行負載均衡,同一IP地址的客戶端,當后端服務器列表不變時,它每次都會映射到同一臺后端服務器進行訪問。
- 最小連接數法
最小連接數算法比較靈活和智能,由于后端服務器的配置不盡相同,對于請求的處理有快有慢,它是根據后端服務器當前的連接情況,動態地選取其中當前積壓連接數最少的一臺服務器來處理當前的請求,盡可能地提高后端服務的利用效率,將負責合理地分流到每一臺服務器。
分布式系統的設計目標(分布式的好處)
- 可擴展性:通過對服務、存儲的擴展,來提高系統的處理能力,通過對多臺服務器協同工作,來完成單臺服務器無法處理的任務,尤其是高并發或者大數據量的任務。
- 高可用:單點不影響整體,單點故障指系統中某個組件一旦失效,會讓整個系統無法工作
- 無狀態:無狀態的服務才能滿足部分機器宕機不影響全部,可以隨時進行擴展的需求。
- 可管理:便于運維,出問題能不能及時發現定位
- 高可靠:同樣的請求返回同樣的數據;更新能夠持久化;數據不會丟失