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