打造一個(gè)億級平臺的?Hbase集群

概念

分布式key-value數(shù)據(jù)庫,面向數(shù)十億數(shù)據(jù)的實(shí)時(shí)入庫與快速的隨機(jī)訪問。上百萬的QPS與PB級數(shù)據(jù),需要專門學(xué)習(xí)。

Hbase與MP一起操作比較少見,與Java API操作較多。

組件構(gòu)成
  • HMaster:集群管理

  • HRegion Server:具體的數(shù)據(jù)存取

  • Zookeeper:集群狀態(tài)管理與元數(shù)據(jù)的存儲

Hbase組件構(gòu)成
數(shù)據(jù)存儲,可存儲
  • 本地文件系統(tǒng)

  • 或 HDFS分布式文件系統(tǒng)

  • 或 其他對象存儲: S3(AWS)、OSS(Aliyun)、OBS(華為云)

億級平臺集群

  • 1、服務(wù)器選型

  • 2、配置優(yōu)化

  • 3、日常運(yùn)維

一、 服務(wù)器選型

內(nèi)容如下:

  • 1、確定集群的承載量

  • 2、確定所需要的內(nèi)存

  • 3、確定CPU型號和核數(shù)

  • 4、確定磁盤類型和容量

  • 5、確定網(wǎng)絡(luò)承載

確定集群的承載量

確定最大的承載量,是Hbase的最基礎(chǔ)的需求。在處理能力適中的情況上,Hbase的處理能力是根據(jù)RegionServer橫向擴(kuò)展:比如集群總體10w/s讀寫能力,處理能力是根據(jù)RegionServer橫向擴(kuò)展,其集群的承載量設(shè)計(jì)如下:

集群的承載量設(shè)計(jì)

如此配置,每天的入庫量在86億條。計(jì)算規(guī)則:


1w/s * 3600秒/h * 24h * 10臺主機(jī) = 86400萬 ,約等于86億條

確定所需要的內(nèi)存

Hbase內(nèi)存型數(shù)據(jù)庫是同存型數(shù)據(jù)庫,數(shù)據(jù)寫入規(guī)則:

  1. 先存儲在Memostore中 ,

  2. 同時(shí)將經(jīng)常查詢的熱數(shù)據(jù)緩存在內(nèi)存中RedCache,提高性能。

Hbase內(nèi)存型數(shù)據(jù)庫

因此Hbase是對內(nèi)存要求比較高的服務(wù), 為了保證Hbase運(yùn)行的穩(wěn)定,線上要求Hbase的服務(wù)器的內(nèi)存配置為:16GB、32GB、64GB

確定CPU核數(shù)

為了保證快速的對Hbase數(shù)據(jù)進(jìn)行處理,我們選擇4核、8核、16核。

根據(jù)對數(shù)據(jù)實(shí)時(shí)性要求高低配置不同的配置,如果對實(shí)時(shí)性要求不高的,我們選擇4核16G,以夠用為原則。CPU與內(nèi)存的比例1/4,如下圖:

CPU核數(shù)與內(nèi)存關(guān)系表
確定磁盤類型和容量

1、磁盤選型:

  • HDD: 數(shù)據(jù)大小寫與讀取請求數(shù)適中

  • SSD:有大量高效讀取請求

以下需求選擇SSD加快數(shù)據(jù)的讀取效率:

  • 數(shù)據(jù)比較大,比如10GB

  • 對數(shù)據(jù) Read(讀操作)要求頻繁

以下需求選擇HDS即可:

  • 高速寫入,比如500M/S

  • 稀疏寫入的場景

2、磁盤容量

根據(jù)數(shù)據(jù)量確定磁盤容量盤大小,參考如下指標(biāo):

  • 數(shù)據(jù)結(jié)構(gòu)

  • 壓縮算法

  • 副本數(shù)

  • 數(shù)據(jù)存儲時(shí)長

方法:通過在測試環(huán)境寫入一部份數(shù)據(jù)來確定每條數(shù)據(jù)大小,再根據(jù)存儲長短與副本確定磁盤大小。

確定網(wǎng)絡(luò)的承載量

Hbase的副本機(jī)制,需要將一份數(shù)據(jù)的多個(gè)副本實(shí)時(shí)存儲在多個(gè)HDFS上,保存一個(gè)副本數(shù)據(jù)丟失,可以從其他副本中恢復(fù)數(shù)據(jù)。

對網(wǎng)絡(luò)的要求是只要能保證網(wǎng)絡(luò)能實(shí)時(shí)完成多副本寫入數(shù)據(jù)即可

Hbase的副本機(jī)制

1、副本數(shù)與網(wǎng)絡(luò)帶寬算法

預(yù)估方式:

  • 假設(shè)一條數(shù)據(jù)大小為10kb,10萬/秒的寫入速度,每秒寫入的數(shù)據(jù)量如下:

