Redis中的代理Sharding
典型的代理分區(qū)方案有Twitter 開源的Twemproxy 和國(guó)內(nèi)的豌豆莢開源的Codis。
Twemproxy
two-em-proxy
https://github.com/twitter/twemproxy
Twemproxy 的優(yōu)點(diǎn):比較穩(wěn)定,可用性高。
不足:
1、出現(xiàn)故障不能自動(dòng)轉(zhuǎn)移,架構(gòu)復(fù)雜,需要借助其他組件(LVS/HAProxy + Keepalived)實(shí)現(xiàn)HA
2、擴(kuò)縮容需要修改配置,不能實(shí)現(xiàn)平滑地?cái)U(kuò)縮容(需要重新分布數(shù)據(jù))。
Codis
https://github.com/CodisLabs/codis
Codis 是一個(gè)代理中間件,用Go 語言開發(fā)的。
功能:客戶端連接Codis 跟連接Redis 沒有區(qū)別。
| 重新分片不需要重啟 | Yes | No | Yes |
| pipeline | Yes | Yes | ? |
| 多key 操作的hash tags {} | Yes | Yes | Yes |
| 重新分片時(shí)的多key 操作 | Yes | - | No |
| 客戶端支持 | 所有 | 所有 | 支持cluster 協(xié)議的客戶 端 |
分片原理:Codis 把所有的key 分成了N 個(gè)槽(例如1024),每個(gè)槽對(duì)應(yīng)一個(gè)分組,一個(gè)分組對(duì)應(yīng)于一個(gè)或者一組Redis 實(shí)例。Codis 對(duì)key 進(jìn)行CRC32 運(yùn)算,得到一個(gè)32 位的數(shù)字,然后模以N(槽的個(gè)數(shù)),得到余數(shù),這個(gè)就是key 對(duì)應(yīng)的槽,槽后面就
是Redis 的實(shí)例。比如4 個(gè)槽:
Codis 的槽位映射關(guān)系是保存在Proxy 中的,如果要解決單點(diǎn)的問題,Codis 也要做集群部署,多個(gè)Codis 節(jié)點(diǎn)怎么同步槽和實(shí)例的關(guān)系呢?需要運(yùn)行一個(gè)Zookeepe(r 或者etcd/本地文件)。
在新增節(jié)點(diǎn)的時(shí)候,可以為節(jié)點(diǎn)指定特定的槽位。Codis 也提供了自動(dòng)均衡策略。
Codis 不支持事務(wù),其他的一些命令也不支持。
不支持的命令
https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md
獲取數(shù)據(jù)原理(mget):在Redis 中的各個(gè)實(shí)例里獲取到符合的key,然后再匯總到Codis 中。
Codis 是第三方提供的分布式解決方案,在官方的集群功能穩(wěn)定之前,Codis 也得到了大量的應(yīng)用。
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Redis中的代理Sharding的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis中的客户端Sharding
- 下一篇: Redis 分布式方案Redis Clu