如何深入了解Redis中的Codis

這篇文章給大家介紹如何深入了解redis中的Codis,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

陸港ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

場(chǎng)景

在大數(shù)據(jù)高并發(fā)場(chǎng)景下,使用單個(gè)redis實(shí)例,即使redis的性能再高,也會(huì)變的非常吃力,

首先,數(shù)據(jù)量越大,redis占用內(nèi)存就越大,進(jìn)一步導(dǎo)致rdb文件過(guò)大,這種情況會(huì)使的主從全量同步時(shí)間過(guò)長(zhǎng),同時(shí)實(shí)例重啟時(shí),加載過(guò)大的rdb也會(huì)讓啟動(dòng)時(shí)間變長(zhǎng)?!鞠嚓P(guān)推薦:Redis視頻教程】

其次在CPU的使用上,單個(gè)實(shí)例的Redis只能使用一個(gè)CPU核心,一個(gè)核心應(yīng)多過(guò)多的數(shù)據(jù),也會(huì)顯得力不從心,

因此需要一個(gè)集群方案,將巨大的數(shù)據(jù)量由一臺(tái)實(shí)例分散到多臺(tái)實(shí)例上,從Redis流行到官方支持自己的Cluster方案之間,第三方也在自己開(kāi)發(fā)支持集群的組件,Codis就是其中之一,

Codis使用Go語(yǔ)言開(kāi)發(fā),在Redis與客戶端中間充當(dāng)代理的角色,使用Redis協(xié)議,所以客戶端直接連接Codis,向其發(fā)送指令即可,Codis負(fù)責(zé)轉(zhuǎn)發(fā)指令給Redis,最后接收返回結(jié)果再返回給客戶端,

如何深入了解Redis中的Codis

Codis代理的Redis實(shí)例構(gòu)成一個(gè)Redis集群,當(dāng)集群空間也不足以使用時(shí),可以動(dòng)態(tài)擴(kuò)容,繼續(xù)增加Redis實(shí)例,與此同時(shí),客戶端使用的sdk不需要做任何改動(dòng),只需由原來(lái)的連接redis改成連接codis即可,

Codis自身也可以采取一個(gè)集群,來(lái)保證自身的高可用,由于其本身就是無(wú)狀態(tài)的,只負(fù)責(zé)轉(zhuǎn)發(fā)內(nèi)容,增加多個(gè)Codis沒(méi)有副作用還可以保證QPS的提高,當(dāng)其中一個(gè)Codis掛掉時(shí),還可以使用別的。

如何深入了解Redis中的Codis

原理

Codis將特定的Key轉(zhuǎn)發(fā)到特定的Redis實(shí)例,集群中每個(gè)實(shí)例都保存一部分Key,降低其他實(shí)例的壓力,同時(shí)所有實(shí)例的數(shù)據(jù)加起來(lái),就是一份完整的信息。

Codis默認(rèn)劃分了1024個(gè)槽位(slot),集群中的每個(gè)Redis實(shí)例對(duì)應(yīng)一部分槽位,Codis會(huì)在內(nèi)存中維護(hù)槽位與Redis實(shí)例的對(duì)應(yīng)關(guān)系,

槽位的數(shù)量默認(rèn)是1024,可以更改,如果集群節(jié)點(diǎn)比較多,可以將數(shù)字調(diào)大。

如何深入了解Redis中的Codis

當(dāng)接收到客戶端發(fā)送過(guò)來(lái)的key時(shí),Codis對(duì)該key進(jìn)行 crc32 運(yùn)算得出一個(gè) hash 值,

再將 hash 后的整數(shù)值對(duì) 1024(槽位數(shù)量) 進(jìn)行取模得到一個(gè)余數(shù),該余數(shù)就是Key將被保存到的槽位,有了槽位就可以找到這個(gè)key該發(fā)到哪個(gè)redis實(shí)例上了。

偽代碼:

hash = crc32(command.key) # 計(jì)算hash值
slot = hash % 1024 # 取模得到槽位
redisInstance = slots[slot].redis # 得到redis實(shí)例
redis.do(command) # 執(zhí)行命令復(fù)制代碼

集群槽位同步

Redis與槽位的映射關(guān)系存在Codis的內(nèi)存當(dāng)中,因此Codis集群需要考慮保證每個(gè)節(jié)點(diǎn)中的槽位映射關(guān)系同步,所以Codis采用 Zookeeper、Etcd 分布式配置存儲(chǔ)中間件來(lái)持久化槽位映射關(guān)系,保證Codis集群之間的數(shù)據(jù)同步,

如下圖,Codis將槽位關(guān)系存在Zookeeper中,并提供了一個(gè)Dashboard 觀察與修改槽位關(guān)系,當(dāng)發(fā)生改變時(shí),Codis Proxy 監(jiān)聽(tīng)到變化并重新同步槽位關(guān)系。

如何深入了解Redis中的Codis

拓容

當(dāng)現(xiàn)有集群也不滿足業(yè)務(wù)需求時(shí),就需要新增實(shí)例加入到的集群中,此時(shí)槽位映射關(guān)系需要進(jìn)行重新分配,需要分配一部分的槽位給新節(jié)點(diǎn)。

Codis新增了一個(gè) SLOTSSCAN 指令,可以遍歷指定slot下的所有key,通過(guò)該指令掃描出待遷移槽位的所有key,然后挨個(gè)遍歷每個(gè)key遷移到新節(jié)點(diǎn)中,

遷移過(guò)程中,Codis繼續(xù)對(duì)外提供服務(wù),此時(shí)來(lái)了一個(gè)請(qǐng)求打在了正在遷移的槽位上,由于該槽位現(xiàn)在對(duì)應(yīng)新老兩個(gè)節(jié)點(diǎn),此時(shí) Codis 無(wú)法判斷該 key 有沒(méi)有從舊節(jié)點(diǎn)中遷移到新節(jié)點(diǎn)上,

