redis工作模式
- 單機(jī)
- sentinel
- cluster
sentinel模式
基本部署模式
+----+
| M1 |
| S1 |
+----+
|
+----+ | +----+
| R2 |----+----| R3 |
| S2 | | S3 |
+----+ +----+
quorum = 2 保證順利投票
1. 由于redis沒有類似mongo的 write concern選項(xiàng),切換會丟數(shù)據(jù),可以用配置min-slaves-to-write來緩解
2. 可以實(shí)現(xiàn)故障轉(zhuǎn)移failover,基本的sentinel部署結(jié)構(gòu)
3. 也可以把幾個sentinel配置在單獨(dú)的機(jī)器中,總體思路是把sentinel分開部署鹃祖,甚至考慮和client部署在一起
客戶端連接
- 從sentinel地址列表中挑一個
- 詢問master并連接
- role,詢問身份
- 期間發(fā)生重連都要重復(fù)上述過程
- 當(dāng)發(fā)生故障轉(zhuǎn)移,該節(jié)點(diǎn)會kill掉所有的客戶端連接裆针,節(jié)點(diǎn)會立即或者等分區(qū)結(jié)束后降為slave
- 對于連接池,每次新連接都需要檢測地址有沒有變, 有的話所有連接都重置世吨。
cluster模式
- 更多的并行內(nèi)存澡刹,不僅限與單機(jī)內(nèi)存
- multi-key 限制
- redis使用hash slot而不是一致性hash,16384個節(jié)點(diǎn)耘婚。key計(jì)算crc后取mod
- 如果發(fā)生遷移罢浇,遷移狀態(tài)完成前老節(jié)點(diǎn)繼續(xù)承擔(dān)工作,完成后新節(jié)點(diǎn)承擔(dān)沐祷,如果老節(jié)點(diǎn)找不到嚷闭,老節(jié)點(diǎn)會讓你從新節(jié)點(diǎn)請求。
- 節(jié)點(diǎn)間通過gossip協(xié)議同步節(jié)點(diǎn)的slot元信息戈轿,每個節(jié)點(diǎn)隨機(jī)向K個節(jié)點(diǎn)發(fā)送自身持有的M個meta信息凌受。
- 客戶端隨機(jī)連一個節(jié)點(diǎn),如果數(shù)據(jù)不在當(dāng)前節(jié)點(diǎn)思杯,會收到一個MOVED重定向
- 每個節(jié)點(diǎn)可以有多個slave胜蛉,同理failover也通過gossip協(xié)議感知。
- 一樣可能寫丟失
- 可以通過配置timeout以及最小寫副本數(shù)量來緩解寫丟失色乾。
- gossip協(xié)議最終收斂誊册,去中心化,可拓展性強(qiáng)暖璧,但只能最終一致性案怯,數(shù)據(jù)傳輸也比較冗余。