王心妍,毛莉君(西安培華學(xué)院,陜西西安,710125)
?
基于Twemproxy的Redis集群解決方案的設(shè)計與實現(xiàn)
王心妍,毛莉君
(西安培華學(xué)院,陜西西安,710125)
摘要:當(dāng)傳統(tǒng)數(shù)據(jù)庫面臨大規(guī)模數(shù)據(jù)訪問時,磁盤I/O往往成為性能瓶頸,從而導(dǎo)致過高的響應(yīng)延遲。本文基于Rdeis緩存技術(shù),構(gòu)建一個分布式緩存系統(tǒng),為應(yīng)用系統(tǒng)提供高可用性,高性能、高可靠性的分布式緩存系統(tǒng)。
關(guān)鍵詞:Redis集群;Twemproxy;Redis Cluster
本文系陜西省教育廳2015年專項科研計劃項目“基于Android平臺的電商微信服務(wù)系統(tǒng)的開發(fā)”(項目編號:15JK2094)的研究成果。
隨著移動4G的飛速發(fā)展,越來越多的人參與網(wǎng)絡(luò)應(yīng)用,在服務(wù)器面臨海量請求壓力的同時,用戶對請求響應(yīng)時間則提出了更高的要求,傳統(tǒng)磁盤持久化數(shù)據(jù)庫根本無法應(yīng)對這樣的需求,內(nèi)存數(shù)據(jù)庫則應(yīng)運而生。
Redis是內(nèi)存數(shù)據(jù)庫中的佼佼者,是基于內(nèi)存的開源的高性能Key/Value數(shù)據(jù)庫,不僅支持多種數(shù)據(jù)結(jié)構(gòu)和主從復(fù)制,還支持?jǐn)?shù)據(jù)的持久化,即使服務(wù)器異常重啟也不會導(dǎo)致內(nèi)存數(shù)據(jù)的全部丟失。
原生的Redis是單進(jìn)程單線程的,在處理超大數(shù)據(jù)請求時就造成其他請求的阻塞,而且如果單個Redis實例占用的容量過大,則會影響出現(xiàn)故障時服務(wù)的恢復(fù)速度以及平常的運行維護(hù)操作。因此僅僅使用單個Redis實例是無法滿足生產(chǎn)環(huán)境中的I/O操作、穩(wěn)定性、安全性、可靠性等方面的要求,所以我們需要考慮搭建一個穩(wěn)定、可靠、高性能的Redis分布式集群來滿足現(xiàn)實生產(chǎn)的需要,并滿足用戶對高一致性、可用性、分區(qū)容忍性的要求。
當(dāng)單機(jī)Redis無法承受系統(tǒng)所產(chǎn)生的超量數(shù)據(jù)時,就需要依靠分布式的多機(jī)系統(tǒng)來解決。在對用戶透明的情況下,分布式系統(tǒng)為數(shù)據(jù)配置多個副本,當(dāng)其中一臺或多臺機(jī)器宕機(jī),卻不會丟失數(shù)據(jù)或者影響用戶的訪問,其可靠性安全性遠(yuǎn)遠(yuǎn)高于單機(jī),當(dāng)然對于高并發(fā)請求的處理也完勝單機(jī)系統(tǒng)。
目前各大互聯(lián)網(wǎng)公司為解決Redis單機(jī)承載能力不足的問題,自主研發(fā)并實現(xiàn)了自己的Redis分布式集群化方案。在這些非官方集群解決方案中,物理上把數(shù)據(jù)“分片”(sharding)存儲在多個Redis實例中,一般情況下,每一“片”就是一個Redis實例。目前Redis分布式集群方案主要有三種實現(xiàn)機(jī)制:客戶端分片、代理分片和Redis Cluster。
1.1 客戶端分片
客戶端分片(Pre-sharding)方案就是將分片工作放在業(yè)務(wù)的程序端,程序代碼根據(jù)預(yù)先設(shè)置的路由規(guī)則,直接對多個Redis實例進(jìn)行分布式訪問。該方案集中在客戶端,在客戶端預(yù)先對 key 進(jìn)行 hash 取模,然后選擇后端的 Redis實例,不依賴于第三方分布式中間件,要求開發(fā)者完全做自己的定制,實現(xiàn)方法和代碼都自己掌控,可以隨時調(diào)整,但是一旦遇到后端Redis分片變化時,則需要通知所有的客戶端來更新版本或修改配置,導(dǎo)致系統(tǒng)不容易控制。
因為少了一個中間分發(fā)環(huán)節(jié),這種靜態(tài)分片技術(shù)在性能上比代理式優(yōu)秀,但是其每一個Redis實例的增減,都得程序員手工調(diào)整分片程序來實現(xiàn),這就造成了其對研發(fā)人員超強(qiáng)的依賴性,需要有較強(qiáng)的程序開發(fā)能力做后盾。一旦公司的主力程序員離職,就可能會使新的負(fù)責(zé)人重新來定制,而且系統(tǒng)的升級相對也比較麻煩。所以這種方式下,系統(tǒng)的可運維性較差。出現(xiàn)故障,定位和解決都得研發(fā)和運維配合著解決,故障時間變長?;诖朔制瑱C(jī)制的開源產(chǎn)品,現(xiàn)在仍不多見。
1.2 代理分片
代理分片方案(Proxy)就是在Redis集群上添加一個代理層,將分片工作交給專門的代理程序來做。代理程序接收到來自業(yè)務(wù)程序的數(shù)據(jù)請求,根據(jù)路由規(guī)則,將這些請求分發(fā)給正確的Redis實例并返回給業(yè)務(wù)程序。在這種機(jī)制下,一般會選用第三方代理程序(而不是自己研發(fā)),因為后端有多個Redis實例,所以這類程序又稱為分布式中間件。這樣的好處是,業(yè)務(wù)程序不用關(guān)心后端Redis實例,運維起來也方便。雖然會因此帶來些性能損耗,但對于Redis這種內(nèi)存讀寫型應(yīng)用,相對而言是能容忍的。
該方案應(yīng)用最具代表性的就是Twitter的開源產(chǎn)品Twemproxy,其性能相當(dāng)不錯,是目前應(yīng)用范圍最廣、穩(wěn)定性最高、最久經(jīng)考驗的分布式中間件。Twemproxy作為代理,可接受來自多個客戶端程序的訪問,按照路由規(guī)則,轉(zhuǎn)發(fā)給后臺的各個Redis服務(wù)器,再原路返回,有效地解決了單個Redis實例承載能力的問題。當(dāng)然,Twemproxy本身也是單點,需要用Keepalived做高可用方案。
該方案通過代理的方式減少了Redis服務(wù)器的連接數(shù),支持一致性Hash,通過配置的方式封禁失效的節(jié)點,運行多個 Proxy時,客戶端可以連接到首個可用的Proxy,支持請求的流式和批處理,可以降低請求的資源消耗,但是Twemproxy不支持自動的故障切換。
1.3 Redis Cluster
Redis Cluster和代理模式最大的不同之處在于沒有中心節(jié)點。Redis Cluster將所有Key映射到16384個Slot中,集群中每個Redis實例負(fù)責(zé)一部分,業(yè)務(wù)程序通過集成的Redis Cluster客戶端進(jìn)行操作??蛻舳丝梢韵蛉我粚嵗l(fā)出請求,如果所需數(shù)據(jù)不在該實例中,則該實例引導(dǎo)客戶端自動去對應(yīng)實例讀寫數(shù)據(jù),因此Redis進(jìn)程既負(fù)責(zé)讀寫數(shù)據(jù)又負(fù)責(zé)集群交互,致使其嚴(yán)格依賴客戶端driver的成熟度。而且Redis Cluster的節(jié)點名稱、IP、端口、狀態(tài)、角色等的管理,都是通過節(jié)點之間兩兩通訊,定期交換并更新,集群建立以及運行中新增結(jié)點時,都要通過手動執(zhí)行meet命令或redis-trib.rb腳本添加到集群中,缺少結(jié)點的自動發(fā)現(xiàn)和自動Resharding功能。雖說它比代理分片少了中間件,理論上會更高效,但其是否完全適合現(xiàn)實的生產(chǎn)環(huán)境,還需要實踐慢慢驗證。因此,本文主提出基于twemproxy搭建高可用的Redis集群解決方案。
Twemproxy是由Twitter開發(fā)的開源Redis集群解決方案,其性能不錯,也很適合現(xiàn)實的生產(chǎn)應(yīng)用,但它不支持自動的故障切換。本方案對原生的Twemproxy方案進(jìn)行了改進(jìn),其結(jié)構(gòu)圖如下:
客戶端通過虛擬IP訪問Redis,只需要用keepalived的虛擬IP地址和端口而不需要修改RedisClient代碼。keepalived提供VIP漂移,避免Twemproxy的單點故障 ,減少與Redis的直接連接數(shù),支持失敗節(jié)點自動刪除。keeypalived集群保證一個掛機(jī),其他的可以繼續(xù)服務(wù),其中每個keepalive又連接多個Twemproxy(默認(rèn)是連接主Twemproxy, 主代理掛機(jī)了,會去連接從Twemproxy)。Twemproxy的每個節(jié)點都連接Redis的主服務(wù),Redis的主從服務(wù)器,一般分開機(jī)器存儲,保證機(jī)器故障而數(shù)據(jù)不丟失。Sentinel起到一個監(jiān)控的作用,一旦發(fā)現(xiàn)主Redis掛機(jī)了,就會自動切換將從Redis變?yōu)橹鱎edis,以實現(xiàn)Redis的高可用性。Twemproxy_agent的作用是:如果sentinel發(fā)現(xiàn)變化,agent會去修改Twemproxy 的配置文件,然后重啟Temproxy服務(wù)。
該方案中平行部署多個代理層,客戶端可以自動選擇可用的一個,Redis集群對客戶端透明,每一個Redis劃分主、從服務(wù)器,并交叉分開存儲以確保數(shù)據(jù)的安全,支持狀態(tài)監(jiān)控,實現(xiàn)了高吞吐量。
參考文獻(xiàn)
[1]黃健宏. Redis設(shè)計與實現(xiàn)[M].北京:機(jī)械工業(yè)出版社,2014:1-300
[2]邱祝文.基于Redis的分布式緩存系統(tǒng)架構(gòu)研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014.10
Design and implementation of Redis cluster solution based on Twemproxy
Wang Xinyan,Mao Lijun
(Xi'an Peihua University,Xi'an,Shaanxi,710125)
Abstract:When the traditional database facing massive data access,disk I/O often become a performance bottleneck,resulting in high response delay.In this paper,Rdeis cache technology based on building a distributed cache system, provide high availability for application system,distributed caching system with high performance and high reliability.
Keywords:Redis Twemproxy;Redis Cluster cluster