概念
分布式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ù)的存儲

數(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ì)如下:

如此配置,每天的入庫量在86億條。計(jì)算規(guī)則:
1w/s * 3600秒/h * 24h * 10臺主機(jī) = 86400萬 ,約等于86億條
確定所需要的內(nèi)存
Hbase內(nèi)存型數(shù)據(jù)庫是同存型數(shù)據(jù)庫,數(shù)據(jù)寫入規(guī)則:
先存儲在Memostore中 ,
同時(shí)將經(jīng)常查詢的熱數(shù)據(jù)緩存在內(nèi)存中RedCache,提高性能。

因此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,如下圖:

確定磁盤類型和容量
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ù)即可。

1、副本數(shù)與網(wǎng)絡(luò)帶寬算法
預(yù)估方式:
- 假設(shè)一條數(shù)據(jù)大小為10kb,10萬/秒的寫入速度,每秒寫入的數(shù)據(jù)量如下:
10kb * 10萬/1024MB = 976MB

- 保存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ù)

- 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ù)合并與分裂的基本流程。

先寫入Memstore,超過閥值,寫入StoreFile(HFile), 超過閥值,啟動compaction,合并為一個(gè)StoreFile,當(dāng)合并后的StoreFile大于hbase.regionserver.max.filesize所設(shè)置的參數(shù)時(shí),會觸發(fā)分裂動作,拆分為兩個(gè)region
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)用讀寫沖擊較大。
實(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
- 高峰時(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 停止刷盤百分比。

讀取頻繁寫入不頻繁:適當(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ī)性

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)控。