王勝,楊超,崔蔚,黃高攀,張明明(國網信息通信產業集團有限公司,北京 0009)(國網江蘇省電力公司信息通信分公司,南京 009)
?
基于MongoDB的分布式緩存①
王勝1,楊超1,崔蔚1,黃高攀2,張明明2
1(國網信息通信產業集團有限公司,北京 100029)
2(國網江蘇省電力公司信息通信分公司,南京 210029)
摘 要:電力信息化的發展對傳統電力信息系統的數據處理、并發請求及響應能力提出諸多挑戰.針對電力信息系統數據處理的特點,提出一種基于MongoDB數據庫的分布式緩存,并對該分布式緩存的運行機制、服務端架構和客戶端功能模塊的設計進行了分析與闡述.基于MongoDB的分布式緩存能夠有效地降低電力信息系統數據庫層的訪問負載量,提高系統的整體性能,它采用分布式文件存儲緩存數據,支持數據冗余備份和故障恢復功能,具有較高的可靠性和擴展性.基于MongoDB的分布式緩存已成功應用到電力某企業的項目管理系統中.
關鍵詞:數據緩存; MongoDB; 分布式緩存; 電力信息系統; NoSQL
隨著云計算技術的發展和電力企業信息化程度的不斷提高,電力信息系統的規模越來越龐大,積累的數據越來越多,系統面對海量數據的并發處理能力越來越重要,在信息系統架構中,數據庫層的訪問速度逐漸成為一大瓶頸.數據緩存是解決這一問題的關鍵技術,它能夠有效地降低數據庫的訪問負載,提高系統性能.但面對著海量的數據,簡單的數據緩存已無法滿足要求,這就需要使用分布式緩存技術,讓服務器更快地響應用戶的需求.分布式緩存技術伴隨著互聯網、云計算的發展浪潮出現了不少優秀的產品,如Memcached、JBoss Cache、OSCache、Ehcache、Redis等,覆蓋了數據存儲方面的各個方面,包含普通關系數據庫、非關系數據庫,內存數據庫,內存cache等多種實現方案.但這些產品在數據分布式存儲、冗余備份及故障恢復方面存在有一定的不足[1].Memcached不支持冗余備份,某一節點出現故障,則該節點上的數據將全部丟失,因此Memcached存在單點失效的問題.JBoss Cache支持兩種冗余策略:全局復制和Buddy復制,全局復制將數據復制給集群中所有節點,這樣能夠確保數據完整性,但它限制了系統的伸縮性; Buddy復制則挑選特定節點擔當備份數據節點,在備份節點失效時,無法啟動新的節點來替代.OSCache提供的集群功能比較局限,無法讓緩存中數據在各個節點間復制.Ehcache是一個Java語言開發的緩存系統,沒有提供冗余備份和故障恢復功能.Redis只使用單核,擴展性有限.
本文基于這一現狀研究并設計一種能夠支持數據分布式存儲、冗余備份及故障恢復的分布式緩存.
MongoDB是NoSQL數據庫的典型代表.它是一個高性能、可擴展、模式自由、面向文檔、基于分布式文件存儲的開源數據庫,采用C++語言編寫,旨在為Web應用提供可擴展的高性能數據存儲解決方案.
1.1MongoDB的主要特性
MongoDB的特點是高性能、易部署、易使用,存儲數據非常方便,它的主要特性有: 面向文檔存儲、支持完全索引、快速就地更新、支持動態查詢及查詢記錄分析、具備數據自動分片功能以支持云級擴展性、具備數據復制與故障切換功能以支撐高可靠性.除此之外,MongoDB還具有模式自由、支持Map/Reduce、提供分布式文件系統GridFS、支持多種編程語言、使用高效的二進制數據存儲、文件存儲格式為BSON[2].
1.2MongoDB的適用場景
MongoDB在鍵/值存儲與RDBMS系統間架起了一座橋梁,集兩者優勢于一身.MongoDB適合用于處理網站數據: 它支持數據的實時插入、更新與查詢,并具備實時數據存儲所需的可靠復制及高度伸縮性; MongoDB適合用于數據緩存: 它具有極高的數據處理性能,適合作為信息基礎設施的緩存層,由于數據持久化存儲在分布式文件中,在系統重啟之后可以避免底層數據源的過載訪問; MongoDB適合用于高伸縮性的場景,支持由數十臺、數百臺甚至更多的服務器來架構數據存儲服務,MongoDB內置MapReduce[3]引擎,可以將大批量數據分解,然后通過大量機器進行并行計算處理.
MongoDB的使用也存在一些限制,它并不適合用于高度事務性的場景,例如電力調度控制、電費在線繳納等.傳統的關系型數據庫更適用于需要大量原子性復雜事務的應用系統.MongoDB不適用于傳統的商業智能應用,針對特定問題的BI數據庫會產生高度優化的查詢方式,對于此類應用,數據倉庫可能是更合適的選擇.
當文件系統遭遇大規模數據訪問時,IO讀取往往成為性能瓶頸,導致過高的數據延遲.分布式緩存通過一定的規則及策略,采用鍵/值方式將數據分散存儲于不同的物理機器上,它是云存儲技術的一種,滿足云計算技術的高性能、大容量、高可靠及可擴展的特點,可以通過動態增加或者減少節點應對變化的數據負載,提供可預測的性能.分布式緩存的目標是降低數據源訪問次數,減免數據源訪問瓶頸的發生,進而提高應用系統的性能,同時用以支撐云環境下的海量數據緩存.
傳統基于內存數據庫的緩存組件通常只支持簡單的鍵值存儲,對緩存文件的類型、文件之間的關系的存儲和查詢不夠方便.MongoDB作為文檔數據庫,其自動分片機制對大規模分布式存儲的支持較好,尤其適合作為大規模非結構化文件的存儲緩存.
本文研究的分布式緩存采用MongoDB數據庫作為底層存儲,并結合數據緩存的特性擴展MongoDB驅動設計實現一套分布式緩存套件.
2.1分布式緩存運行機制

