唐 攀,朱志祥,梁小江,蔡曉龍
(1.西安郵電大學(xué)計算機學(xué)院,西安 710061;2.西安未來國際信息股份有限公司,西安 710065;3.洛陽師范學(xué)院軟件職業(yè)技術(shù)學(xué)院,河南 洛陽 471023)
基于OpenStack Sahara集群的高可用性的設(shè)計與實現(xiàn)
唐 攀1,朱志祥1,梁小江2,蔡曉龍3
(1.西安郵電大學(xué)計算機學(xué)院,西安 710061;2.西安未來國際信息股份有限公司,西安 710065;3.洛陽師范學(xué)院軟件職業(yè)技術(shù)學(xué)院,河南 洛陽 471023)
針對目前大數(shù)據(jù)處理環(huán)境成本高,存在點單故障等問題,使用OpenStack Sahara可以將云計算與大數(shù)據(jù)結(jié)合起來.設(shè)計出一種基于OpenStack Sahara集群的高可用性方案,驗證結(jié)果顯示,該方案解決了單點故障問題,實現(xiàn)了自動故障切換,保證了集群的高可用性,從而提高了Sahara集群的性能.
單點故障;OpenStack;Sahara;高可用性;故障切換
隨著云計算和大數(shù)據(jù)的發(fā)展,帶動了數(shù)據(jù)分析的發(fā)展,將大數(shù)據(jù)放在云平臺上,用云計算來進行大數(shù)據(jù)分析處理,其中以Hadoop應(yīng)用為代表的大數(shù)據(jù)分析,是最適合在云平臺上運行的業(yè)務(wù)之一.Open-Stack作為當今的主流云平臺之一,OpenStack和Hadoop的結(jié)合即OpenStack Sahara作為開源云計算與大數(shù)據(jù)結(jié)合的方案之一,可以快速提供了一個Hadoop集群環(huán)境,并且使用戶對集群的管理和擴展變得十分方便,但是OpenStack Sahara集群中的NameNode(NN)存在單點故障(Single PointOf Failure,SPOF)問題,對于只有一個NN的集群,如果NN出現(xiàn)故障、宕機或者軟硬件升級,會造成整個集群的服務(wù)不可用,嚴重影響集群的整體性能,因此解決單點故障是提高Sahara集群性能的關(guān)鍵[1-3].
本文提出了一種OpenStack Sahara集群的高可用方案的設(shè)計與實現(xiàn),解決了Sahara集群NN的SPOC問題,若當前Active NN故障、宕機或者軟硬件升級維護,Sahara集群自動切換到Standby NN,提高了Sahara集群的可用性,從而提高整個Sahara集群的性能.
1.1 Openstack Sahara
OpenStack Sahara架構(gòu)如圖1所示.
圖1 OpenStack Sahara架構(gòu)
Horizon:提供GUI圖形化界面的方式使用OpenStack Sahara.
Keystone:認證用戶并提供安全令牌,用以與OpenStack通信和分配特定的OpenStack權(quán)限.
Nova:為Hadoop集群提供虛擬機.
Glance:Glance負責(zé)鏡像管理服務(wù).用于儲存Hadoop虛擬機鏡像,每個鏡像都包含了已安裝的OS和Hadoop.
Swift:Swift可以作為Sahara的輸入/輸出數(shù)據(jù)存儲,或者數(shù)據(jù)處理程序包存儲.
1.2 高可用性
在可靠性理論中,一般采用RAS(Reliability, Availability,Servieeability)來定義系統(tǒng)的健壯性和完整性.RAS代表可靠性、可用性、可維護性.系統(tǒng)運行狀態(tài),如圖2所示.
高可用性:即HA(High Availability)是指系統(tǒng)對外正常提供服務(wù)時間占服務(wù)啟動到當前為止時間的百分比.具體來說,HDFS的可靠性可用平均故障間隔(MTTF)來度量,即HDFS正常服務(wù)的平均運行時間;HDFS的可維護性用平均系統(tǒng)恢復(fù)時間(MTTR)來度量,即HDFS從不能正常服務(wù)到重新正常服務(wù)的平均恢復(fù)時間.因此HDFS的HA定義為:
圖2 系統(tǒng)運行狀態(tài)圖
由上面的定義可知,高可靠性更多地是對于系統(tǒng)自身而言,它是系統(tǒng)可靠程度的一個指標.而高可用性則更多地是從系統(tǒng)對外的角度來說的,除了包含系統(tǒng)正常工作的能力,它還強調(diào)系統(tǒng)中止服務(wù)后迅速恢復(fù)的能力;一個可靠性很高的系統(tǒng),如果其中止服務(wù)后,恢復(fù)時間很長,那么它的可用性也不會很高,而一個可靠性不是特別高的系統(tǒng),如果發(fā)生中止服務(wù)后,可迅速恢復(fù),那么其可用性也可能很高.因此只有高可用性才能準確度量系統(tǒng)對外正常服務(wù)的能力[4].
2.1 高可用架構(gòu)的設(shè)計
OpenStack Sahara集群的高可用設(shè)計方案[5],如圖3所示.
本HA方案,將NN配置在兩臺獨立的機器上.在任何時間,其中一個NN處于Active狀態(tài),而另一個處于Stanby狀態(tài).Active NN負責(zé)集群中所有的客戶端的操作,而Standby NN主要用于備用,它主要維持足夠多的狀態(tài),保證在必要的時候提供一個快速的故障轉(zhuǎn)移.
圖3 OpenStack Sahara集群的高可用設(shè)計方案
為了保證Active NN和Stanby NN節(jié)點狀態(tài)同步,即元數(shù)據(jù)一致性.DataNode(DN)需要向兩個NN發(fā)送block位置信息,還構(gòu)建了一組獨立的守護進程“JournalNodes”(JNs),用來記錄Edits信息.當Active NN修改任何的命名空間,都會通過這些JNs記錄日志(editLog);Standby NN可以監(jiān)控Edits日志的變化,并且通過JNs讀取Active NN發(fā)送過來的edits信息和更新其內(nèi)部命名空間.當故障轉(zhuǎn)移時,Standby NN需要保證從JNs中讀取到所有的Edits,然后切換成Active狀態(tài).這是為了保證NameSpace的狀態(tài)和遷移之前是完全同步的[6].
為了提供一個快速的故障轉(zhuǎn)移,Standby NN要求保存著最新的block的位置信息.DN都被配置了所有的NN的地址,并且發(fā)送block的位置信息和心跳給兩個NN.
在任何時候,集群都要保證只有一個活躍的NN,否則在兩個Active NN的命名空間下的狀態(tài)會出現(xiàn)分歧,導(dǎo)致數(shù)據(jù)丟失或者其他一些不可預(yù)見的錯誤.為了確保這個,防止所謂split-brain現(xiàn)象,在任何時候,JNs將只允許一個NN向其寫Edits信息.故障轉(zhuǎn)移期間,Standby NN成為活躍狀態(tài)的時候會接管JNs的寫權(quán)限,這會有效防止原來的NN持續(xù)處于活躍狀態(tài),允許新的Active NN安全地進行故障轉(zhuǎn)移.
該方案的具體設(shè)計:
1)集群中至少啟動3個JN(2N+1);
2)集群中每個NN上同時運行一個QuorumJournalManager(QJM)組件;通過Hadoop IPC(Inter Process Call)向JN寫入editLog;
3)當QJM寫editLog前,首先要保證沒有其他QJM在寫editLog,從而保證當發(fā)生腦裂時,editLog的寫入依然是安全的;這一點的實現(xiàn)是通過QJM成為寫者時(其NN成為Active節(jié)點時)分配惟一的epoch號,并廣播給所有JN,JN在執(zhí)行寫editLog操作前對請求者QJM的epoch號進行檢查;epoch號的申請也是經(jīng)過JN和QJM的仲裁同意的;
4)當QJM寫editLog前,同樣需要保證之前editLog在所有JN上一致;例如如果一個QJM寫過程中發(fā)生失敗,則幾個JN的editLog的尾部很可能不同,新的QJM成為寫者時,需要對這些不一致的editLog進行同步,仲裁后保證一致;
5)當QJM寫editLog時,只要JN中的大部分成功(若JN=2N+1則JN>=N+1寫成功),就算成功,可以繼續(xù)執(zhí)行后續(xù)操作;
6)Zookeeper FailoverController可以實現(xiàn)對Active/Standby NN的狀態(tài)監(jiān)控和主從選舉;
7)自動故障轉(zhuǎn)移
自動故障轉(zhuǎn)移,增加了兩個新組件到HDFS部署中:一個ZooKeeper仲裁和ZKFailoverController進程(ZKFC),來實現(xiàn)Active NN的選舉和實現(xiàn)故障的自動轉(zhuǎn)移.
圖4 Sahara集群創(chuàng)建流程
2.2 本設(shè)計方案的實現(xiàn)
2.2.1 Sahara集群創(chuàng)建流程
Sahara集群創(chuàng)建流程如圖4所示.
首先用戶登錄OpenStack云平臺,創(chuàng)建自己的網(wǎng)絡(luò)和路由,其次上傳預(yù)裝Hadoop的虛擬機鏡像到OpenStack,用戶通過OpenStack dashboard界面上的Sahara來注冊鏡像,創(chuàng)建節(jié)點組模板,創(chuàng)建集群模板,創(chuàng)建Sahara集群.
2.2.2 HA配置
HA配置是向后兼容的,允許一個現(xiàn)有的單NN的集群配置不改變就可以工作,HA集群重用NameService的ID來標識一個HDFS集群,每一個NN都有一個不同的NN ID來區(qū)分彼此.為了支持所有NN使用相同配置文件,相關(guān)配置需要增加NameService ID和NN ID前綴.
配置HA NN必須增加一些配置項到hdfssite.xml配置文件中,這些配置項的順序不重要,但是dfs.nameservices和dfs.ha.namenodes.[nameservice ID]選項將決定下面的配置的key的名稱,因此你應(yīng)該先決定這兩個配置的值,再配其他的配置[7].
1)dfs.nameservices:命名空間的邏輯名稱.
2)dfs.ha.namenodes.[nameservice ID]:命名空間中每個NN的惟一的標識符.可配置多個,使用逗號分隔.當前,每個集群最多只能配置兩個NN.
3)dfs.namenode.rpc-address.[nameservice ID].[name node ID]:每個NN監(jiān)聽的RPC地址.
4)dfs.namenode.http-address.[nameservice ID].[name node ID]:每個NN的監(jiān)聽的http地址.
5)dfs.namenode.shared.edits.dir:標識兩個NN將分別讀/寫edit log的一組JNs的URL.URL格式:qjournal://host1:port1;host2:port2;host3:port3/journalId.這里host1、host2、host3指的是JN的地址,必須是奇數(shù)個,至少3個;其中journalId是集群的唯一標識符.
6)dfs.client.failover.proxy.provider.[nameservice ID]:HDFS客戶端用來連接Active NN的Java類. HDFS客戶端決定哪一個NN當前是Active的Java類,從而決定哪個NN服務(wù)于客戶端請求.目前只有一個實現(xiàn)configuredFailoverProxyProvider.
7)dfs.ha.fencing.methods:腳本或Java類的列表,它們將在一次故障轉(zhuǎn)移期來保護Active NN.在任意時刻必須保證只有一個NN處在Active狀態(tài).
故障轉(zhuǎn)移使用的fencingmethods方式:shell和sshfence.
(1)sshfence:SSH到Active NN然后殺掉該進程.
sshfence選擇SSH到目標節(jié)點,然后用fuser命令殺掉在服務(wù)TCP端口上的進程.為了使fencing option工作,它必須能夠免密碼SSH到目標節(jié)點.因此,必須配置dfs.ha.fencing.ssh.private-key-files選項.
(2)shell:運行任意的shell命令來fence Active NN
若shell命令結(jié)束返回0,fence成功;若返回任何其他的結(jié)束碼,fence失敗
8)在core-site.xml中配置fs.defaultFS
fsdefaultFS:Hadoop文件系統(tǒng)客戶端使用的默認的路徑前綴.
可選地,為Hadoop客戶端配置了默認使用的路徑來啟用新的HA的邏輯URI.若用“mycluster”作為nameservice ID,這個ID將是所有你的HDFS路徑的authority部分.
9)dfs.journalnode.edits.dir:JN守護進程在對NN的目錄進行共享時,存儲數(shù)據(jù)的路徑,此路徑中存儲了edit和JNs使用的其它的本地狀態(tài).
2.2.3 自動故障轉(zhuǎn)移配置
這列出了多個正在進行Zookeeper服務(wù)的主機名-端口號信息,用每個nameservice的id做前綴來作為配置時的key.例如,在開啟HA集群中,你可能需要明確的指定所要開啟自動故障轉(zhuǎn)移的nameservice用dfs.ha.automatic-failover.enabled.my-nameservice-id指定.
3.1 啟動集群
因為自動故障轉(zhuǎn)移在配置中已經(jīng)被開啟了,start-dfs.sh腳本將會在任意運行NN的機器上自動啟動一個ZKFC守護進程.當ZKFC啟動,它們將自動選擇一個NN變成Active[8-10].
3.2 高可用性驗證
首先定位Active NN.可以訪問NN的Web接口分辨出nambnode1為Active,namenode2為Standby,故障轉(zhuǎn)移前NN狀態(tài)圖如圖5所示.本實驗在Active NN上造成一個故障,采用kill-9<pid of NN>殺掉NN進程和關(guān)閉NN節(jié)點,觸發(fā)故障轉(zhuǎn)移,另一NN節(jié)點均能在幾秒后從Standby狀態(tài)變?yōu)锳ctive狀態(tài),說明實現(xiàn)了自動故障轉(zhuǎn)移,從而實現(xiàn)了集群的高可用性.故障轉(zhuǎn)移后NN狀態(tài)圖如圖6所示.
圖5 故障轉(zhuǎn)移前NN狀態(tài)圖
圖6 故障轉(zhuǎn)移后NN狀態(tài)圖
針對目前OpenStack Sahara集群實驗環(huán)境,設(shè)計并實現(xiàn)基于OpenStack Sahara集群的HA,可以實現(xiàn)在Sahara集群的一個NN節(jié)點遇到故障、宕機或者軟硬件升級維護時,自動切換到另一臺NN,保證Sahara集群的高可用性,提高整個集群的性能.
[1] RAGHURAM D,GAYATHRIN,SADASIVAM G S.Efficiently Scheduling Hadoop Cluster in Cloud Environment[M]∥Informatics and Communication Technologies for Societal Development.Springer India,2015:95-102.
[2] WANG F,QIU J,YANG J,etal.Hadoop high availability throughmetadata replication[C]∥Proceedings of the first international workshop on Cloud datamanagement.ACM,2009:37-44.
[3] FOLEY M.High Availability HDFS[C]∥28th IEEE Conference on Massive Data Storage,MSST,2012(12):3-5.
[4] 文艾,王磊.高可用性的HDFS:Hadoop分布式文件系統(tǒng)深度實踐[M].北京:清華大學(xué)出版社,2012:350-370.
[5] OpenStack.Sahara Cluster HA[EB/OL].(2014.11.10)[2014.11.18].https:∥wiki.openstack.org/wiki/Sahara/ClusterHA.
[6] 楊帆.Hadoop平臺高可用性方案的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2012.
[7] 董西成.Hadoop YARN單點故障解決方案(HA)介紹[EB/OL].(2013.11.27)[2014.11.15].http:∥dongxicheng. org/mapreduce-nextgen/hadoop-yarn-ha-in-cdh5/.
[8] 楊平安.基于Paxos算法的HDFS高可用性的研究與設(shè)計[D].廣州:華南理工大學(xué),2012.
[9] 鄧鵬,李枚毅,何誠.Namenode單點故障解決方案研究[J].計算機工程,2012,38(21):40-44.
[10]代志遠.高可用的HDFS架構(gòu)剖析[J].程序員,2012(7):108-111.
[責(zé)任編輯馬云彤]
Design and Im plementation of High Availability Based on OpenStack Sahara Cluster
TANG Pan1,ZHU Zhi-xiang1,LIANG Xiao-jiang2,CAIXiao-long3
(1.College of Computer Science and Technology,Xi'an University of Posts and Telecommunications,Xi'an 710061,China;2.Xi'an Future International Information Co.,LTD,Xi'an 710065,China;3.College of Software,Luoyang Normal University,Luoyang 471023,China)
To address the high cost ofmass data processing environment and point-single failures,we apply OpenStack Sahara in an effort to combine cloud computing and mass data and put forward a solution of high availability based on OpenStack Sahara.The verification result shows that the solution is effective in handling the point-single failures and the automatic handover.Thus,the high availability of cluster is ensured and the performance of Sahara cluster is improved.
single point failure;OpenStack;Sahara;high availability;handover
TP393
A
1008-5564(2015)02-0055-06
2014-12-20
唐 攀(1988—),男,陜西咸陽人,西安郵電大學(xué)計算機學(xué)院碩士研究生,主要從事云計算與大數(shù)據(jù)處理
研究;
朱志祥(1959—),男,天津人,西安郵電大學(xué)計算機學(xué)院教授,博士,主要從事信息安全研究.