主從複製 官方文檔:https://redis.io/docs/latest/operate/oss_and_stack/management/replication/ 極簡概括:將一個主Redis伺服器的數據複製到其它從Redis伺服器的過程。 角色: 主節點(Master):負責處理客戶端的寫( ...
1.Redis Cluster 是Reids 自己本身提供的Redis 集群方案。
【此圖來源於 https://www.bilibili.com/video/BV1Gs4y1Q7Ls?p=6&vd_source=0e347fbc6c2b049143afaa5a15abfc1c】
2.Redis 是去中心化的,集群由多個redis節點組成,每個節點負責整個集群的一部分數據,每個節點負責的數據多少可能不一樣。節點之間相互連接組成一個對能的集群,他們呢之間通過一個特殊的二進位協議交換集群信息。
3.Redis Cluster 將所有的數據劃分為16384個槽位,每個節點負責其中一部分槽位。
4.將key映射到hash slot的演算法如下:
HASH_SLOT = CRC16(key) mod 16384
取key進行CRC16計算之後對16384取模運算得到key所在的slot,由於redis cluster在啟動時會對每一臺master節點分配slot空間,那麼當前slot的值在哪台master節點的slot空間範圍內,key就存儲在哪台節點。
【圖片來自 《Redis cluster集群Hash Tag原理分析》 https://www.51cto.com/article/757391.html】
5.正常情況下,每個hash slot只會由一個節點提供服務。
當Redis Cluster 的客戶端來連接集群時,會得到一份集群的槽位配置信息。這樣客戶端要查找某個Key時,可以直接定位到目標節點。(這一點與Codis不同,Codis需要通過Proxy來定位目標節點,Reids Cluster 則直接定位)。
6.數據傾斜的問題
(1) 一種方案時,發現手動遷移;例如一些商品促銷前,檢查下,發現數據集中了,或者嚴重傾斜,可以考慮手動遷移。
(2)另一種方案,自動形式,採用 hash tag方案;在原key上面,添加以{}包圍的首碼名。用不同的首碼名,來進行映射分配。
7. hash tag 的官方解釋
Hash tags There is an exception for the computation of the hash slot that is used in order to implement hash tags.
Hash tags are a way to ensure that multiple keys are allocated in the same hash slot.
This is used in order to implement multi-key operations in Redis Cluster. To implement hash tags, the hash slot for a key is computed in a slightly different way in certain conditions.
If the key contains a "{...}" pattern only the substring between { and } is hashed in order to obtain the hash slot.
However since it is possible that there are multiple occurrences of { or } the algorithm is well specified by the following rules: IF the key contains a { character. AND IF there is a } character to the right of {. AND IF there are one or more characters between the first occurrence of { and the first occurrence of }. Then instead of hashing the key, only what is between the first occurrence of { and the following first occurrence of } is hashed. Examples: The two keys {user1000}.following and {user1000}.followers will hash to the same hash slot since only the substring user1000 will be hashed in order to compute the hash slot. For the key foo{}{bar} the whole key will be hashed as usually since the first occurrence of { is followed by } on the right without characters in the middle. For the key foo{{bar}}zap the substring {bar will be hashed, because it is the substring between the first occurrence of { and the first occurrence of } on its right. For the key foo{bar}{zap} the substring bar will be hashed, since the algorithm stops at the first valid or invalid (without bytes inside) match of { and }. What follows from the algorithm is that if the key starts with {}, it is guaranteed to be hashed as a whole. This is useful when using binary data as key names.
hash tags 是用於計算哈希槽時的一個例外,是一種確保多個鍵分配到同一個哈希槽中的方法。這是為了在Redis集群中實現多鍵操作而使用的。為了實現hash tags,在某些情況下,會以稍微不同的方式計算key的哈希槽。如果key包含"{...}"模式,則僅對{和}之間的子字元串進行散列以獲取哈希槽。但由於可能存在多個{或}出現,因此該演算法遵循以下規則:
- 如果key包含字元 {
- 並且如果 } 字元位於 { 的右側
- 並且在第一個 { 和第一個 } 之間存在一個或多個字元
對於符合上述規則的key,則不會對整個key進行散列處理,而只會對第一次出現 { 和隨後第一次出現 } 之間的內容進行散列。否則,對整個key進行散列處理。
8.可能下線(PFail)與確定下線(Fail)
因為Redis Cluster 是去中心化的,一個節點認為某個節點失聯了並不代表所有的節點都認為它失聯了,所以集群還得經過一次協商,只有當大多數節點都認為某個節點失聯了,集群才認為該節點需要進行主從切換來容錯。
Redis集群節點採用Gossip協議來廣播自己的狀態以及改變對整個集群的認知。比如一個節點發現某個節點失聯了(PFail,即Possibly Fail),它會將這條信息向整個集群廣播,其它節點就可以收到這點的失聯信息。如果收到某個節點失聯的節點數量(PFail Count)已經達到了集群的大多數,就可以標記該失聯節點為確定下線狀態(Fail),然後向整個集群廣播,強迫其它節點也接受該節點已經下線的事實,並立刻對該節點進行主從切換。
9.網路抖動的容忍性
Redis Cluster 提供了一個選項配置 cluster-node-timeout,表示當某個節點持續timeout的時間失聯時,才可以認定該節點出現故障,需要進行主從切換。
另外還有一個選項 cluster-slave-validity-factor作為倍乘繫數放大這個超時時間來寬鬆容錯的緊急程度。如果這個繫數為零,那麼主從切換是不會抗拒網路抖動的。如果這個繫數大於1,它就成為了主從切換的鬆弛繫數。
10.集群常用命令
info replication:返回關於 Redis 主從複製的詳細信息 cluster info:獲取 Redis 集群的狀態和統計信息 cluster nodes:獲取關於集群中所有節點的詳細信息。 cluster countkeysinslot <槽位數字編號>:該槽位是否被占用。1占用2未占用 cluster keyslot <keyname> 該key應該存放在哪個槽位上 cluster failover : 將當前redis的身份從slave變成master,原來的master變成slave
1.30張圖 講清楚Redis Cluster
https://cloud.tencent.com/developer/article/2226847
2.Redis cluster specification
https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec/
3.Redis Cluster 深入探究
https://zhuanlan.zhihu.com/p/198963336
4.【譯】Redis集群規範 (Redis Cluster Specification)
https://www.jianshu.com/p/8a2d810402a9
5.Redis-集群(cluster)
https://www.cnblogs.com/mingbo-1/p/17992458
https://www.cnblogs.com/caoweixiong/p/14242613.html