摘要:什么是一個(gè)分布式解決方案,多個(gè)節(jié)點(diǎn)構(gòu)成的集群上層應(yīng)用可以像使用單機(jī)的一樣使用,底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的數(shù)據(jù)遷移等工作實(shí)例的計(jì)算能力匯集到一起,從而完成關(guān)于大數(shù)據(jù)和高并發(fā)量的的讀寫操作組成部分,處理客戶端請(qǐng)求,支持協(xié)議,因此客戶端訪問
什么是Codis
一個(gè)分布式 Redis 解決方案,多個(gè) Redis 節(jié)點(diǎn)構(gòu)成的集群
上層應(yīng)用可以像使用單機(jī)的 Redis 一樣使用,Codis 底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的數(shù)據(jù)遷移等工作
Redis 實(shí)例的CPU計(jì)算能力匯集到一起,從而完成關(guān)于大數(shù)據(jù)和高并發(fā)量的的讀寫操作
組成部分Codis Proxy (codis-proxy),處理客戶端請(qǐng)求,支持Redis協(xié)議,因此客戶端訪問Codis Proxy跟訪問原生Redis沒有什么區(qū)別;
Codis Dashboard (codis-config),Codis 的管理工具,支持添加/刪除 Redis 節(jié)點(diǎn)、添加/刪除 Proxy 節(jié)點(diǎn),發(fā)起數(shù)據(jù)遷移等操作。codis-config 本身還自帶了一個(gè) http server,會(huì)啟動(dòng)一個(gè) dashboard,用戶可以直接在瀏覽器上觀察 Codis 集群的運(yùn)行狀態(tài);
Codis Redis (codis-server),Codis 項(xiàng)目維護(hù)的一個(gè) Redis 分支,基于 2.8.21 開發(fā),加入了 slot 的支持和原子的數(shù)據(jù)遷移指令;
ZooKeeper/Etcd,Codis 依賴 ZooKeeper 來存放數(shù)據(jù)路由表和 codis-proxy 節(jié)點(diǎn)的元信息,codis-config 發(fā)起的命令都會(huì)通過 ZooKeeper 同步到各個(gè)存活的 codis-proxy;
codis-ha,通過codis開放的api實(shí)現(xiàn)自動(dòng)切換主從的工具。該工具會(huì)在檢測(cè)到master掛掉的時(shí)候?qū)⑵湎戮€并選擇其中一個(gè)slave提升為master繼續(xù)提供服務(wù)
Codis架構(gòu)生產(chǎn)環(huán)境部署:
1024個(gè)slot,落到64個(gè)group,每臺(tái)服務(wù)器包含8個(gè)group
一個(gè)codis集群 = 8臺(tái)物理機(jī) = 8臺(tái)物理機(jī) (每臺(tái):8個(gè)group)= 64個(gè)group (每個(gè)group:16個(gè)slot) = 1024個(gè)slot
一臺(tái)物理機(jī)運(yùn)行16個(gè)Redis實(shí)例,2個(gè)Redis一個(gè)Group,一臺(tái)master,一臺(tái)slave
主從模式一個(gè)Master可以有多個(gè)Slaves,主流是一主二仆
默認(rèn)配置下,master節(jié)點(diǎn)可以進(jìn)行讀和寫,slave節(jié)點(diǎn)只能進(jìn)行讀操作,寫操作被禁止
不要修改配置讓slave節(jié)點(diǎn)支持寫操作,沒有意義,原因一,寫入的數(shù)據(jù)不會(huì)被同步到其他節(jié)點(diǎn);原因二,當(dāng)master節(jié)點(diǎn)修改同一條數(shù)據(jù)后,slave節(jié)點(diǎn)的數(shù)據(jù)會(huì)被覆蓋掉
slave節(jié)點(diǎn)掛了不影響其他slave節(jié)點(diǎn)的讀和master節(jié)點(diǎn)的讀和寫,重新啟動(dòng)后會(huì)將數(shù)據(jù)從master節(jié)點(diǎn)同步過來
master節(jié)點(diǎn)掛了以后,不影響slave節(jié)點(diǎn)的讀,Redis將不再提供寫服務(wù),master節(jié)點(diǎn)啟動(dòng)后Redis將重新對(duì)外提供寫服務(wù)。
master節(jié)點(diǎn)掛了以后,不會(huì)slave節(jié)點(diǎn)重新選一個(gè)master(缺點(diǎn))
哨兵模式sentinel模式是建立在主從模式的基礎(chǔ)上,如果只有一個(gè)Redis節(jié)點(diǎn),sentinel就沒有任何意義
當(dāng)master節(jié)點(diǎn)掛了以后,sentinel會(huì)在slave中選擇一個(gè)做為master,并修改它們的配置文件,其他slave的配置文件也會(huì)被修改,比如slaveof屬性會(huì)指向新的master
當(dāng)master節(jié)點(diǎn)重新啟動(dòng)后,它將不再是master而是做為slave接收新的master節(jié)點(diǎn)的同步數(shù)據(jù)
sentinel因?yàn)橐彩且粋€(gè)進(jìn)程有掛掉的可能,所以sentinel也會(huì)啟動(dòng)多個(gè)形成一個(gè)sentinel集群
當(dāng)主從模式配置密碼時(shí),sentinel也會(huì)同步將配置信息修改到配置文件中,不許要擔(dān)心
一個(gè)sentinel或sentinel集群可以管理多個(gè)主從Redis
sentinel最好不要和Redis部署在同一臺(tái)機(jī)器,不然Redis的服務(wù)器掛了以后,sentinel也掛了
sentinel監(jiān)控的Redis集群都會(huì)定義一個(gè)master名字,這個(gè)名字代表Redis集群的master Redis
缺點(diǎn):
主從服務(wù)器的數(shù)據(jù)要經(jīng)常進(jìn)行主從復(fù)制,這樣造成性能下降
當(dāng)主服務(wù)器宕機(jī)后,從服務(wù)器切換成主服務(wù)器的那段時(shí)間,服務(wù)是不能用的
分片模式Codis會(huì)把所有的key分成1024個(gè)槽,這1024個(gè)槽對(duì)應(yīng)著的就是Redis的集群,這個(gè)在Codis中是會(huì)在內(nèi)存中維護(hù)著這1024個(gè)槽與Redis實(shí)例的映射關(guān)系。這個(gè)槽是可以配置,可以設(shè)置成 2048 或者是4096個(gè)
key的分配算法,先是把key進(jìn)行CRC32 后,得到一個(gè)32位的數(shù)字,然后再hash%1024后得到一個(gè)余數(shù),這個(gè)值就是這個(gè)key對(duì)應(yīng)著的槽,這槽后面對(duì)應(yīng)著的就是redis的實(shí)例
//Codis中Key的算法 hash = crc32(command.key) slot_index = hash % 1024 redis = slots[slot_index].redis redis.do(command)動(dòng)態(tài)擴(kuò)容
擴(kuò)容Redis實(shí)例步驟:新增Redis配置 => 啟動(dòng)新的Redis => 新建Group,將reids添加進(jìn)來 => 數(shù)據(jù)遷移
數(shù)據(jù)遷移步驟:
1、服務(wù)slot_1的group原為group 1,codis-config 現(xiàn)發(fā)起遷移指令 pre_migrate slot_1 to group 2,將slot_1狀態(tài)標(biāo)記為”pre_migrate”;
2、等待所有的proxy回復(fù)收到遷移指令;
3、將slot_1狀態(tài)標(biāo)記為”migrating”,服務(wù)slot_1的server group改為group2
4、codis-config不斷發(fā)送SLOTSMGRT命令給group1的redis ,直到slot_1所有的key遷移完成;
5、遷移過程中, 如果請(qǐng)求 slot_1 的 key 數(shù)據(jù), proxy 會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到group2上, proxy會(huì)先在group1上強(qiáng)行執(zhí)行一次 MIGRATE key 將這個(gè)鍵值提前遷移過來. 然后再到group2上正常讀取
6、將slot_1狀態(tài)標(biāo)記為”online”
slot_index = crc32(command.key) % 1024 if slot_index in migrating_slots: do_migrate_key(command.key) # 強(qiáng)制執(zhí)行遷移 redis = slots[slot_index].new_redis else: redis = slots[slot_index].redis redis.do(command)
自動(dòng)均衡策略:Codis 會(huì)在機(jī)器空閑的時(shí)候,觀察Redis中的實(shí)例對(duì)應(yīng)著的slot數(shù),如果不平衡的話就會(huì)自動(dòng)進(jìn)行遷移
Redis - Pipelinepipeline通過減少客戶端與redis的通信次數(shù)來實(shí)現(xiàn)降低往返延時(shí)時(shí)間,而且Pipeline 實(shí)現(xiàn)的原理是隊(duì)列,而隊(duì)列的原理是時(shí)先進(jìn)先出,這樣就保證數(shù)據(jù)的順序性
原生批量命令(例如mget,mset等)是原子性,Pipeline是非原子性的
原生批量命令是一個(gè)命令對(duì)應(yīng)多個(gè)key,Pipeline支持多個(gè)命令
原生批量命令是Redis服務(wù)端支持實(shí)現(xiàn)的,而Pipeline需要服務(wù)端與客戶端的共同實(shí)現(xiàn)
技術(shù)延伸:一致性Hash與Redis集群文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77785.html
閱讀 2314·2021-11-24 10:33
閱讀 1385·2019-08-30 15:43
閱讀 3275·2019-08-29 17:24
閱讀 3480·2019-08-29 14:21
閱讀 2219·2019-08-29 13:59
閱讀 1735·2019-08-29 11:12
閱讀 2811·2019-08-28 18:00
閱讀 1847·2019-08-26 12:17