HBase可用性分析與高可用實踐
HBase作為一個分散式儲存的資料庫,它是如何保證可用性的呢?對於分散式系統的CAP問題,它是如何權衡的呢?
最重要的是,我們在生產實踐中,又應該如何保證HBase服務的高可用呢?
下面我們來仔細分析一下。
1. 什麼是分散式系統的CAP?
CAP是指一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition tolerance)。
- Consistency 一致性
一致性指更新操作成功並返回客戶端完成後,分散式系統中所有節點在同一時間的資料完全一致。
從客戶端的角度來看,一致性主要指的是併發訪問時獲取的資料一致。從服務端來看,則是更新如何複製分佈到整個系統,以保證資料最終一致。
對於資料庫來說,如果要求更新過的資料能被後續的訪問都能看到,這是強一致性。如果能容忍後續的部分或者全部訪問不到,則是弱一致性。如果經過一段時間後要求能訪問到更新後的資料,則是最終一致性。
- Availability 可用性
可用性指服務一直可用,整個系統是可以正常響應的。 一般我們在衡量一個系統的可用性的時候,都是通過停機時間來計算的。我們經常說的3個9,4個9的SLA,就是對於可用性的量化表述。
- Partition Tolerance分割槽容錯性
分割槽容錯性指分散式系統在遇到某節點或網路分割槽故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。
而CAP定理證明,一個分散式系統最多隻能同時滿足這三項中的兩項。
由於分散式系統中必然存在網路分割槽,所以對於分散式系統而言,一般分為CP系統和AP系統。
也就是說,如果出現故障了,到底是選擇可用性優先(AP)呢?還是選擇一致性優先(CP)?
2.HBase的CAP權衡
HBase作為分散式資料庫,同樣滿足CAP理論,那它是AP系統,還是CP系統呢?
我們從HBase的故障恢復過程來分析一下。
當某臺region server fail的時候,它管理的region failover到其他region server時,需要根據WAL log(Write-Ahead Logging)來redo,這時候進行redo的region應該是不可用的,客戶端請求對應region資料時,會丟擲異常。
因此,HBase屬於CP型架構,降低了可用性,具備強一致性讀/寫。
設想一下,如果redo過程中的region能夠響應請求,那麼可用性提高了,則必然返回不一致的資料(因為redo可能還沒完成),那麼hbase的一致性就降低了。
3.HBase的可用性分析
作為一個CP系統,HBase的可用性到底如何,我們還需要進一步分析它的各個元件。
下面是一個HBase叢集的相關元件。
以HBase 單叢集 2個master + 3個core 節點作為例子,各個元件的部署情況如下:
HBase:
- 兩個HMaster互為主備,保證高可用
- 藍色的region server表示會存有meta table
- 使用者快取meta table資訊,直接與region server互動,查詢,不需要經過HMaster
- core可以橫向擴充套件,存在多個region server和data node。
Zookeeper:
- 三節點叢集
HDFS:
- 兩個namenode,多個DataNode
在這樣的部署下,各個元件的可用性分析如下:
從上面的分析可以看到,HBase的不可用風險主要有兩個:
1)某個region server不可用,導致該region server上的流量有分鐘級的不可讀寫
2)叢集整體不可用,所有流量不可讀寫
4. 如何提高HBase可用性
4.1 Region replica
上面提到了HBase為了保證資料的強一致性,在可用性上有所犧牲,根本原因是雖然是三副本的資料儲存,但是同一時刻只有一個“線上”Region(保證一致性),所以一旦該region不可用,需要通過日誌回放來重新拉起一個新的region,而且此時region不可讀寫(保證一致性)。
因此,如果能增加“線上”的Region數量,就可以提高可用性了,可以參考這個Region replica(https://issues.apache.org/jira/browse/HBASE-10070 )。需要注意,副本region只能作為讀,不能作為寫。因此主region掛了以後,仍然會有不可寫入時間。
這個特性沒有很多的生產實踐案例,風險較高,因此不建議使用。
4.2 主備叢集
既然單叢集HBase的可用性不夠,我們自然而然會想到可以使用主備叢集來提高可用性。
如果一個叢集的穩定性是99.9%, 那麼兩個獨立叢集的組合的穩定性是 1 - 0.1 * 0.1 = 99.99%。採用主備叢集服務同一份資料,可以在最終一致性條件下提升一個數量級的穩定性。
我們參考下阿里雲HBase的主備叢集模式,一般有兩種模式,主備雙活與主備容災。
1)主備雙活(active-active模式)
可以實現兩方面的能力,降低毛刺與自動容錯
- 降低毛刺
當客戶端發起請求後,會首先向主叢集發起請求,在等待一段時間(Glitch Time)後如果主庫仍沒有返回結果,則併發向備庫發起請求,最終取最快返回的值作為結果。
- 自動容錯
當主叢集連續拋錯或者連續超時超過使用者指定次數時,即判定主叢集存在故障需要進行”切換”,在切換狀態下在主庫服務恢復可以進行正常訪問的情況會進行自動回切,對使用者完全透明。
優點:
- 主備雙活能大大提高HBase服務的可用性,能實現region server宕機的快速恢復和叢集整體不可用的快速恢復。
缺點:
- 犧牲一致性後換來的高可用性。既然主備叢集之間需要資料同步,那麼必然存在延遲,那麼在自動切換讀取備叢集的時候,就可能存在資料不一致的情況。而且資料不一致可能是一種低概率的常態化情況。
2)主備容災(active-standby模式)
同樣是主備叢集,但是正常情況下都是訪問主叢集。如果主叢集出現故障,那麼就可以通過手動切換的方式,快速切換到備叢集。
優點:
- 主備容災在故障時能快速恢復,大大降低故障恢復時間,提高可用性。能實現region server宕機的快速恢復和叢集整體不可用的快速恢復。
- 只有在切換到過程中,可能存在資料不一致的情況。
缺點:
- 無法像主備雙活那樣降低毛刺
- 手動切換,切換不夠迅速、絲滑
4.3 互備雙活
主備叢集的方案雖然大大提高了可用性,但是我們可以明顯感受到的是,成本double了。日常情況下,備用叢集一般都是閒置的。這對於生產實踐來說,是不容忽視的考慮因素。
因此,我們在主備叢集的基礎上,可以考慮“互為主備”的方案。
所謂“互為主備”,就是兩個業務有各自的HBase叢集,同時,通過資料雙向同步,在對方的叢集中備份資料,作為備叢集。
得益於HBase的儲存與計算分離的特點,我們只需要冗餘儲存,而不需要冗餘計算資源。
優點:
- 通過主備叢集的基礎架構,提高了可用性,比如一般的某個region server宕機,可以大大提高恢復速度。
- 降低了成本,不再需要完全的double成本,且有一個叢集日常空閒
缺點:
- 無法支援叢集整體不可用後的切換。由於兩個叢集都是以自身業務容量來規劃使用的,雖然日常安全使用水位是60%以下,可以支援region server宕機的流量切換,但是如果整個叢集不可用導致的整個叢集切換,那麼勢必會沖垮備用叢集(除非冗餘計算資源,那麼還是成本double了,沒有意義)。
5.總結
我們分析了HBase單叢集的可用性,然後針對HBase的CP型分散式系統,給出了通過主備叢集提高可用性的方案。並且,根據成本考慮,給出了非叢集故障下的“互備雙活”方案。
我們需要根據業務的重要程度、對於不可讀寫的容忍程度來評估具體的可用性方案,希望能對大家有所啟發。
看到這裡了,原創不易,點個關注、點個贊吧,你最好看了~
知識碎片重新梳理,構建Java知識圖譜:https://github.com/saigu/JavaKnowledgeGraph(歷史文章查閱非常方便)
掃碼關注我的公眾號“阿丸筆記”,第一時間獲取最新更新。同時可以免費獲取海量Java技術棧電子書、各個大廠面試題。
相關推薦
HBase可用性分析與高可用實踐
HBase作為一個分散式儲存的資料庫,它是如何保證可用性的呢?對於分散式系統的CAP問題,它是如何權衡的呢? 最重要的是,我們在生產實踐中,又應該如何保證HBase服務的高可用呢? 下面我們來仔細分析一下。 1. 什麼是分散式系統的CAP? CAP是指一致性(Consistency)、可用性(Ava
ORACLE RAC安裝-性能與高可用測試
RAC性能測試 RAC高可用測試 從11G開始,安裝RAC已經變成了一個體力活兒,但是RAC安裝完成後,如何保證系統的穩定運行,如何得到系統的性能,這個對後期在線系統的穩定運行影響巨大。下面是總結了最近1年多來工程實施中的一些經驗。###################################
高併發情況下Redis 的可用性測試與分析及部署架構說明
1、讀取Redis的timeout異常 建立執行緒數在50以下時程式可以正常執行,當執行緒數設定為100以上時,某些執行緒執行出現異常: java.net.SocketTimeoutException: Read timed out 造成這種異常可能有以下兩個原因: 原因一:在連線Redis的Jedis的預設
MySQL 數據庫的高可用性分析
用兩個 ima 指定 所有 情況下 復制集群 生成 生產 數據復制 前言 MySQL數據庫是目前開源應用最大的關系型數據庫,有海量的應用將數據存儲在MySQL數據庫中。存儲數據的安全性和可靠性是生產數據庫的關註重點。本文分析了目前采用較多的保障MySQL可用性方案。 MyS
RabbitMQ VS Apache Kafka (九)—— RabbitMQ叢集的分割槽容錯性與高可用性
本章,我們討論有關RabbitMQ的容錯性,訊息一致性及高可用性。RabbitMQ可以作為叢集節點來執行,因此RabbitMQ通常被歸為分散式訊息系統,對於分散式訊息系統,我們的關注點通常是一致性與可用性。 我們為什麼要討論分散式系統的一致性與可用性,本質在於兩者描述的是系統在失敗的
RabbitMQ高可用性分析
rabbitmq有三種模式:單機模式,普通叢集模式,映象叢集模式 1)單機模式 就是demo級別的,一般就是你本地啟動了玩玩兒的,沒人生產用單機模式。 2)普通叢集模式 意思就是在多臺機器上啟動多個rabbitmq例項,每個機器啟動一個。但是你建立的queue,只會放在一個rabbtimq
java B2B2C電子商務平臺分析之十六----Zuul的容錯回退與高可用
zuul的容錯與回退 之前說到過,使用Hystrix實現微服務的容錯與回退,其實Zuul預設已經整合了Hystrix,使用起來也是比較簡單: 在原有 zuul-gateway 專案的基礎上新增,實現ZuulFallbackProvider介面,並實現getRoute和fallbackRespons
RabbitMQ 集群與高可用配置
rabbitmq 集群與高可用配置RabbitMQ 集群與高可用配置集群概述通過 Erlang 的分布式特性(通過 magic cookie 認證節點)進行 RabbitMQ 集群,各 RabbitMQ 服務為對等節點,即每個節點都提供服務給客戶端連接,進行消息發送與接收。 這些節點通過 RabbitMQ
高性能、高可用的分布式架構體系(轉)
基礎上 keepal 第三方應用 備份 用戶 即時通訊 banner 協同辦公 產品 在2B企業服務、雲計算、移動互聯網領域,專業的雲平臺服務裏,分布式技術為支撐平臺正常運作關鍵性技術。從商業利潤和運維成本角度出發,千方百計榨幹服務器的每一分性能很大程度上影響著網站的
RabbitMQ集群與高可用部署
集群 高可用 rabbitmq 未完待續……本文出自 “藍色_風暴” 博客,請務必保留此出處http://270142877.blog.51cto.com/12869137/1984070RabbitMQ集群與高可用部署
高性能、高可用、高擴展ERP系統架構設計
sqlserve 學習 業務邏輯層 表設計 應用程序 log cnblogs 便在 tab ERP之痛 曾幾何時,我混跡於電商、珠寶行業4年多,為這兩個行業開發過兩套大型業務系統(ERP)。作為一個ERP系統,系統主要功能模塊無非是訂單管理、商品管理、生產采
36套精品Java高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰,大型分布式電商項目實戰視頻教程
java cti 投資 調優 dubbo pac 性能 -s clas 36套精品Java高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項
網站內容排版可用性分析
繼續 perm 文件 技術分享 即使 找到 難受 時間 自己 當我們談論網站可用性的時候,我們總會提及用戶界面(UI)——按鈕、標記(label)、標簽(tab)等的設計與布局。但是,還有一個可能會被你忽視的元素可能會把你辛辛苦苦設計的網站毀於一旦,那就是(文字)內容。
Linux集群(四)-LVS持久連接與高可用
LVS高可用 ldirectord LVS持久連接 FWM:FireWall Mark MARK target 可用於給特定的報文打標記 --set-mark value 其中:value 為十六進制數字 借助於防火墻標記來分類報文,而後基於標記定義集群服務;可將多個不同的應用使用同一個集群服務進
mysql主從復制讀寫分離與高可用配置
mysql主從復制 mysql讀寫分離 一、說明 前面我們說了mysql的安裝配置(並提供一鍵安裝腳本),mysql語句使用以及備份恢復mysql數據;本次要介紹的是mysql的主從復制,讀寫分離;及高可用MHA;環境如下:master:CentOS7_x64 mysql5.721 172.16.
高性能、高可用平臺架構演變史
linux運維 架構 高可用 高性能 互聯網平臺 開篇概述 在如今移動互聯網、互聯網+、大數據的時代,各類的互聯網網站、平臺異常突起,如同雨後春筍,有種“忽如一夜春風來,千樹萬樹梨花開”感覺。對於移動互聯網時代的平臺來說,用戶的體驗感是否良好?平臺的穩定性是否良好?估計是對所有互聯網平臺
Spring Cloud(八):配置中心(服務化與高可用)【Finchley 版】
outer get btn discovery ofo DC master 配置 兩個 Spring Cloud(八):配置中心(服務化與高可用)【Finchley 版】 發表於 2018-04-19 | 更新於 2018-04-26 | 本文接之前的《Spring
RabbitMQ實戰:可用性分析和實現
RabbitMQ本系列是「RabbitMQ實戰:高效部署分布式消息隊列」書籍的總結筆記。 上一篇介紹了各種場景下的最佳實踐,大部分場景可以使用「發後即忘」的模式,不需要響應,如果需要響應,可以使用RabbitMQ的RPC模型。 RabbitMQ以異步的方式解耦系統間的關系,調用者將業務請求發送到Rabbit
高並發與高可用實戰之基礎知識大型網站架構特征(一)
電商系統 保障系統 iptables ID 失敗重試 容量 設計原則 服務調用 冪等 大型網站架構特征: 1.高並發?(用戶訪問量比較大) 解決方案:拆分系統、服務化、消息中間件、緩存、並發化 高並發設計原則 系統設計不僅需要考慮實現業務功能,還要保證系統高並發、高
Redis主從復制與高可用方案
安裝配置 失敗 tle nap 腳本 登錄 上線 集群 masters redis簡單介紹 Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。Redis與其他key – value緩存產品有以下三個特點: 支持數據的持久化,可以將內存中