比特科技: 存儲吝沫、數(shù)據(jù)庫姥敛、大數(shù)據(jù)技術(shù) ? HBase高可用原理與實(shí)踐 http://www.bitstech.net/2015/12/21/hbase_replication/
前言
前段時(shí)間有套線上HBase出了點(diǎn)小問題题诵,導(dǎo)致該套HBase集群服務(wù)停止了2個(gè)小時(shí)烤送,從而造成使用該套HBase作為數(shù)據(jù)存儲的應(yīng)用也出現(xiàn)了服務(wù)異常樱拴。在排查問題之余寝凌,我們不禁也在思考狮含,以后再出現(xiàn)類似的問題怎么辦顽悼?這種問題該如何避免?用慣了MySQL几迄,于是乎想到了HBase是否跟MySQL一樣蔚龙,也有其高可用方案?
答案當(dāng)然是肯定的映胁,幾乎所有的數(shù)據(jù)庫(無論是關(guān)系型還是分布式的)木羹,都采用WAL的方式來保障服務(wù)異常時(shí)候的數(shù)據(jù)恢復(fù),HBase同樣也是通過WAL來保障數(shù)據(jù)不丟失解孙。HBase在寫數(shù)據(jù)前會先寫HLog坑填,HLog中記錄的是所有數(shù)據(jù)的變動, HBase的高可用也正是通過HLog來實(shí)現(xiàn)的弛姜。
進(jìn)階
HBase是一個(gè)沒有單點(diǎn)故障的分布式系統(tǒng)脐瑰,上層(HBase層)和底層(HDFS層)都通過一定的技術(shù)手段,保障了服務(wù)的可用性廷臼。上層HMaster一般都是高可用部署苍在,而RegionServer如果出現(xiàn)宕機(jī),region遷移的代價(jià)并不大荠商,一般都在毫秒級別完成寂恬,所以對應(yīng)用造成的影響也很有限;底層存儲依賴于HDFS结啼,數(shù)據(jù)本身默認(rèn)也有3副本掠剑,數(shù)據(jù)存儲上做到了多副本冗余,而且Hadoop 2.0以后NameNode的單點(diǎn)故障也被消除郊愧。所以朴译,對于這樣一個(gè)本身沒有單點(diǎn)故障,數(shù)據(jù)又有多副本冗余的系統(tǒng)属铁,再進(jìn)行高可用的配置是否有這個(gè)必要眠寿?會不會造成資源的極大浪費(fèi)?
高可用部署是否有必要焦蘑,這個(gè)需要根據(jù)服務(wù)的重要性來定盯拱,這里先簡單介紹下沒有高可用的HBase服務(wù)會出現(xiàn)哪些問題:
數(shù)據(jù)庫管理人員失誤,進(jìn)行了不可逆的DDL操作
不管是什么數(shù)據(jù)庫,DDL操作在執(zhí)行的時(shí)候都需要慎之又慎狡逢,很可能一條簡單的drop操作宁舰,會導(dǎo)致所有數(shù)據(jù)的丟失,并且無法恢復(fù)奢浑,對于HBase來說也是這樣蛮艰,如果管理員不小心drop了一個(gè)表,該表的數(shù)據(jù)將會被丟失雀彼。
離線MR消耗過多的資源壤蚜,造成線上服務(wù)受到影響
HBase經(jīng)過這么多年的發(fā)展,已經(jīng)不再是只適合離線業(yè)務(wù)的數(shù)據(jù)存儲分析平臺徊哑,許多公司的線上業(yè)務(wù)也相繼遷移到了HBase上袜刷,比較典型的如:facebook的Messages系統(tǒng)、360的搜索業(yè)務(wù)莺丑、小米米聊的歷史數(shù)據(jù)等等著蟹。但不可避免在這些數(shù)據(jù)上做些統(tǒng)計(jì)分析類操作,大型MR跑起來窒盐,會有很大的資源消耗草则,可能會影響線上業(yè)務(wù)。
不可預(yù)計(jì)的另外一些情況
比如核心交換機(jī)故障蟹漓,機(jī)房停電等等情況都會造成HBase服務(wù)中斷
對于上述的那些問題炕横,可以通過配置HBase的高可用來解決:
不可逆DDL問題
HBase的高可用不支持DDL操作,換句話說葡粒,在master上的DDL操作份殿,不會影響到slave上的數(shù)據(jù),所以即使在master上進(jìn)行了DDL操作嗽交,slave上的數(shù)據(jù)依然沒有變化卿嘲。這個(gè)跟MySQL有很大不同,MySQL的DDL可以通過statement格式的Binlog進(jìn)行復(fù)制夫壁。
離線MR影響線上業(yè)務(wù)問題
高可用的最大好處就是可以進(jìn)行讀寫分離拾枣,離線MR可以直接跑在slave上,master繼續(xù)對外提供寫服務(wù)盒让,這樣也就不會影響到線上的業(yè)務(wù)梅肤,當(dāng)然HBase的高可用復(fù)制是異步進(jìn)行的,在slave上進(jìn)行MR分析邑茄,數(shù)據(jù)可能會有稍微延遲姨蝴。
意外情況
對于像核心交換機(jī)故障、斷電等意外情況肺缕,slave跨機(jī)架或者跨機(jī)房部署都能解決該種情況左医。
基于以上原因授帕,如果是核心服務(wù),對于可用性要求非常高浮梢,可以搭建HBase的高可用來保障服務(wù)較高的可用性跛十,在HBase的Master出現(xiàn)異常時(shí),只需簡單把流量切換到Slave上秕硝,即可完成故障轉(zhuǎn)移偶器,保證服務(wù)正常運(yùn)行。
原理
HBase高可用保證在出現(xiàn)異常時(shí)缝裤,快速進(jìn)行故障轉(zhuǎn)移。下面讓我們先來看看HBase高可用的實(shí)現(xiàn)颊郎,首先看下官方的一張圖:
HBase Replication
需要聲明憋飞,HBase的replication是以Column Family為單位的,每個(gè)Column Family都可以設(shè)置是否進(jìn)行replication姆吭。
上圖中榛做,一個(gè)Master對應(yīng)了3個(gè)Slave,Master上每個(gè)RegionServer都有一份HLog内狸,在開啟Replication的情況下检眯,每個(gè)RegionServer都會開啟一個(gè)線程用于讀取該RegionServer上的HLog,并且發(fā)送到各個(gè)Slave昆淡,Zookeeper用于保存當(dāng)前已經(jīng)發(fā)送的HLog的位置锰瘸。Master與Slave之間采用異步通信的方式,保障Master上的性能不會受到Slave的影響昂灵。用Zookeeper保存已經(jīng)發(fā)送HLog的位置避凝,主要考慮在Slave復(fù)制過程中如果出現(xiàn)問題后重新建立復(fù)制,可以找到上次復(fù)制的位置眨补。
HBase Replication步驟
HBase Client向Master寫入數(shù)據(jù)
對應(yīng)RegionServer寫完HLog后返回Client請求
同時(shí)replication線程輪詢HLog發(fā)現(xiàn)有新的數(shù)據(jù)管削,發(fā)送給Slave
Slave處理完數(shù)據(jù)后返回給Master
Master收到Slave的返回信息,在Zookeeper中標(biāo)記已經(jīng)發(fā)送到Slave的HLog位置
注:****在進(jìn)行replication時(shí)撑螺,Master與Slave的配置并不一定相同含思,比如Master上可以有3臺RegionServer,Slave上并不一定是3臺甘晤,Slave上的RegionServer數(shù)量可以不一樣含潘,數(shù)據(jù)如何分布這個(gè)HBase內(nèi)部會處理。
種類
HBase通過HLog進(jìn)行數(shù)據(jù)復(fù)制安皱,那么HBase支持哪些不同種類的復(fù)制關(guān)系调鬓?
從復(fù)制模式上來講,HBase支持主從酌伊、主主兩種復(fù)制模式腾窝,也就是經(jīng)常說的Master-Slave缀踪、Master-Master復(fù)制。
Master-Slave
Master-Slave復(fù)制比較簡單虹脯,所有在Master集群上寫入的數(shù)據(jù)都會被同步到Slave上驴娃。
Master-Master
Master-Master復(fù)制與Master-Slave類似,主要的不同在于循集,在Master-Master復(fù)制中唇敞,兩個(gè)Master地位相同,都可以進(jìn)行讀取和寫入咒彤。
既然Master-Master兩個(gè)Master都可以進(jìn)行寫入疆柔,萬一出現(xiàn)一種情況:兩個(gè)Master上都進(jìn)行了對同一表的相同Column Family的同一個(gè)rowkey進(jìn)行寫入,會出現(xiàn)什么情況镶柱?
create ‘t’, {NAME=>’cf’, REPLICATION_SCOPE=>’1’}
Master1 Master2
put ‘t’, ‘r1’, ‘cf’, ‘a(chǎn)aaaaaaaaaaaaaa’ put ‘t’, ‘r1’, ‘cf’, ‘bbbbbbbbbbbbbbb’
如上操作旷档,Master1上對t的cf列簇寫入rowkey為r1,value為aaaaaaaaaaaaaaa的數(shù)據(jù)歇拆,Master2上同時(shí)對t的cf列簇寫入rowkey為r1, value為bbbbbbbbbbbbbbb的數(shù)據(jù)鞋屈,由于是Master-Master復(fù)制,Master1和Master2上在寫入數(shù)據(jù)的同時(shí)都會把更新發(fā)送給對方故觅,這樣最終的數(shù)據(jù)就變成了:
Master1
Master2
rowkey
value
rowkey
value
r1
bbbbbbbbbbbbbbb
r1
aaaaaaaaaaaaaaa
從上述表格中可以看到厂庇,最終Master1和Master2上cf列簇rowkey為r1的數(shù)據(jù)兩邊不一致。
所以输吏,在做******Master-Master******高可用時(shí)权旷,確保兩邊寫入的表都是不同的,這樣能防止上述數(shù)據(jù)不一致問題贯溅。
異常
HBase復(fù)制時(shí)炼杖,都是通過RegionServer開啟復(fù)制線程進(jìn)行HLog的發(fā)送,那么當(dāng)其中某個(gè)RegionServer出現(xiàn)異常時(shí)盗迟,HBase是如何處理的坤邪?這里需要區(qū)別兩種不同的情況,即Master上RegionServer異常和Slave上RegionServer異常罚缕。
Slave****上RegionServer****異常
對于該種異常HBase處理比較簡單艇纺,Slave上出現(xiàn)某個(gè)RegionServer異常,該RegionServer直接會被標(biāo)記為異常狀態(tài)邮弹,后續(xù)所有的更新都不會被發(fā)送到該臺RegionServer黔衡,Slave會重新選取一臺RegionServer來接收這部分?jǐn)?shù)據(jù)。
Master****上RegionServer****異常
Master上RegionServer出現(xiàn)異常腌乡,由于HLog都是通過RegionServer開啟復(fù)制線程進(jìn)行發(fā)送盟劫,如果RegionServer出現(xiàn)異常,這個(gè)時(shí)候与纽,屬于該臺RegionServer的HLog就沒有相關(guān)處理線程侣签,這個(gè)時(shí)候塘装,這部分?jǐn)?shù)據(jù)又該如何處理?
Master上某臺RegionServer異常影所,其他RegionServer會對該臺RegionServer在zookeeper中的信息嘗試加鎖操作蹦肴,當(dāng)然這個(gè)操作是互斥的,同一時(shí)間只有一臺RegionServer能獲取到鎖猴娩,然后阴幌,會把HLog信息拷貝到自己的目錄下,這樣就完成了異常RegionServer的HLog信息的轉(zhuǎn)移卷中,通過新的RegionServer把HLog的信息發(fā)送到Slave矛双。
Master regionserver crash
操作
上面介紹的都是HBase高可用的理論實(shí)現(xiàn)和異常處理等問題,下面就動手實(shí)踐下蟆豫,如何配置一個(gè)HBase的Replication(假設(shè)已經(jīng)部署好了兩套HBase系統(tǒng)背零,并且在配置文件中已經(jīng)開啟了replication配置),首先嘗試配置下Master-Slave模式的高可用:
選取一套系統(tǒng)作為Master无埃,另外一套作為Slave
在Master上通過add_peer 命令添加復(fù)制關(guān)系,如下
add_peer ‘1’, “db-xxx.photo.163.org:2181:/hbase”
在Master上新建表t毛雇,該表擁有一個(gè)列簇名為cf嫉称,并且該列簇開啟replication,如下:
create ‘t’, {NAME=>’cf’, REPLICATION_SCOPE=>’1’}
上面REPLICATION_SCOPE的值需要跟步驟2中的對應(yīng)
在slave建立相同的表(HBase不支持DDL的復(fù)制)灵疮,在master-slave模式中织阅,slave不需要開啟復(fù)制,如下:
create ‘t’, {NAME=>’cf’ }
這樣震捣,我們就完成了整個(gè)master-slave模式高可用的搭建荔棉,后續(xù)可以在master上通過put操作插入一條記錄,查看slave上是否會復(fù)制該記錄蒿赢,最終結(jié)果如下:
Master上操作
Slave上結(jié)果
上述結(jié)果顯示润樱,在添加完復(fù)制關(guān)系后,Master上插入rowkey=r1, value=’aaaaaaaaa’的記錄羡棵,slave上可以獲取該記錄壹若,Master-Slave模式數(shù)據(jù)復(fù)制成功。
接下來我們再看下Master-Master模式的復(fù)制皂冰,配置的時(shí)候與Master-Slave模式不同的是店展,在Master上添加完復(fù)制關(guān)系后,需要在另外一臺Master也添加復(fù)制關(guān)系秃流,而且兩邊的cluster_id必須相同赂蕴,并且在另外一臺Master上建表的時(shí)候,需要加上列簇的REPLICATION_SCOPE=>’1’配置舶胀,最終結(jié)果如下:
Master1上操作
Master2上操作
上述結(jié)果顯示概说,添加完了Master-Master復(fù)制關(guān)系碧注,在Master1上插入一條記錄rowkey=r1, value=“aaaaaaaaaa”,Master2上通過scan操作發(fā)現(xiàn)該記錄已經(jīng)被復(fù)制到Master2上席怪,接著我們在Master2上添加一條記錄rowkey=r2, value=’bbbbbbbbbbbb’应闯,查看Master1上的數(shù)據(jù),該條記錄也已經(jīng)被復(fù)制到Master2上挂捻,Master-Master模式的replication驗(yàn)證成功碉纺。