10kb * 10萬/1024MB = 976MB

image.png
  • 保存3個(gè)副本的數(shù)據(jù),則網(wǎng)絡(luò)帶寬至少是

3 * 976MB/s = 2928MB/s  大約2.9GB

2、Rebalance

良好的網(wǎng)絡(luò)運(yùn)營環(huán)境,也能保障集群發(fā)生Rebalance所需要的時(shí)間不會太長。

服務(wù)器選型總結(jié)

項(xiàng)目 要點(diǎn)
數(shù)量承載量
所需內(nèi)存 寫入先緩存到Memstore、熱數(shù)據(jù)緩存Redcache,16G、32G、64G
CPU型號與核數(shù) 和內(nèi)存1/4的關(guān)系,對速度要求不高可選4核
磁盤選型與容量 SSD與HDD、
容量由“數(shù)據(jù)結(jié)構(gòu)、壓縮算法、副本數(shù)、數(shù)據(jù)存儲時(shí)間
網(wǎng)絡(luò)承載量 副本機(jī)制計(jì)算帶寬、網(wǎng)絡(luò)環(huán)境對Relance的影響

配置優(yōu)化

操作系統(tǒng)和Hbase集群參數(shù)調(diào)優(yōu),以達(dá)最優(yōu)性能表現(xiàn)。

一、 操作系統(tǒng)調(diào)優(yōu)

  • 文件句柄數(shù)

  • 最大虛擬內(nèi)存

  • Swap內(nèi)存設(shè)置

同樣適用于Mangodb、Cassandra、Elasticsearch等nosql數(shù)據(jù)庫。

文件句柄數(shù)

Linux默認(rèn)的句柄數(shù)為1024,不適合作為服務(wù)器的linux,修改如下:


echo "* soft nofile 65535" >>  /etc/security/limits.conf

echo "* hard nofile 65535" >>  /etc/security/limits.conf

最大虛擬內(nèi)存

max_map_count: 定義為進(jìn)程能擁有的最多的內(nèi)存區(qū)域,建議設(shè)置如下:


sysctl -w vm.max_map_count=102400

Swap內(nèi)存設(shè)置

Swap開啟是為了服務(wù)器吞吐量,但Hbase需要一個(gè)內(nèi)存操作都能快速執(zhí)行的環(huán)境,關(guān)閉Swap會提高讀效率,設(shè)置如下


echo  "vm.swappiness = 0" >> /etc/sysctl.conf

二、Hbase配置優(yōu)化

配置優(yōu)化項(xiàng)很多,這里講主要參數(shù)

Hbase RegionServer的JVM內(nèi)存配置
  • 1、堆內(nèi)存

Hbase實(shí)時(shí)數(shù)據(jù)首先寫入Memstore內(nèi)存中,再到磁盤,同時(shí)緩存熱點(diǎn)數(shù)據(jù)。

分配數(shù)量計(jì)算規(guī)則參考,以操作系統(tǒng)總內(nèi)存為32G為例:

Hbase JVM堆內(nèi)存:24G(3/4)

操作系統(tǒng)+JVM堆外內(nèi)存:8G(1/4) -- 保存系統(tǒng)穩(wěn)定運(yùn)行

配置信息如下


hbase_regionserfver_opts -Xmx24g -Xms24g -Xmn6g

#Xmx - 設(shè)定程序啟動時(shí)占用堆內(nèi)存大小

#Xms - 設(shè)定程序運(yùn)行期間最大可占用的內(nèi)存大?。ǔ鰹镺OM)

#Xmn - 年輕代大小

  • 2、G1垃圾回收器的配置

G1垃圾回收器能有效的降低JVM full CG的次數(shù)。


-XX: +UseG1GC #配置G1垃圾回收,JDK升級到11(jdk8不支持)

-XX: MaxGCPauseMillis = 500

-XX: +ParalleRefProcEnabled

-XX: -ResizePLAB

-XX: +ParalleGCThreads=8

-Xloggc: /data/log/hbase/gc/gc-%t.log

-XX: +PrintGCDetails

-XX: +PrintGCTimeStamps

-XX: +PrintGCCause

-XX: +PrintTenuringDistribution

-XX: +UseGCLogFileRotation

-XX: NumberOfGCLogFile=20

-XX: GCLogFileSize=5M

Hbase 線程參數(shù)設(shè)置

和CPU計(jì)算資源相關(guān)

  • Hbase.regionserver.handler.count:regionserver同時(shí)支持的線程數(shù)
regionserver同時(shí)支持的線程數(shù)
  • compaction.small和compaction.large

負(fù)載所有的compaction請求,當(dāng)文件compaction總大小>(大于)throttlePoint,則compation分配給largeCompaction線程池,否則由smallCompaction線程池處理。

具體配置


