Codis初體驗(yàn)心得

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):

  1. 耗內(nèi)存狂打。盡管Redis對一些數(shù)據(jù)結(jié)構(gòu)采用了壓縮算法存儲擂煞,但占用內(nèi)存量還是過高。
  2. 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慢了幾十倍

附上幾個鏈接:

  1. Redis常見集群方案玻淑、Codis實(shí)踐及與Twemproxy比較
  2. codis,redis,twemproxy三者對比

安裝

Codis的安裝請參考官方步驟:Build Codis

簡要步驟:

  1. 安裝Go
  2. 使用Go獲取Codis代碼
  3. Go編譯Codis代碼

部署

Codis的部署可參考官網(wǎng)的步驟:Codis部署

博主這里有一個一鍵執(zhí)行的腳本示例大家可以參考:Codis sample

Notes:腳本中的配置需要改為自己的zookeeper地址和一些Redis服務(wù)IP

config.ini

作用:基礎(chǔ)配置,zookeeper地址以及proxy_id等

  1. coordinator:可選擇etcd或者zookeeper呀伙,示例中的是zookeeper补履,這里只介紹zookeeper的配置,至于etcd的配置請參考官方文檔
  2. zk地址:host:ip 示例:zk=192.168.0.123:2181 如果有多個zk剿另,則以逗號,分隔
  3. product:產(chǎn)品名稱, 這個Codis集群的名字, 可以認(rèn)為是命名空間, 不同命名空間的Codis沒有交集
  4. dashboard_addr:dashboard 服務(wù)的地址, CLI 的所有命令都依賴于 dashboard 的 RESTful API, 所以必須啟動干像,一般ip配置為當(dāng)前主機(jī),port默認(rèn)配置為18087
  5. 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

dashboard

Server_group

server_group

Slots

slots

常見問題

  1. 初始化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)存很大時遷移時間需要很久操漠。

migrate
  • (2)重新分配slot

具體執(zhí)行方式請google解決,我尚未嘗試過

For Java Users

Codis的作者開發(fā)了新一代的升級版Codis--Reborn饿这,并為Java開發(fā)者提供了相應(yīng)的jodisReborn-java

這里博主向大家推薦一個在Reborn-java的基礎(chǔ)上對Spring-data-redis的支持的codis-spring-java

  • 通過簡單的配置即可與Spring-data-redis進(jìn)行兼容
  • 配置zk地址即可自行管理Redis連接池
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浊伙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子长捧,更是在濱河造成了極大的恐慌嚣鄙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆姐,死亡現(xiàn)場離奇詭異拗慨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奉芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門赵抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人声功,你說我怎么就攤上這事烦却。” “怎么了先巴?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵其爵,是天一觀的道長。 經(jīng)常有香客問我伸蚯,道長摩渺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任剂邮,我火速辦了婚禮唁桩,結(jié)果婚禮上火脉,老公的妹妹穿的比我還像新娘局待。我一直安慰自己,他們只是感情好枉侧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狂芋,像睡著了一般榨馁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帜矾,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天翼虫,我揣著相機(jī)與錄音,去河邊找鬼黍特。 笑死蛙讥,一個胖子當(dāng)著我的面吹牛锯蛀,可吹牛的內(nèi)容都是我干的灭衷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼旁涤,長吁一口氣:“原來是場噩夢啊……” “哼翔曲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劈愚,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞳遍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菌羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠械,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年注祖,在試婚紗的時候發(fā)現(xiàn)自己被綠了猾蒂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡是晨,死狀恐怖肚菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罩缴,我是刑警寧澤蚊逢,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站箫章,受9級特大地震影響烙荷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一终抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦拿诸、人聲如沸扒袖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季率。三九已至,卻和暖如春描沟,著一層夾襖步出監(jiān)牢的瞬間飒泻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工吏廉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泞遗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓席覆,卻偏偏與公主長得像史辙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佩伤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容