Codis是一個分布式的Redis解決方案暖释,對于上層的應(yīng)用來說,連接Codis Proxy和連接原生的Redis Server沒有明顯的區(qū)別阿逃,上層應(yīng)用可以像使用單機(jī)的Redis一樣使用先慷,Codis底層會處理請求的轉(zhuǎn)發(fā),不停機(jī)的數(shù)據(jù)遷移等工作蹄梢,所有后邊的一切事情,對于前面客戶端來說是透明的富俄,可以簡單的認(rèn)為后邊連接是一個內(nèi)存無限大的Redis服務(wù)禁炒。
前言
Redis和Memcache是當(dāng)下最流行的Cache技術(shù)而咆,都是可基于內(nèi)存的Cache,讀寫效率高齐苛。
Redis已經(jīng)是一個必不可少的部件翘盖,豐富的數(shù)據(jù)結(jié)構(gòu)和超高的性能以及簡單的協(xié)議桂塞,讓Redis能夠很好的作為數(shù)據(jù)庫的上游緩存層凹蜂。當(dāng)然我們的項(xiàng)目中也使用了Redis進(jìn)行Cache。Redis的優(yōu)點(diǎn)有許多阁危,這里我就不多做說明玛痊,主要列出下列幾點(diǎn)Redis不足的地方。
Redis缺點(diǎn):
- 耗內(nèi)存狂打。盡管Redis對一些數(shù)據(jù)結(jié)構(gòu)采用了壓縮算法存儲擂煞,但占用內(nèi)存量還是過高。
- Redis的單點(diǎn)問題趴乡。單點(diǎn)Redis容量大小總受限于內(nèi)存对省,在業(yè)務(wù)對性能要求比較高的情況下,單個Redis顯然無法滿足我們的需求晾捏。
對于單點(diǎn)Redis問題我們自然想到進(jìn)行分布式擴(kuò)容蒿涎,目前市面上有類似:
- Redis自帶的Cluster(官方不推薦使用)
- Twitter的Twemproxy
- 豌豆莢工程師開發(fā)的Codis(和Codis升級后的RebornDB)
至于選擇是Twemproxy還是Codis看各個業(yè)務(wù)自己的需求,目前博主項(xiàng)目使用的就是Codis惦辛。
為什么選擇Codis:
- 業(yè)務(wù)需要劳秋,數(shù)據(jù)可能需要遷移,機(jī)器橫向擴(kuò)容
- 經(jīng)過線上測試胖齐,Codis的升級版Reborn在pipline操作的性能比Codis慢了幾十倍
附上幾個鏈接:
安裝
Codis的安裝請參考官方步驟:Build Codis
簡要步驟:
- 安裝Go
- 使用Go獲取Codis代碼
- Go編譯Codis代碼
部署
Codis的部署可參考官網(wǎng)的步驟:Codis部署
博主這里有一個一鍵執(zhí)行的腳本示例大家可以參考:Codis sample
Notes:腳本中的配置需要改為自己的zookeeper地址和一些Redis服務(wù)IP
config.ini
作用:基礎(chǔ)配置,zookeeper地址以及proxy_id等
- coordinator:可選擇etcd或者zookeeper呀伙,示例中的是zookeeper补履,這里只介紹zookeeper的配置,至于etcd的配置請參考官方文檔
- zk地址:host:ip 示例:zk=192.168.0.123:2181 如果有多個zk剿另,則以逗號
,
分隔 - product:產(chǎn)品名稱, 這個Codis集群的名字, 可以認(rèn)為是命名空間, 不同命名空間的Codis沒有交集
- dashboard_addr:dashboard 服務(wù)的地址, CLI 的所有命令都依賴于 dashboard 的 RESTful API, 所以必須啟動干像,一般ip配置為當(dāng)前主機(jī),port默認(rèn)配置為18087
- proxy_id:代理的id驰弄,不同機(jī)器的代理id不能相同
start_dashboard.sh
作用:啟動dashboard
一般不用修改麻汰,但是當(dāng)config.ini中的dashboard_addr配置的port不是18087時,需要將該shell中的port改為相同的port
start_redis.sh
作用:啟動Redis Server
示例中啟動了四個codis-server(即Redis Server)戚篙,開啟個數(shù)各自行調(diào)整五鲫,另外Redis的conf使用的是當(dāng)前目錄下redis_conf中的配置,可自行修改
add_group.sh
作用:為Redis Server分組
替換配置中的host和port岔擂,為codis-server的host和ip位喂。根據(jù)業(yè)務(wù)需要進(jìn)行合理的分組浪耘,可配置多個組
initslot.sh
作用:初始化slot
這一步非常重要,為了讓緩存均勻的分布到每個codis-server中塑崖,在初始化的時候就需要將slot進(jìn)行均勻分配七冲。
最佳分配公式: 1024 / group個數(shù)
如有6個group,則可以按如下分配
../bin/codis-config -c config.ini slot range-set 0 170 1 online
../bin/codis-config -c config.ini slot range-set 171 341 2 online
../bin/codis-config -c config.ini slot range-set 342 512 3 online
../bin/codis-config -c config.ini slot range-set 513 693 4 online
../bin/codis-config -c config.ini slot range-set 694 864 5 online
../bin/codis-config -c config.ini slot range-set 865 1023 6 online
start_proxy.sh
作用:啟用代理
- --addr:配置訪問codis的ip和port
- --http-addr:codis的監(jiān)控ip和port
完成上面的步驟后即可在瀏覽器下訪問:http://localhost:18087/admin 進(jìn)行查看codis的狀態(tài)
Dashboard
Server_group
Slots
常見問題
- 初始化slot時未全部分配至所有g(shù)roup
這個問題博主在第一次使用的時候遇到過规婆,分配了6個group澜躺,但是在初始化slot的時候配置是:
../bin/codis-config -c config.ini slot range-set 0 511 1 online
../bin/codis-config -c config.ini slot range-set 512 1023 2 online
只分配了兩個group,這樣導(dǎo)致key只能存儲在前兩個group中抒蚜,另外4個group都不會存儲了掘鄙。
解決方案:
- (1)執(zhí)行Auto Rebalance
在Dashboard界面中找到Migrate Status,點(diǎn)擊Auto Rebalance指令嗡髓,當(dāng)key的數(shù)量特別多且占用內(nèi)存很大時遷移時間需要很久操漠。
- (2)重新分配slot
具體執(zhí)行方式請google解決,我尚未嘗試過
For Java Users
Codis的作者開發(fā)了新一代的升級版Codis--Reborn饿这,并為Java開發(fā)者提供了相應(yīng)的jodis和Reborn-java
這里博主向大家推薦一個在Reborn-java的基礎(chǔ)上對Spring-data-redis的支持的codis-spring-java
- 通過簡單的配置即可與Spring-data-redis進(jìn)行兼容
- 配置zk地址即可自行管理Redis連接池