資源描述:
《阿里云Redis數(shù)據(jù)庫(kù)技術(shù)解析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、阿里云Redis數(shù)據(jù)庫(kù)技術(shù)解析云棲社區(qū)微信號(hào)yunqiinsight功能介紹云棲社區(qū)是由阿里云負(fù)責(zé)運(yùn)營(yíng)、阿里巴巴技術(shù)協(xié)會(huì)和阿里巴巴集團(tuán)各技術(shù)團(tuán)隊(duì)提供內(nèi)容支持的開放式技術(shù)社區(qū)。8背景目前的阿里云redis不管主從版還是集群規(guī)格,slave作為備庫(kù)不對(duì)外提供服務(wù),只有在發(fā)生HA,slave提升為master后才承擔(dān)讀寫。這種架構(gòu)讀寫請(qǐng)求都在master上完成,一致性較高,但性能受到master數(shù)量的限制。經(jīng)常有用戶數(shù)據(jù)較少,但因?yàn)榱髁炕蛘卟l(fā)太高而不得不升級(jí)到更大的集群規(guī)格。為滿足讀多寫少的業(yè)務(wù)場(chǎng)景,最大化節(jié)約用戶成本,阿里云redis推出了讀寫分離規(guī)格,為用戶提供透明
2、、高可用、高性能、高靈活的讀寫分離服務(wù)。架構(gòu)目前的redis集群模式有redis-proxy,master,slave,HA等幾個(gè)角色,在讀寫分離中,新增readonlyslave角色承擔(dān)讀流量,slave作為熱備不提供服務(wù),架構(gòu)上保持對(duì)現(xiàn)有集群規(guī)格的兼容性。redis-proxy按權(quán)重將讀寫請(qǐng)求轉(zhuǎn)發(fā)到master或者某個(gè)readonlyslave上;HA負(fù)責(zé)監(jiān)控DB節(jié)點(diǎn)的健康狀態(tài),異常時(shí)發(fā)起主從切換或重搭readonlyslave,并更新路由。一般來(lái)說(shuō),根據(jù)master和readonlyslave的數(shù)據(jù)同步方式,可以有兩種架構(gòu):星型復(fù)制,鏈?zhǔn)綇?fù)制。星型復(fù)制8星型復(fù)
3、制就是將所有的readonlyslave直接和master保持同步,每個(gè)readonlyslave之間相互獨(dú)立,任何一個(gè)節(jié)點(diǎn)異常不影響到其他節(jié)點(diǎn),同時(shí)因?yàn)閺?fù)制鏈比較短,readonlyslave上的復(fù)制延遲比較小。redis是單進(jìn)程單線程模型,主從之間的數(shù)據(jù)復(fù)制也在主線程中處理,readonlyslave數(shù)量越多,數(shù)據(jù)同步對(duì)master的cpu消耗就越嚴(yán)重,集群的寫入性能會(huì)隨著readonlyslave的增加而降低。此外,星型架構(gòu)會(huì)讓master的出口帶寬隨著readonlyslave的增加而成倍增長(zhǎng)。master上較高的CPU和網(wǎng)絡(luò)負(fù)載又會(huì)抵消掉星型復(fù)制延遲較低的
4、優(yōu)勢(shì)??梢钥闯觯切蛷?fù)制架構(gòu)會(huì)帶來(lái)比較嚴(yán)重的擴(kuò)展問題,整個(gè)集群的性能會(huì)受限于master。8鏈?zhǔn)綇?fù)制鏈?zhǔn)綇?fù)制將所有的readonlyslave組織成一個(gè)復(fù)制鏈,如下圖所示,master只需要將數(shù)據(jù)同步給slave和復(fù)制鏈上的第一個(gè)readonlyslave。鏈?zhǔn)綇?fù)制解決了星型復(fù)制的擴(kuò)展問題,理論上可以無(wú)限增加readonlyslave的數(shù)量,隨著節(jié)點(diǎn)的增加整個(gè)集群的性能也可以基本上呈線性增長(zhǎng)。鏈?zhǔn)綇?fù)制的架構(gòu)下,復(fù)制鏈越長(zhǎng),復(fù)制鏈末端的readonlyslave和master之間的同步延遲就越大,考慮到讀寫分離主要使用在對(duì)一致性要求不高的場(chǎng)景下,這個(gè)缺點(diǎn)一般可以接受。
5、但是如果復(fù)制鏈中的某個(gè)節(jié)點(diǎn)異常,會(huì)導(dǎo)致下游的所有節(jié)點(diǎn)數(shù)據(jù)都會(huì)大幅滯后,更加嚴(yán)重的是這可能帶來(lái)全量同步,并且全量同步將一直傳遞到復(fù)制鏈的末端,這會(huì)對(duì)服務(wù)帶來(lái)一定的影響,為了解決這個(gè)問題,讀寫分離的redis都使用阿里云優(yōu)化后的binlog復(fù)制版本,最大程度的降低全量同步的概率。8結(jié)合上述的討論和比較,redis的讀寫分離選擇鏈?zhǔn)綇?fù)制的架構(gòu)。透明、兼容讀寫分離和普通集群規(guī)格一樣,都使用了redis-proxy做請(qǐng)求轉(zhuǎn)發(fā),多shard時(shí)部分命令使用存在一定的限制,但從主從升級(jí)單分片讀寫分離,或者從集群升級(jí)到多分片的讀寫分離集群可以做到完全兼容。8在集群模式下,有部分命令使
6、用必須限制所有key在同一個(gè)slot中。用戶和redis-proxy建立連接,redis-proxy會(huì)識(shí)別出客戶端連接發(fā)送過(guò)來(lái)的請(qǐng)求是讀還是寫,然后按照權(quán)重作負(fù)載均衡,將請(qǐng)求轉(zhuǎn)發(fā)到后端不同的DB節(jié)點(diǎn)中,寫請(qǐng)求轉(zhuǎn)發(fā)給master,讀操作轉(zhuǎn)發(fā)給readonlyslave(master默認(rèn)也提供讀,可以通過(guò)權(quán)重控制)。用戶只需要購(gòu)買讀寫分離規(guī)格的實(shí)例,直接使用任何客戶端即可直接使用,業(yè)務(wù)不用做任何修改就可以開始享受讀寫分離服務(wù)帶來(lái)的巨大性能提升,接入成本幾乎為0。高可用高可用模塊(HA)監(jiān)控所有DB節(jié)點(diǎn)的健康狀態(tài),為整個(gè)實(shí)例的可用性保駕護(hù)航,master宕機(jī)時(shí)自動(dòng)切換到新
7、主。如果某個(gè)readonlyslave宕機(jī),HA也能及時(shí)感知,然后重搭一個(gè)新的readonlyslave,下線宕機(jī)節(jié)點(diǎn)。8除HA之外,redis-proxy也能實(shí)時(shí)感知每個(gè)readonlyslave的狀態(tài)。在某個(gè)readonlyslave異常期間,redis-proxy會(huì)自動(dòng)降低這個(gè)節(jié)點(diǎn)的權(quán)重,如果發(fā)現(xiàn)某個(gè)readonlyslave連續(xù)失敗超過(guò)一定次數(shù)以后,會(huì)暫時(shí)屏蔽異常節(jié)點(diǎn),直到異常消失以后才會(huì)恢復(fù)其正常權(quán)重。redis-proxy和HA一起做到盡量減少業(yè)務(wù)對(duì)后端異常的感知,提高服務(wù)可用性。性能對(duì)于讀多寫少的業(yè)務(wù)場(chǎng)景,直接使用集群版本往往不是最合適的方案,現(xiàn)在