因此這種情況 Codis 會(huì)立即強(qiáng)制對(duì)當(dāng)前的 key 進(jìn)行單個(gè)遷移,遷移完成后,將請(qǐng)求轉(zhuǎn)發(fā)給新的Redis實(shí)例上。

偽代碼:

slot_index = crc32(command.key) % 1024
if slot_index in migrating_slots:
    doMigratingKey(command.key)
    redis = slots[slot_index].new_redis
else:
    redis = slots[slot_index].redis復(fù)制代碼

SLOTSSCAN 與 Redis自身的Scan指令一樣,無(wú)法避免掃描出來(lái)的數(shù)據(jù)重復(fù),但這不會(huì)影響到遷移的正確性,因?yàn)閱蝹€(gè)key遷移之后,就立刻從舊實(shí)例中刪除了,無(wú)法再被掃描出來(lái)。

自動(dòng)均衡槽位

每次新增實(shí)例,如果都需要人工維護(hù)slot的映射關(guān)系太麻煩,Codis提供自動(dòng)均衡,該功能會(huì)在系統(tǒng)比較空閑的時(shí)候觀察每個(gè)Redis實(shí)例對(duì)應(yīng)的slot數(shù)量,如果不平衡,就進(jìn)行自動(dòng)均衡,遷移數(shù)據(jù)的操作。

缺點(diǎn)

Codis給Redis帶來(lái)擴(kuò)容好處,但也造成了一些副作用。

不支持事務(wù)

一個(gè)事務(wù)可能對(duì)多個(gè)key做了操作,但事務(wù)只能在單個(gè)實(shí)例中完成,但是由于key分散在不同的實(shí)例中,因此Codis無(wú)法支持事務(wù)操作。

不支持rename

rename將一個(gè)key命名成另一個(gè)key,但是這兩個(gè)key可能hash出來(lái)的槽位并不是同一個(gè),而是在不同實(shí)例的槽位上,因此rename也不被支持。

官方提供的不支持的指令列表:https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md

擴(kuò)容卡頓

Codis在擴(kuò)容過(guò)程中,對(duì)數(shù)據(jù)的遷移是將整個(gè)key直接遷移過(guò)去的,例如一個(gè)hash結(jié)構(gòu),Codis會(huì)直接 hgetall 拉取所有的內(nèi)容,使用 hmset 放到 新節(jié)點(diǎn)中,

如果該hash的內(nèi)容過(guò)大,將會(huì)引起卡頓,官方建議單個(gè)集合結(jié)構(gòu)的總大小不超過(guò)1MB,在業(yè)務(wù)上可以通過(guò)分桶存儲(chǔ)等,將大型數(shù)據(jù)拆成多個(gè)小的,做一個(gè)折中。

網(wǎng)絡(luò)開(kāi)銷

由于 Codis 在 客戶端與Redis實(shí)例之間充當(dāng)網(wǎng)絡(luò)Proxy,多了一層,網(wǎng)絡(luò)開(kāi)銷自然多一些,比直接連接Redis的性能要稍低一些。

中間件運(yùn)維開(kāi)銷

Codis集群配置需要使用Zk或Etcd,這意味著引入Codis集群又要引入其他中間件,增加運(yùn)維機(jī)器資源成本。

優(yōu)點(diǎn)

Codis將分布式一致性的問(wèn)題交給了第三方(ZK或Etcd)負(fù)責(zé),省去了這方面的維護(hù)工作,降低實(shí)現(xiàn)代碼的復(fù)雜性,

Redis官方的Cluster為了實(shí)現(xiàn)去中心化,引入了Raft與Gossip協(xié)議,以及大量需要調(diào)優(yōu)的配置參數(shù),復(fù)雜度驟增。

批量獲取

對(duì)于批量操作,例如使用 mget 獲取多個(gè)key的值,這些key可能分散在多個(gè)實(shí)例中,Codis將key按照所在的實(shí)例進(jìn)行分組,然后對(duì)每個(gè)實(shí)例挨個(gè)調(diào)用 mget,最后匯總返回給客戶端。

如何深入了解Redis中的Codis

其他功能

Codis 提供 Dashboard 界面化,以及 Codis-fe 對(duì)集群進(jìn)行管理,還可以進(jìn)行增加分組、節(jié)點(diǎn)、執(zhí)行自動(dòng)均衡等操作,查看 slot 狀態(tài)以及 slot 對(duì)應(yīng)的 redis 實(shí)例,這些功能使的運(yùn)維更加方便輕松。

如何深入了解Redis中的Codis

如何深入了解Redis中的Codis

如何深入了解Redis中的Codis

如何深入了解Redis中的Codis

Codis是為了彌補(bǔ)Redis官方?jīng)]有提供集群這一概念時(shí)出現(xiàn)的,現(xiàn)在Redis官方提供Cluster功能,官方的支持自然比第三方的更有優(yōu)勢(shì),

同時(shí)第三方軟件還需要實(shí)時(shí)關(guān)注官方發(fā)布的新特性各種,而Cluster肯定是實(shí)時(shí)兼容新特性,因此更推薦使用官方的Cluster,Codis作為曾經(jīng)的一個(gè)知識(shí)點(diǎn)了解,某些思想與Cluster是有重合的。

關(guān)于如何深入了解Redis中的Codis就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁(yè)題目:如何深入了解Redis中的Codis
網(wǎng)頁(yè)鏈接:http://muchs.cn/article28/ihjccp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)、定制網(wǎng)站、企業(yè)網(wǎng)站制作、電子商務(wù)網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)