圖1 分布式緩存運行機制
首次請求應用數據時,應用系統調用數據源訪問模塊獲取數據,同時通過緩存客戶端將數據包裝并存儲至分布式緩存集群; 之后再請求同一應用數據時,應用系統直接通過緩存客戶端快速地查找分布式緩存集群中對應的數據并返回,而不必再請求數據源,從而緩解數據源訪問壓力,提高數據訪問性能.
2.2分布式緩存服務端架構
本文研究的分布式緩存服務端采用MongoDB數據庫的自動分片機制結合副本集部署[4]方式進行架構,以提高擴展性與可靠性.分布式緩存服務端架構見圖2.

圖2 分布式緩存服務端架構
2.2.1緩存數據分片機制
一個數據分片副本集由多個數據分片服務器構成,一個數據分片服務器對應一個mongod進程.mongod 是MongoDB的核心進程,它對應MongoDB的一個具體實例,用于緩存數據的存儲與處理,完成緩存數據的持久化[5].一個mongod實例可以承載多個數據庫,每個數據庫之間是完全獨立的,一個數據庫下包含有多個數據集合,數據集合下存放著具體的緩存數據.在自動分片機制下,緩存數據以chunk為單位進行存儲[6].可通過動態刪除和增加服務器節點來提升緩存的數目和效率.
2.2.2數據分片策略配置
配置服務器用于存儲分布式緩存集群中的元數據,包括每個數據分片服務器的信息及每個數據塊(chunk)的信息.集群中每一個配置服務器節點都保存了分布式緩存上所有的元數據信息[7].
2.2.3緩存一致性策略
該組件采用路由服務器作為連接應用集群與分布式緩存集群的門戶,它對用戶屏蔽了分布式緩存集群的內部細節,使分布式緩存集群看起來像是一個單一的應用,使得系統無需考慮緩存一致性問題.
2.2.4用戶認證
用戶認證用于確保客戶端與服務器端的數據安全訪問,它支持簡單的用戶/密碼認證方式,避免系統外用戶非法獲取緩存服務器數據,從而提高緩存服務器的安全性.
2.3分布式緩存客戶端設計
本文研究的分布式緩存客戶端采用模塊化思想和面向接口的方式設計,具有較好的可擴展性,主要功能是接收并包裝應用系統的緩存請求,將包裝后的緩存請求命令(包含應用數據等)發送至分布式緩存集群以處理,同時對應用數據的生命周期進行統一管理.分布式緩存客戶端由以下三大模塊構成: 緩存管理模塊、緩存模塊、緩存注解模塊.

