Redis cluster叢集模式的原理
redis cluster
自動將資料進行分片,每個master上放一部分資料
提供內建的高可用支援,部分master不可用時,還是可以繼續工作的
支撐N個redis master node,每個master node都可以掛載多個slave node
讀寫分離的架構,對於每個master來說,寫就寫到master,然後讀就從mater對應的slave去讀
高可用,因為每個master都有salve節點,那麼如果mater掛掉,redis cluster這套機制,就會自動將某個slave切換成master
redis cluster vs. replication + sentinal
如果你的資料量很少,主要是承載高併發高效能的場景,比如你的快取一般就幾個G,單機足夠了
replication,一個mater,多個slave,要幾個slave跟你的要求的讀吞吐量有關係,然後自己搭建一個sentinal叢集,去保證redis主從架構的高可用性,就可以了
redis cluster,主要是針對海量資料+高併發+高可用的場景,海量資料,如果你的資料量很大,那麼建議就用redis cluster
資料分佈演算法
hash演算法
比如你有 N 個 cache 伺服器(後面簡稱 cache ),那麼如何將一個物件 object 對映到 N 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 N 個 cache :
hash(object)%N
如果增加一個cache,對映公式變成了 hash(object)%(N+1)
如果一個cache宕機了,對映公式變成了 hash(object)%(N-1)
在這兩種情況下,幾乎所有的 cache 都失效了。會導致資料庫訪問的壓力陡增,嚴重情況,還可能導致資料庫宕機。
一致性hash演算法
一個master宕機不會導致大部分快取失效,可能存在快取熱點問題
用虛擬節點改進
redis cluster的hash slot演算法
redis cluster有固定的16384個hash slot,對每個key計算CRC16值,然後對16384取模,可以獲取key對應的hash slot
redis cluster中每個master都會持有部分slot,比如有3個master,那麼可能每個master持有5000多個hash slot
hash slot讓node的增加和移除很簡單,增加一個master,就將其他master的hash slot移動部分過去,減少一個master,就將它的hash slot移動到其他master上去
移動hash slot的成本是非常低的
客戶端的api,可以對指定的資料,讓他們走同一個hash slot,通過hash tag來實現
127.0.0.1:7000>CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000 可以將槽0-5000指派給節點7000負責。
每個節點都會記錄哪些槽指派給了自己,哪些槽指派給了其他節點。
客戶端向節點發送鍵命令,節點要計算這個鍵屬於哪個槽。
如果是自己負責這個槽,那麼直接執行命令,如果不是,向客戶端返回一個MOVED錯誤,指引客戶端轉向正確的節點。
轉自:中華石杉Java工程師面試突擊