# 配置throttlePoint,默認(rèn)為2.5G

hbase.regionserver.thread.compaction.throttlePoint: 2.5G

# smallCompaction和largeCompaction線程池默認(rèn)都只有1個(gè)線程

hbase.regionserver.thread.compaction.small: 4

hbase.regionserver.thread.compaction.large: 6

  • hbase.regionserver.max.filesize

數(shù)據(jù)寫入流程,數(shù)據(jù)合并與分裂的基本流程。

數(shù)據(jù)寫入流程
  1. 先寫入Memstore,超過閥值,寫入StoreFile(HFile), 超過閥值,啟動compaction,合并為一個(gè)StoreFile,當(dāng)合并后的StoreFile大于hbase.regionserver.max.filesize所設(shè)置的參數(shù)時(shí),會觸發(fā)分裂動作,拆分為兩個(gè)region

  2. hbase.regionserver.max.filesize的需大小適中。當(dāng)filesize太小,則觸發(fā)分裂的機(jī)率更大,系統(tǒng)整體訪問服務(wù)會出現(xiàn)不穩(wěn)定現(xiàn)象。當(dāng)filesize太大,一次compaction 與split所需要的時(shí)間會較長,甚至產(chǎn)生停頓感,太大不適合常 compaction 與split,對應(yīng)用讀寫沖擊較大。

  3. 實(shí)戰(zhàn)經(jīng)驗(yàn),高并發(fā)情況下,最佳大小是5~10G


# 參數(shù)的設(shè)置和單條數(shù)據(jù)的大小,和Region個(gè)數(shù)有關(guān)

# 參數(shù)調(diào)優(yōu)必選項(xiàng)

hbase.regionserver.max.filesize 10G

  1. 高峰時(shí)關(guān)閉hbase表的major_compact

關(guān)閉hbase表的major_compact是為避免major_compact對系統(tǒng)性能的影響。非高峰時(shí)期時(shí),再調(diào)用major_compact對hbase表進(jìn)行大合并,可減少split時(shí)間極大的提升集群性能和吞吐量。

語句如下,


major_compact 'table_name'

  • hfile.block.cache.size

regionserver cache的大小,


#表示占hbase整個(gè)堆內(nèi)存的0.2

hfile.block.cache.size 0.2

往大的調(diào),會提升查詢性能;大量查詢?yōu)橹?,寫入頻率不高的情況下,設(shè)置為0.5即可.

  • hfile.hregion.memstore.flush.size

一個(gè)regionserver默認(rèn)的memstore的大小,默認(rèn)為64MB。參考平均每個(gè)regionserver管理的region數(shù)量,如果管理量不大,可適當(dāng)往大調(diào)整,如下:


hfile.hregion.memstore.flush.size 512MB

  • hfile.regionserver.global.memstore.upperLimit

  • hfile.regionserver.global.memstore.lowerLimit

upperLimit與lowerLimit指定memStore總使用內(nèi)存大小百分比。upperLimit 開始刷盤百分比,lowerLimit 停止刷盤百分比。

upperLimit與lowerLimit的關(guān)系及作用

讀取頻繁寫入不頻繁:適當(dāng)調(diào)小,讓更多內(nèi)存讓給查詢緩存。


hfile.regionserver.global.memstore.upperLimit 6  #開始刷盤

hfile.regionserver.global.memstore.lowerLimit 4  #停止刷盤

Hbase日常維護(hù)

  • 指定Rowkey規(guī)則

  • Region預(yù)分區(qū)

  • 開啟數(shù)據(jù)壓縮

  • 監(jiān)控報(bào)警

指定RowKey規(guī)則

不合理的規(guī)則,會造成regionserver上的數(shù)據(jù)不均勻,造成數(shù)據(jù)傾斜,進(jìn)行讓某一個(gè)regionserver過熱。

1、盡量保存Rowkey隨機(jī)性

指定Rowkey規(guī)則

2、預(yù)創(chuàng)建分區(qū)


create 't1','f1',SPLITS_FILE => 'splits.txt';

預(yù)先根據(jù)可能的RowKey劃分出多個(gè)Region而 不是一個(gè),從而可以將后續(xù)的多個(gè)操作均衡到不同的Region上,避免熱點(diǎn)現(xiàn)象的產(chǎn)生。

開啟數(shù)據(jù)壓縮

Hbase存儲的數(shù)據(jù)以PB級別為主,將造成服務(wù)器磁盤費(fèi)用過高。


create 'test',{NAME -> 'C', COMPRESSION => 'SNAPPY'};

Hbase默認(rèn)的壓縮算法有: GZ、LZO以及snappy,其中snappy算法其壓縮率與性能最優(yōu)。

監(jiān)控告警

安裝Cloudera 監(jiān)控對Hbase實(shí)時(shí)狀態(tài)進(jìn)行監(jiān)控。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容