本文來自網易雲社區。
前言
前段時間有套線上HBase出了點小問題,導致該套HBase集群服務停止了2個小時,從而造成使用該套HBase作為數據存儲的應用也出現了服務異常。在排查問題之餘,我們不禁也在思考,以後再出現類似的問題怎麼辦?這種問題該如何避免?用慣了MySQL,於是乎想到了HBase是否跟MySQL一樣,也有其高可用方案?答案當然是肯定的,幾乎所有的資料庫(無論是關係型還是分散式的),都採用WAL的方式來保障服務異常時候的數據恢復,HBase同樣也是通過WAL來保障數據不丟失。HBase在寫數據前會先寫HLog,HLog中記錄的是所有數據的變動, HBase的高可用也正是通過HLog來實現的。
進階
HBase是一個沒有單點故障的分散式系統,上層(HBase層)和底層(HDFS層)都通過一定的技術手段,保障了服務的可用性。上層HMaster一般都是高可用部署,而RegionServer如果出現宕機,region遷移的代價並不大,一般都在毫秒級別完成,所以對應用造成的影響也很有限;底層存儲依賴於HDFS,數據本身默認也有3副本,數據存儲上做到了多副本冗餘,而且Hadoop 2.0以後NameNode的單點故障也被消除。所以,對於這樣一個本身沒有單點故障,數據又有多副本冗餘的系統,再進行高可用的配置是否有這個必要?會不會造成資源的極大浪費?高可用部署是否有必要,這個需要根據服務的重要性來定,這裡先簡單介紹下沒有高可用的HBase服務會出現哪些問題:1. 資料庫管理人員失誤,進行了不可逆的DDL操作不管是什麼資料庫,DDL操作在執行的時候都需要慎之又慎,很可能一條簡單的drop操作,會導致所有數據的丟失,並且無法恢復,對於HBase來說也是這樣,如果管理員不小心drop了一個表,該表的數據將會被丟失。2. 離線MR消耗過多的資源,造成線上服務受到影響HBase經過這麼多年的發展,已經不再是只適合離線業務的數據存儲分析平台,許多公司的線上業務也相繼遷移到了HBase上,比較典型的如:facebook的iMessage系統、360的搜索業務、小米米聊的歷史數據等等。但不可避免在這些數據上做些統計分析類操作,大型MR跑起來,會有很大的資源消耗,可能會影響線上業務。3. 不可預計的另外一些情況比如核心交換機故障,機房停電等等情況都會造成HBase服務中斷
對於上述的那些問題,可以通過配置HBase的高可用來解決:
1. 不可逆DDL問題
HBase的高可用不支持DDL操作,換句話說,在master上的DDL操作,不會影響到slave上的數據,所以即使在master上進行了DDL操作,slave上的數據依然沒有變化。這個跟MySQL有很大不同,MySQL的DDL可以通過statement格式的Binlog進行複製。2. 離線MR影響線上業務問題高可用的最大好處就是可以進行讀寫分離,離線MR可以直接跑在slave上,master繼續對外提供寫服務,這樣也就不會影響到線上的業務,當然HBase的高可用複製是非同步進行的,在slave上進行MR分析,數據可能會有稍微延遲。3. 意外情況對於像核心交換機故障、斷電等意外情況,slave跨機架或者跨機房部署都能解決該種情況。基於以上原因,如果是核心服務,對於可用性要求非常高,可以搭建HBase的高可用來保障服務較高的可用性,在HBase的Master出現異常時,只需簡單把流量切換到Slave上,即可完成故障轉移,保證服務正常運行。原理HBase高可用保證在出現異常時,快速進行故障轉移。下面讓我們先來看看HBase高可用的實現,首先看下官方的一張圖: