陳杰 龐濤 付志鵬 唐勇 楊維云
編者按
在數(shù)據(jù)呈爆炸性增長的時(shí)代,云計(jì)算與大數(shù)據(jù)技術(shù)的重要性不言而喻,對海量數(shù)據(jù)的挖掘、分析與應(yīng)用已成熱點(diǎn)。本次專題在著重探討電信運(yùn)營商該如何發(fā)掘大數(shù)據(jù)價(jià)值、拓展新型增值業(yè)務(wù)的基礎(chǔ)上,亦提出了大數(shù)據(jù)在金融、旅游等領(lǐng)域的具體應(yīng)用。此外,有關(guān)云緩存技術(shù)、大數(shù)據(jù)融合建設(shè)的研究在專題中也有所體現(xiàn),希望通過本次專題為云計(jì)算與大數(shù)據(jù)的發(fā)展提供一些思路與建議。
【摘 要】傳統(tǒng)的緩存處理機(jī)制難以滿足互聯(lián)網(wǎng)業(yè)務(wù)高并發(fā)、高性能的需求,因此提出了動(dòng)靜結(jié)合的多級云緩存架構(gòu),可支持大規(guī)模數(shù)據(jù)存儲(chǔ)和快速檢索查詢服務(wù),并基于一致性哈希算法,實(shí)現(xiàn)了對多分布式服務(wù)節(jié)點(diǎn)的統(tǒng)一管理和調(diào)度效率提升,最后通過在大規(guī)模游戲業(yè)務(wù)平臺(tái)開展的實(shí)踐,驗(yàn)證了平臺(tái)性能和訪問速度的大幅提升。
【關(guān)鍵詞】大規(guī)模游戲平臺(tái) 云緩存 數(shù)據(jù)存儲(chǔ)
中圖分類號:TP399 文獻(xiàn)標(biāo)識碼:A 文章編號:1006-1010(2016)05-0005-05
1 引言
近年來,以游戲、視頻為代表的移動(dòng)互聯(lián)網(wǎng)應(yīng)用高速發(fā)展。與傳統(tǒng)電信應(yīng)用相比,大型移動(dòng)互聯(lián)網(wǎng)應(yīng)用具有以下特點(diǎn):
(1)高并發(fā)、大流量:數(shù)以億計(jì)規(guī)模的高并發(fā)用戶,長時(shí)間的大流量訪問;
(2)海量數(shù)據(jù):存儲(chǔ)、管理海量數(shù)據(jù),需要使用大量服務(wù)器;
(3)用戶接入環(huán)境復(fù)雜:面向全球用戶提供服務(wù),用戶網(wǎng)絡(luò)環(huán)境千差萬別;
(4)短時(shí)間用戶增長迅速,急需大量資源;
(5)產(chǎn)品復(fù)雜多樣,需求快速變更。
為了滿足多網(wǎng)絡(luò)用戶快速接入需求,提升用戶體驗(yàn),傳統(tǒng)電信業(yè)務(wù)平臺(tái)多采用內(nèi)容分發(fā)(CDN,Content Delivery Network)緩存機(jī)制。但動(dòng)態(tài)緩存數(shù)據(jù)管理較為復(fù)雜,缺乏靈活性,無法滿足快速增長和超高的游戲業(yè)務(wù)峰值并發(fā)服務(wù)需求。
基于此,本文接下來將提出動(dòng)靜結(jié)合的多級云緩存框架,以適應(yīng)大規(guī)模移動(dòng)互聯(lián)網(wǎng)業(yè)務(wù)平臺(tái)的承載需求。在傳統(tǒng)CDN文件緩存基礎(chǔ)上引入Varnish靜態(tài)緩存、基于MAP的本地動(dòng)態(tài)緩存和Redis遠(yuǎn)程動(dòng)態(tài)緩存,構(gòu)建多級云緩存,并通過實(shí)踐證明其實(shí)現(xiàn)了高性能I/O吞吐能力,減少了服務(wù)器和核心數(shù)據(jù)庫的交互次數(shù),提高了接口訪問速度和并發(fā)量。同時(shí)將緩存處理邏輯封裝,面向應(yīng)用層業(yè)務(wù)需求統(tǒng)一開放接口,提高了上層應(yīng)用開發(fā)效率。
2 動(dòng)靜結(jié)合的云緩存架構(gòu)
常見的互聯(lián)網(wǎng)業(yè)務(wù)多采用分布式的內(nèi)容分發(fā)緩存機(jī)制。在中國電信、中國移動(dòng)、中國聯(lián)通網(wǎng)絡(luò)中部署服務(wù)器節(jié)點(diǎn),以某一節(jié)點(diǎn)為中心,實(shí)現(xiàn)多節(jié)點(diǎn)間的數(shù)據(jù)共享和同步。不同網(wǎng)絡(luò)的用戶可以就近接入CDN節(jié)點(diǎn),快速、高效地獲取應(yīng)用內(nèi)容。基于CDN機(jī)制的緩存架構(gòu)圖如圖1所示:
在實(shí)際業(yè)務(wù)運(yùn)營中,傳統(tǒng)的CDN緩存機(jī)制對動(dòng)態(tài)緩存數(shù)據(jù)管理較為復(fù)雜,缺乏靈活性。尤其是新業(yè)務(wù)上線時(shí),需要大量人力檢查并修改緩存文件,給業(yè)務(wù)快速部署和服務(wù)靈活提供帶來了嚴(yán)重的挑戰(zhàn)。
針對上述問題,本文提出了動(dòng)靜結(jié)合的云緩存架構(gòu),以滿足高并發(fā)的移動(dòng)互聯(lián)網(wǎng)業(yè)務(wù)承載需求。該架構(gòu)具備橫向擴(kuò)展能力,相對上層業(yè)務(wù)系統(tǒng)透明,可根據(jù)業(yè)務(wù)的發(fā)展,平滑擴(kuò)展存儲(chǔ)性能與容量,動(dòng)態(tài)滿足業(yè)務(wù)需求,有效地提升系統(tǒng)資源利用率。系統(tǒng)架構(gòu)如圖2所示:
中心數(shù)據(jù)庫采用關(guān)系型數(shù)據(jù)庫MySQL和非關(guān)系型數(shù)據(jù)庫MongoDB。本地動(dòng)態(tài)緩存采用MAP內(nèi)存處理技術(shù),遠(yuǎn)程動(dòng)態(tài)緩存采用Redis技術(shù);本地緩存和遠(yuǎn)程緩存之間通過事件驅(qū)動(dòng)模型實(shí)時(shí)更新和維護(hù)數(shù)據(jù);采用XML標(biāo)記語言,以標(biāo)準(zhǔn)格式封裝緩存處理邏輯以及各種查詢、數(shù)據(jù)同步、容災(zāi)備份等統(tǒng)一數(shù)據(jù)服務(wù)的業(yè)務(wù)邏輯,并以Java接口方式封裝成API,提供給相關(guān)業(yè)務(wù)統(tǒng)一調(diào)用。各種業(yè)務(wù)調(diào)用緩存機(jī)制后,輸出結(jié)果采用靜態(tài)緩存Varnish技術(shù)進(jìn)行加速,以提升效率。
通過對緩存處理邏輯的封裝,為應(yīng)用業(yè)務(wù)層提供了統(tǒng)一的存儲(chǔ)訪問接口,使開發(fā)人員從繁雜的緩存維護(hù)同步工作中解脫出來,專注于業(yè)務(wù)開發(fā),從而提高了開發(fā)效率,減少了由于緩存數(shù)據(jù)維護(hù)不一致而導(dǎo)致的系統(tǒng)漏洞和缺陷,提升了系統(tǒng)穩(wěn)定性。
3 關(guān)鍵技術(shù)方案
3.1 靜態(tài)緩存和動(dòng)態(tài)緩存機(jī)制
在靜態(tài)緩存方面,采用高性能的開源HTTP加速器Varnish技術(shù),緩存靜態(tài)頁面和一些重要業(yè)務(wù)的靜態(tài)數(shù)據(jù)。Varnish基于內(nèi)存進(jìn)行緩存,性能好,單臺(tái)服務(wù)并發(fā)可達(dá)到5000次/s。采用反向代理Web容器定期維護(hù)緩存數(shù)據(jù)。當(dāng)Tomcat服務(wù)器出現(xiàn)故障時(shí),可自動(dòng)切換到Varnish,提高了平臺(tái)的穩(wěn)定性。
在本地動(dòng)態(tài)緩存方面,將用戶訪問頻繁的靜態(tài)數(shù)據(jù)備份到本地基于MAP的內(nèi)存緩存中,以減少網(wǎng)絡(luò)I/O的消耗,提高平臺(tái)的并發(fā)量。
本地緩存中各集群節(jié)點(diǎn)的數(shù)據(jù)維護(hù)采用組播技術(shù)實(shí)現(xiàn)。所有節(jié)點(diǎn)均為對等模式,節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn),不存在主節(jié)點(diǎn)選舉。每個(gè)節(jié)點(diǎn)都維護(hù)一份集群成員表,新節(jié)點(diǎn)加入時(shí),通知集群其他成員更新成員列表,以便每個(gè)節(jié)點(diǎn)都能及時(shí)更新成員列表。如圖3所示,節(jié)點(diǎn)1、節(jié)點(diǎn)2、節(jié)點(diǎn)3分別維護(hù)一份成員列表,定期通過組播更新自己節(jié)點(diǎn)消息,當(dāng)節(jié)點(diǎn)4新加入集群組時(shí),向節(jié)點(diǎn)1、節(jié)點(diǎn)2和節(jié)點(diǎn)3組播自身的節(jié)點(diǎn)消息,節(jié)點(diǎn)1、節(jié)點(diǎn)2和節(jié)點(diǎn)3接收到該信息后,將節(jié)點(diǎn)4加入到其成員列表中。同時(shí),節(jié)點(diǎn)1、節(jié)點(diǎn)2和節(jié)點(diǎn)3也不斷向集群發(fā)送其節(jié)點(diǎn)消息,節(jié)點(diǎn)4接收后將依次更新成員列表信息,最終達(dá)到四個(gè)節(jié)點(diǎn)均擁有四個(gè)節(jié)點(diǎn)成員信息。當(dāng)任意機(jī)器數(shù)據(jù)發(fā)生變更時(shí),則將變更數(shù)據(jù)發(fā)送給其他機(jī)器,保證各機(jī)器數(shù)據(jù)的一致性。
遠(yuǎn)程動(dòng)態(tài)緩存采用Redis技術(shù)。與Memcached類似,Redis是一個(gè)key-value存儲(chǔ)系統(tǒng),它支持存儲(chǔ)的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set:有序集合)和Hash(哈希類型)等。
游戲業(yè)務(wù)實(shí)踐中,Redis緩存采用主從讀寫分離技術(shù)。在大并發(fā)業(yè)務(wù)需求(如游戲APP集中下載、活動(dòng)集中參與等)時(shí),使用多臺(tái)服務(wù)器作為Redis服務(wù)器,并采用“多級服務(wù)器集群架構(gòu)”和“主從模式”對服務(wù)器設(shè)備進(jìn)行管理。設(shè)定一個(gè)主服務(wù)器負(fù)責(zé)數(shù)據(jù)寫入,多臺(tái)從服務(wù)器負(fù)責(zé)數(shù)據(jù)讀取。主服務(wù)器和從服務(wù)器之間通過Redis server端實(shí)現(xiàn)數(shù)據(jù)同步。各Redis服務(wù)器也采用分布式,Redis客戶端負(fù)責(zé)選擇連接到哪臺(tái)服務(wù)器,無需人工干預(yù)。
通過分級動(dòng)態(tài)緩存技術(shù),極大提升了平臺(tái)的服務(wù)能力。游戲業(yè)務(wù)單臺(tái)服務(wù)器并發(fā)可達(dá)到7000次/s,命中率可達(dá)90%以上。
3.2 本地緩存與遠(yuǎn)程緩存機(jī)制
本地緩存保存一些常用的基本數(shù)據(jù)和少量列表信息,以減少調(diào)用遠(yuǎn)程緩存服務(wù)器及數(shù)據(jù)庫的壓力。同時(shí)為了控制內(nèi)存的占用量,在處理之前需要評估緩存信息大小。當(dāng)緩存的信息總量超過預(yù)設(shè)的內(nèi)存大小時(shí),使用近期最少使用(LRU,Least Recently Used)算法,對內(nèi)存中緩存的信息進(jìn)行替換。目前僅這一層的訪問命中率可高達(dá)90%以上,保證了接口的整體訪問速度在200ms以內(nèi)。
遠(yuǎn)程緩存主要用來保存數(shù)據(jù)庫各表之間的對應(yīng)關(guān)系,以代替?zhèn)鹘y(tǒng)的數(shù)據(jù)庫查詢功能,實(shí)現(xiàn)業(yè)務(wù)快速查詢和處理響應(yīng)。
為了實(shí)現(xiàn)緩存處理邏輯層的統(tǒng)一封裝,需要將多臺(tái)機(jī)器的緩存信息同步,實(shí)現(xiàn)本地緩存與遠(yuǎn)程緩存之間的信息更新。在游戲業(yè)務(wù)實(shí)踐中,通過事件驅(qū)動(dòng)模型實(shí)時(shí)更新/維護(hù)緩存數(shù)據(jù)。具體實(shí)現(xiàn)過程如圖4所示。
數(shù)據(jù)查詢采用本地緩存、遠(yuǎn)程緩存、核心層本地緩存、核心層遠(yuǎn)程緩存、數(shù)據(jù)庫的查詢流程。在遠(yuǎn)程緩存沒有命中時(shí),將查詢中心數(shù)據(jù)庫,查詢結(jié)果將保存在本地緩存和遠(yuǎn)程緩存中。在數(shù)據(jù)保存在本地緩存后,將以異步的方式發(fā)送給其它節(jié)點(diǎn)機(jī)器實(shí)現(xiàn)同步。
采用了創(chuàng)新的云緩存框架后,平臺(tái)業(yè)務(wù)應(yīng)用接口最高不超過300ms,90%在100ms以內(nèi),緩存刷新延遲不超過500ms。
3.3 改進(jìn)型的一致性哈希映射算法
普通的Hash方法在數(shù)據(jù)緩存處理時(shí)存在問題。例如,以key%N的方式將數(shù)據(jù)映射到具體的服務(wù)器物理節(jié)點(diǎn)上,其中key是數(shù)據(jù)的key,N是服務(wù)器節(jié)點(diǎn)數(shù)。如果有一個(gè)機(jī)器加入或退出這個(gè)集群,每一個(gè)服務(wù)器緩存節(jié)點(diǎn)都必須進(jìn)行數(shù)據(jù)遷移,數(shù)據(jù)的緩存命中率將大幅降低。
本文采用改進(jìn)型的一致性哈希算法,以降低緩存節(jié)點(diǎn)變化對緩存命中率的影響。如圖5所示,實(shí)際部署4個(gè)物理節(jié)點(diǎn),將數(shù)據(jù)按照key的哈希值分布到100個(gè)虛擬節(jié)點(diǎn)上,以N=Hash(key)%100的方式計(jì)算分配每個(gè)物理節(jié)點(diǎn),配置Hash值權(quán)重。N為0~19時(shí),則數(shù)據(jù)落到Node1節(jié)點(diǎn)上;N為20~39時(shí),則數(shù)據(jù)落到Node2節(jié)點(diǎn)上;N為40~59時(shí),則數(shù)據(jù)落到Node3節(jié)點(diǎn)上;N為60~99時(shí),則數(shù)據(jù)落到Node4節(jié)點(diǎn)上。
如圖6所示,如果Node4節(jié)點(diǎn)負(fù)載過大,則添加Node5節(jié)點(diǎn),調(diào)整中只會(huì)影響Node4節(jié)點(diǎn)的緩存命中率,從而實(shí)現(xiàn)緩存節(jié)點(diǎn)平滑地添加與刪除。
4 應(yīng)用效果
本文的研究成果在中國電信愛游戲業(yè)務(wù)平臺(tái)中開展了應(yīng)用實(shí)踐。
在未采用云緩存機(jī)制前,愛游戲業(yè)務(wù)采用互聯(lián)網(wǎng)傳統(tǒng)處理機(jī)制,利用關(guān)系型數(shù)據(jù)庫保存業(yè)務(wù)的基礎(chǔ)數(shù)據(jù)、用戶訪問日志以及經(jīng)營分析數(shù)據(jù)等。在實(shí)際業(yè)務(wù)運(yùn)營中,該架構(gòu)無法滿足高并發(fā)、高性能要求。以用戶下載為例,緩存的命中率較低(僅為30%),實(shí)測的平均下載速度小于100kb/s,請求返回延時(shí)較大,特別是在服務(wù)高峰期,經(jīng)常出現(xiàn)服務(wù)超時(shí)、連接不成功等問題,用戶體驗(yàn)較差,流失率增高。
在采用本文提出的云緩存架構(gòu)進(jìn)行平臺(tái)升級后,靜態(tài)緩存命中率達(dá)95%,動(dòng)態(tài)數(shù)據(jù)緩存命中率達(dá)90%,中心數(shù)據(jù)庫僅需處理其中5‰的業(yè)務(wù)量。中心數(shù)據(jù)庫無需直接面對用戶請求,服務(wù)能力提升了200倍,大幅提高了整個(gè)系統(tǒng)的吞吐量。對于一個(gè)復(fù)雜的列表頁面請求,原機(jī)制下響應(yīng)時(shí)間需800ms左右。升級后命中一級緩存(靜態(tài)頁面),響應(yīng)時(shí)間不到10ms,加快了數(shù)據(jù)訪問速度,提升了用戶體驗(yàn)。
5 結(jié)束語
隨著移動(dòng)互聯(lián)網(wǎng)業(yè)務(wù)的快速增長,迫切需要使用緩存技術(shù)優(yōu)化提升平臺(tái)性能。本文利用Varnish、Redis等開源互聯(lián)網(wǎng)技術(shù),構(gòu)建了動(dòng)態(tài)緩存和靜態(tài)緩存相結(jié)合、本地緩存和遠(yuǎn)端緩存相結(jié)合的多級云緩存體系,可大幅提升業(yè)務(wù)平臺(tái)承載能力,滿足海量數(shù)據(jù)存儲(chǔ)和用戶高并發(fā)量訪問的需求。研究成果已應(yīng)用于愛游戲平臺(tái)優(yōu)化升級,提高了緩存命中率、減少了中心數(shù)據(jù)庫的I/O訪問壓力、降低了用戶的訪問時(shí)間、提升了用戶體驗(yàn)。
參考文獻(xiàn):
[1] 邱祝文. 基于redis的分布式緩存系統(tǒng)架構(gòu)研究[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用, 2014(10): 52.
[2] 王心妍. Memcached和Redis在高速緩存方面的應(yīng)用[J]. 無線互聯(lián)科技, 2012(9): 8-9.
[3] 曾泉?jiǎng)? 基于Redis的分布式消息服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué), 2014.
[4] 秦秀磊,張文博,魏峻,等. 云計(jì)算環(huán)境下分布式緩存技術(shù)的現(xiàn)狀與挑戰(zhàn)[J]. 軟件學(xué)報(bào), 2013,24(1): 50-66.
[5] 賀琛,陳肇雄,黃河燕,等. Web緩存技術(shù)綜述[J]. 小型微型計(jì)算機(jī)系統(tǒng), 2004,25(5): 836-842.
[6] 趙玉偉,趙小雨,喬木,等. 緩存技術(shù)在B/S架構(gòu)信息系統(tǒng)中的應(yīng)用[J]. 計(jì)算機(jī)工程, 2008,34(1): 233-235.
[7] 楊傳棟,余鎮(zhèn)危,王行剛,等. 一種流媒體CDN的內(nèi)容部分推送策略[J]. 計(jì)算機(jī)工程與應(yīng)用, 2007,43(25): 162-164.
[8] 周江. 面向大數(shù)據(jù)分析的分布式文件系統(tǒng)關(guān)鍵技術(shù)[J]. 計(jì)算機(jī)研究與發(fā)展, 2014(2): 382-394.
[9] 戴偉,胡鵬. 基于緩存回收的成本節(jié)約云服務(wù)算法研究[J]. 計(jì)算機(jī)應(yīng)用研究, 2015,32(10): 3138-3141.
[10] 方暉. 基于能效控制的DctAF框架式云緩存技術(shù)[J]. 科技通報(bào), 2014(2): 77-79. ★
作者簡介
陳杰:高級工程師,現(xiàn)任職于炫彩互動(dòng)網(wǎng)絡(luò)科技有限公司,研究方向?yàn)榛ヂ?lián)網(wǎng)大型業(yè)務(wù)平臺(tái)技術(shù)架構(gòu)、大數(shù)據(jù)技術(shù)框架、通信技術(shù)和移動(dòng)互聯(lián)網(wǎng)等。
龐濤:工程師,現(xiàn)任職于中國電信股份有限公司廣州研究院,主要研究方向?yàn)榇髷?shù)據(jù)、業(yè)務(wù)平臺(tái)承載技術(shù)、云應(yīng)用技術(shù)等。
付志鵬:工程師,現(xiàn)任職于炫彩互動(dòng)網(wǎng)絡(luò)科技有限公司,主要研究方向?yàn)榇髷?shù)據(jù)、移動(dòng)互聯(lián)網(wǎng)等。