team中的一個(gè)同學(xué)在其項(xiàng)目中使用了Redis作為緩存,將熱點(diǎn)數(shù)據(jù)存放在Redis中。為了提升性能,寫(xiě)Redis時(shí)采用了管道的方式,平時(shí)使用時(shí),Redis的性能、資源使用都能符合項(xiàng)目需求,但當(dāng)訪問(wèn)量增加的時(shí)候,Redis的QPS還能滿足要求,但CPU使用率高的時(shí)候已經(jīng)達(dá)到90%+,平時(shí)只有30%+,而眾所周知,Redis是單進(jìn)程的,只能占用1個(gè)CPU核,跑滿了也就100%,無(wú)法利用機(jī)器的多核,而當(dāng)CPU跑到100%時(shí),必然會(huì)造成性能瓶頸。怎么解決?
推薦:《Redis視頻教程》
方案一:
首先想到的是,增加Redis服務(wù)器的數(shù)量,在客戶端對(duì)存儲(chǔ)的key進(jìn)行hash運(yùn)算,存入不同的Redis服務(wù)器中,讀取時(shí),也進(jìn)行相同的hash運(yùn)算,找到對(duì)應(yīng)的Redis服務(wù)器,可以解決問(wèn)題,但是不好的地方:
第一,客戶端要改動(dòng)代碼;
第二、需要客戶端記住所有的Redis服務(wù)器的地址;
這個(gè)方案可以使用,但能不能不用改動(dòng)代碼就能實(shí)現(xiàn)擴(kuò)容呢?
方案二:
搭建一個(gè)集群,由于Redis服務(wù)器使用的版本低于3.0,不支持集群,只能通過(guò)使用代理,就想到了有名的Redis代理twemproxy。
twemproxy的性能也是杠杠滴,雖然是代理,但它對(duì)訪問(wèn)性能的影響非常小,連Redis作者都推薦它。
twemproxy使用方便,對(duì)于一個(gè)新手來(lái)說(shuō),不到一個(gè)小時(shí)就能學(xué)會(huì)使用,而且關(guān)鍵是不用改動(dòng)客戶端代碼,幾乎支持所有的Redis命令和管道操作,只需要改下客戶端的配置文件中配置的Redis的IP和PORT,由原來(lái)的Redis的IP和Port改成twemproxy服務(wù)的IP和PORT。
客戶端不需要考慮hash的問(wèn)題,這些twemproxy會(huì)做,客戶端就像操作一臺(tái)Redis一樣。
上面用了“幾乎”這個(gè)詞,因?yàn)橛行┟睿热?quot;keys *"就不支持
很快部署了好了twemproxy和后面跟著的四個(gè)Redis機(jī)器,壓測(cè)發(fā)現(xiàn),后面的四臺(tái)Redis的CPU使用率降下來(lái)了,但新問(wèn)題來(lái)了,twemproxy也是單進(jìn)程的!性能瓶頸又跑到twemproxy上來(lái)了!
方案三:
對(duì)Redis的訪問(wèn)分為寫(xiě)和讀,類(lèi)似生產(chǎn)者和消費(fèi)者, 再仔細(xì)分析,發(fā)現(xiàn)寫(xiě)的少,讀的相對(duì)多些,這就可以將讀寫(xiě)分離,寫(xiě)的往主的寫(xiě),讀的從備的讀,遇到的情況恰好是讀和寫(xiě)是兩個(gè)服務(wù),做到讀寫(xiě)分離通過(guò)改下配置信息就可以很簡(jiǎn)單的做到,,這樣分散了主Redis的壓力。
這里對(duì)Redis的訪問(wèn)壓力有好轉(zhuǎn),但不是長(zhǎng)久之計(jì),比如遇到舉辦活動(dòng), 數(shù)據(jù)量增大時(shí),還是會(huì)有性能的風(fēng)險(xiǎn)。
最終采用的方法是綜合方案二和三,如下圖所示:
這種方法對(duì)現(xiàn)有的服務(wù)改動(dòng)最小,可以有效緩解redis壓力的問(wèn)題
producer端和consumer端的twemproxy使用的hash算法要求一致,不然找不到key了。
如果把方案一也加進(jìn)來(lái),會(huì)比較復(fù)雜,暫時(shí)用不到。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com