1. 程式人生 > >redis、kafka、zookeeper 叢集辨析

redis、kafka、zookeeper 叢集辨析

叢集的目的:

    1.保證高可用

    2.增強併發能力,提高系統的吞吐量。

 

redis 叢集(高可用、資料分散,總可儲存資料變大):

    多個 主-從 結構。

    主節點處理請求,從節點只是同步資料

    各個主節點儲存的資料不同。

    主從切換(哨兵 監聽各自的服務狀態)

 

kafka 叢集(高可用、資料分散):

    分為:控制器、分割槽首領 和 跟隨者

    控制器只是一個broker,不僅提供正常的服務,還要提供首領選舉的能力。負責為失去首領的分割槽找到新的首領

    分割槽首領處理來自客戶端的生產者的訊息請求

    跟隨者只是複製訊息

    因為每個broker可儲存成百上千不同主題與分割槽的副本,若一個broker離開了叢集,可能會讓在該broker的分割槽副本失去分割槽首領,因此 控制器會為這些分割槽重新選舉一個分割槽首領。

    若控制器離開了叢集,則其他broker會收到ZK 的通知,然後會去嘗試成為新的控制器,第一個成功,其餘失敗。則繼續註冊監聽新的控制器節點。

 

ZK 叢集(資料都相同):

    zk 是用來協同分散式系統之間的工作的。

    單機即可完成:

    1)分散式鎖(只有一個能獲取到鎖)

    2)主從選舉

    3)從節點註冊監聽主節點的事件,主節點崩潰,從節點會立即收到通知,去嘗試成為主節點。

 

    叢集:為了保證高可用 和 更大的 併發讀。不是為了分散資料儲存,因為ZK不是設計用來儲存大量資料的。

    1個leader,多個follower

    所有的server 都是最終資料一致

    leader 職責:接受follower寫請求,同步請求,發起投票,接收follower對提議的回覆

    follower 職責:接收客戶端請求並返回請求結果、參與投票

    1).崩潰的server 再加入叢集,即使之前是 leader,那麼此刻一定是 follower。

    2).client 只能連線到 叢集中的 一臺 follower 。follower 接收到寫請求,則轉給 leader. follower 接收到讀請求,則返回結果.

    因為全域性資料一致,因此無論 client 連線到 叢集中的 哪一臺 follower,均可以認為得到的資料是一致的。 

    3)寫請求 由 follower傳遞給leader, leader 發起投票,超過半數,這個寫請求才會被寫入leader,然後 同步給follower.最後請求結果返回給 客戶端。

    4)一個寫請求只會半數以上server 投票通過才能持久化儲存,因此,ZK叢集server數量一般都是 奇數。 3/5/7/9