Redis Cluster原理
Redis Cluster 是Redis的叢集實現,內建資料自動分片機制,叢集內部將所有的key對映到16384個Slot中,叢集中的每個Redis Instance負責其中的一部分的Slot的讀寫。叢集客戶端連線叢集中任一Redis Instance即可傳送命令,當Redis Instance收到自己不負責的Slot的請求時,會將負責請求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到後自動將原請求重新發往這個地址,對外部透明。一個Key到底屬於哪個Slot由crc16(key) % 16384 決定。
關於負載均衡,叢集的Redis Instance之間可以遷移資料,以Slot為單位,但不是自動的,需要外部命令觸發。
關於叢集成員管理,叢集的節點(Redis Instance)和節點之間兩兩定期交換叢集內節點資訊並且更新,從傳送節點的角度看,這些資訊包括:叢集內有哪些節點,IP和PORT是什麼,節點名字是什麼,節點的狀態(比如OK,PFAIL,FAIL,後面詳述)是什麼,包括節點角色(master 或者 slave)等。
關於可用性,叢集由N組主從Redis Instance組成。主可以沒有從,但是沒有從 意味著主宕機後主負責的Slot讀寫服務不可用。一個主可以有多個從,主宕機時,某個從會被提升為主,具體哪個從被提升為主,協議類似於Raft,參見這裡。如何檢測主宕機?Redis Cluster採用quorum+心跳的機制。從節點的角度看,節點會定期給其他所有的節點發送Ping,cluster-node-timeout(可配置,秒級)時間內沒有收到對方的回覆,則單方面認為對端節點宕機,將該節點標為PFAIL狀態。通過節點之間交換資訊收集到quorum個節點都認為這個節點為PFAIL,則將該節點標記為FAIL,並且將其傳送給其他所有節點,其他所有節點收到後立即認為該節點宕機。從這裡可以看出,主宕機後,至少cluster-node-timeout時間內該主所負責的Slot的讀寫服務不可用。