圖3 分布式緩存客戶端功能模塊
2.3.1緩存管理模塊
緩存管理模塊負責初始化客戶端配置信息,建立、管理緩存對象以及協調各模塊間的工作.緩存管理模塊抽象一個統一的緩存管理接口CacheManager,在該接口中定義配置信息初始化、緩存對象加載、添加、移除等方法.分布式緩存管理器實現統一緩存管理接口,封裝MongoDB數據庫的DB對象,采用工廠模式實現一個分布式緩存管理器創建工廠,該工廠負責管理分布式緩存管理器對象的實例化過程,具有較高的可擴展性.
2.3.2緩存模塊
緩存模塊是整個分布式緩存客戶端的核心,它負責將業務應用數據包裝成緩存數據,并往分布式緩存集群發送緩存數據添加、移除、清空等操作指令,同時管理緩存數據的生命周期.緩存模塊針對各應用系統關注點的不同抽象出兩個接口: 緩存數據存取接口CacheAccess、緩存運行監視接口CacheMonitor,同時擴展這兩個接口提供一個統一緩存接口Cache.分布式緩存實現統一緩存接口,封裝MongoDB數據庫的數據集對象,借助該數據集對象完成緩存數據的管理功能.
分布式緩存數據包裝了業務應用數據,同時賦予該應用數據一定的生命期限,其生命周期管理結合了TTI(Time To Idle)與TTL(Time To Live)兩種機制[8],以滿足緩存數據與數據源數據的一致性要求[9].緩存數據生命周期管理采用客戶端延遲失效模式: 當分布式緩存客戶端獲取到緩存數據后,立即判斷該數據是否過期,如果已經過期,則刪除緩存數據并發布數據過期事件,如果未過期,則將緩存數據返回給用戶.通過該模式可以避免分布式緩存服務端上失效檢測線程的開銷,提高整個分布式緩存集群的運行性能.
2.3.3緩存注解模塊
分布式緩存客戶端基于AOP(Aspect Oriented Programming)思想提供一套緩存注解功能[10].通過該功能可以使開發人員更專注于業務邏輯處理,當需要緩存功能時,僅需配置一個攔截器并在業務方法上配置緩存注解即可.緩存注解包括兩個: 緩存數據加載@CacheFetch、緩存數據刷新@CacheRefresh.
(1)@CacheFetch標注在獲取業務數據的方法上.當應用系統調用具有此注解的業務方法時,會自動先從分布式緩存中獲取數據,如果取到數據就直接返回,如果未取到數據則執行業務方法,把執行結果返回,同時放入緩存.
(2)@CacheRefresh標注在業務數據更新的方法上.當應用系統調用具有此注解的業務方法時,會自動根據緩存注解配置信息刷新緩存中相應的數據.
基于MongoDB的分布式緩存方案已在電力某企業的EIC(Electricity Infrastructure of Common)公共平臺中實現,并應用于該企業的項目管理系統(基于EIC公共平臺開發)當中.EIC公共平臺在系統啟動時將運行時相對不易變動的數據庫數據放入分布式緩存中,以提高系統響應能力,這些數據包括數據字典、組織機構信息、用戶信息、模型配置信息等.項目管理系統的分布式緩存服務器使用2個數據分片節點來緩存數據,每個分片節點對應一個副本集,每個副本集由3臺數據分片服務器組成,目前該系統運行良好.
項目管理系統的"項目"模型關聯較多的配置信息,此處以該模型信息的獲取作為驗證點,使用Apache的JMeter2.9軟件進行多用戶并發訪問的性能測試.分別在不使用分布式緩存和使用分布式緩存兩種情況下對系統響應時間進行測試,針對每一種情況對應某一指定用戶數進行10次重復測試,取其平均時間作為系統響應時間,得到如圖4所示的驗證結果.

