《Redis集群方案-Codis》要點(diǎn):
本文介紹了Redis集群方案-Codis,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
作者介紹
郝朝陽,DevOps視角社區(qū)發(fā)起人,高級(jí)運(yùn)維工程師,專注于運(yùn)維自動(dòng)化的實(shí)現(xiàn).現(xiàn)就職于宜搜科技,負(fù)責(zé)前端運(yùn)維工作.致力于形成自己的運(yùn)維細(xì)想體系.
codis是豌豆莢基礎(chǔ)架構(gòu)團(tuán)隊(duì)開發(fā)并開源的分布式redis服務(wù),可以看作是一個(gè)無限內(nèi)存的redis服務(wù),有動(dòng)態(tài)擴(kuò)容/縮容的能力.
codis使redis獲得動(dòng)態(tài)擴(kuò)容/縮容的能力,增減redis實(shí)例對(duì)client完全透明,并不需要重啟服務(wù),不需要業(yè)務(wù)方面擔(dān)心redis內(nèi)存爆掉的問題.
在codis的設(shè)計(jì)中,codis-proxy被設(shè)計(jì)成無狀態(tài)的,客戶端連接任何一個(gè)codis-proxy都是一樣的,所以可以比較容易單間多個(gè)codis-proxy來實(shí)現(xiàn)高可用并橫向擴(kuò)容.建議使用多codis-proxy的高可用架構(gòu).
codis采用pre-sharding的技術(shù)來實(shí)現(xiàn)數(shù)據(jù)的分片,默認(rèn)分成1024個(gè)slot(0-1023).對(duì)于每個(gè)key來說,通過哈希算法crc32(key)%1024來 確定slot id.
slot是虛擬概念.每一個(gè)slot都會(huì)有一個(gè)且必須有一個(gè)特定的server group id來表示這個(gè)slot的數(shù)據(jù)由哪個(gè)server group來提供.數(shù)據(jù)的遷移也是以slot為最小單位的.
codis支持通過codis-server進(jìn)行數(shù)據(jù)遷移,遷移數(shù)據(jù)時(shí)是一個(gè)個(gè)key來進(jìn)行的.每次以一個(gè)key為最小單位進(jìn)行遷移,不會(huì)把主線程block住.redis的操作是內(nèi)存的,批量的一次性寫入和分多次set幾乎沒有區(qū)別,再者這個(gè)模型還避免了遷移過程中的數(shù)據(jù)更新同步的問題,因?yàn)檫w移一個(gè)key的操作是原子性的,對(duì)于這個(gè)redis-server來說,在完成這次遷移指令前,是不會(huì)響應(yīng)其它請(qǐng)求的,所以保證了數(shù)據(jù)的安全.
codis提供了redis-port的命令行工具,能夠?qū)崿F(xiàn)從數(shù)據(jù)上T的redis集群遷移到codis分布式redis集群.redis-port具有如下功能:?
實(shí)現(xiàn)redis集群遷移到codis集群,需要進(jìn)行如下操作?
每個(gè)redis-port負(fù)責(zé)將對(duì)應(yīng)的redis數(shù)據(jù)導(dǎo)入到codis
多個(gè)redis-port之間互不干擾,除非多個(gè)redis上的key出現(xiàn)沖突
單個(gè)redis-port可以將負(fù)責(zé)的數(shù)據(jù)并行遷移一提高速度,通過—nohup指定并行數(shù)
導(dǎo)入速度受帶寬以及codis-proxy處理速度限制
?原redis集群下線時(shí),會(huì)導(dǎo)致redis-port連接斷開,于是自動(dòng)退出
因?yàn)閏odis-proxy是無狀態(tài)的,所以比較容易實(shí)現(xiàn)高可用性并橫向擴(kuò)容.
對(duì)于JAVA用戶來說,可以使用設(shè)計(jì)者修改過的jedis(https://github.com/CodisLabs/jodis),來實(shí)現(xiàn)codis-proxy的高可用.它會(huì)通過監(jiān)控zk上的注冊(cè)信息來實(shí)時(shí)獲得當(dāng)前可用的proxy列表,既可以保證高可用性,也可以通過輪流請(qǐng)求所有的proxy實(shí)現(xiàn)負(fù)載均衡.如果需要異步請(qǐng)求,可以使用基于Netty開發(fā)的Nedis.
對(duì)于codis-group的redis實(shí)例來說,當(dāng)一個(gè)group的master故障后,應(yīng)該讓管理員清楚的知道,并手動(dòng)將slave升級(jí)為master,因?yàn)檫@涉及到數(shù)據(jù)一致性等問題.當(dāng)group中的master故障,其中一個(gè)slave升級(jí)為master后,該組內(nèi)的其它slave實(shí)例是不會(huì)自動(dòng)改變狀態(tài)的,這些slave仍試圖從舊的master上同步數(shù)據(jù),因而導(dǎo)致組內(nèi)新的master和slave之間數(shù)據(jù)不一致.因?yàn)閞edis的slaveof命令切換master時(shí)會(huì)丟棄slave上的全部數(shù)據(jù),從新master完整同步,會(huì)消耗新master資源,因此建議在知情的情況下手動(dòng)操作,是用codis-configserver add?slave.
codis通過開放的api實(shí)現(xiàn)自動(dòng)切換主從的工具-codis-ha,會(huì)檢測(cè)到master故障后,會(huì)自動(dòng)將其下線,并將期中一個(gè)salve提升為master,但是不會(huì)自動(dòng)刷新其它slave的狀態(tài).
文章來自微信公眾號(hào):DevOps視角
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4229.html