圖4 不同情況下項目管理系統響應時間對比
通過對上述的驗證結果分析,可以發現在相同并發用戶數條件下,使用分布式緩存比不使用分布式緩存系統響應時間明顯減少,而且當并發用戶數增加時,使用分布式緩存的系統響應時間曲線增長較為平緩.這說明基于MongoDB的分布式緩存對于項目管理系統的多用戶并發訪問系統性能的提高有較為顯著的作用.
同時,在上述驗證測試過程中發現,當緩存數據量較為龐大(超過分片節點間數據量差異閾值)時,緩存服務器能夠自動根據指定規則將數據分散存儲于兩個分片節點中,當分片節點數據量差異達到指定閾值時,緩存服務器能夠自動重新均衡數據分布; 驗證過程中嘗試手動停止副本集中的主節點,發現緩存服務器能夠自動選擇出一臺副節點接管主節點工作.這說明基于MongoDB的分布式緩存能夠有效地支持數據分布式存儲、冗余備份及故障恢復功能.
本文研究并設計了一種基于MongoDB的分布式緩存,簡要地介紹了MongoDB數據庫,從分布式緩存的運行機制、服務端架構、客戶端功能設計等方面進行了闡述.基于MongoDB的分布式緩存具有極高的數據存取速度,支持數據復制與故障切換功能,支持數據自動分片功能,能夠支撐海量數據緩存,有效地降低數據庫的訪問負載,提高系統性能.本文所提出的分布式緩存可以為電力企業中需要海量數據高性能并發訪問的信息化系統的緩存層設計提供參考.
參考文獻
1戚偉強.分布式緩存模式研究及其在金融系統中的應用[碩士學位論文].杭州:浙江大學,2008.
2王光磊.MongoDB數據庫的應用研究和方案優化.中國科技信息,2011,(20):93–94,96.
3Dean J,Ghemawat S.MapReduce: Simplified Data Processing on Large Clusters.Communications of The ACM,2008,51(1):107–113.
4紅丸.MongoDB管理與開發精要.北京:機械工業出版社,2012.
5李文逍,楊小虎.基于分布式緩存的消息中間件存儲模型.計算機工程,2010,36(13):93–95.
6 詹道楠.統一數據服務層框架緩存模塊的設計和實現[碩士學位論文].南京:南京大學,2012.
7李文中,陳道蓄,陸桑璐.分布式緩存系統中一種優化緩存部署的圖算法.軟件學報2010,21(7):1524–1535.
8黃世能,奚建清.分布訪問環境中的數據緩存體系研究.計算機工程與科學,2000,22(6):88–91.
9Gwertzman J,Seltzer M.World wide web cache consistency.USENIX 1996 Annual Technical Conference,1996.California: Harvard University,1996: 22–26.
10Pawlak R,Retaillé J,Seinturier L.Foundations of AOP for J2EE Development.New York: A Press,2005: 53–60.
Distributed Cache Based on MongoDB
WANG Sheng1,YANG Chao1,CUI Wei1,HUANG Gao-Pan2,ZHANG Ming-Ming21(State Grid Information Communication Industry Group Co.Ltd.,Beijing 100029,China)
2(State Grid Jiangsu Electric Power Company Information &Telecommunication branch,Nanjing 210029,China)
Abstract:With the development of State Grid’s information technology,new challenges are presented to the data processing,concurrent requests and responsiveness of conventional power information systems.According to the characteristics of power information system’s data processing,a distributed cache based on MongoDB is proposed in this paper.The operational mechanism,server-side architecture and the design of client’s function modules in distributed cache are analyzed and discussed.The distributed cache based on MongoDB can effectively reduce the payload on access to the database layer of power information system,and then improve the performance of power system as a whole.It adopts the distributed files to store the cache data with good reliability and scalability to support the function of data redundancy backup and failure recovery.Now the distributed cache based on MongoDB has been successfully applied to the Project Management System of one power corporation.
Key words:data cache; MongoDB; distributed cache; power information system; NoSQL
基金項目:①國家電網公司科技項目(SGJSXT00YWJS1400072)
收稿時間:2015-07-27;收到修改稿時間:2015-10-22