hbase適合用於海量資料的儲存,橫向擴充套件非常方便,隨著資料的增長,訪問的效能卻不會出現很大的下降。這是很多的公司選擇使用hbase作為分布式資料庫的乙個很重要的原因。正常來說,乙個hbase集群肯定不止跑乙個業務,即多個業務共享集群資源。這些業務中有的對效能要求很高;有的業務要求儲存很大;有的業務屬於公司的核心業務,需要重點保障;有的業務是離線業務,短時間訪問不了影響也不大。這裡就會產生對於不同業務的不同sla需求。也就是集群需要有隔離的功能。
全部業務共享集群資源的場景下,如果出現問題,將會同時影響多個業務。那麼怎麼來解決集群的隔離?不會因為某個業務的訪問量陡增或者不合理使用,導致其他的業務受到影響?
最先想到的解決辦法可能是搭建多個hbase集群,將不同的業務使用不同的hbase,這樣就能很好地實現業務之間的隔離。但是這裡會存在如下幾個問題:
1、管理麻煩
2、集群很小,效能不太好
3、單台機器影響大(集群小,單台上的region多,出問題影響面廣)
4、需要的zk、master、namenode等的機器更多
5、抗單個業務陡增的場景不強
因此真實的使用場景,不太可能為每個業務搭建單獨的集群,最多就是給非常重要的業務搭建乙個單利的集群,其他的非核心業務放在乙個大集群中,隔離還是剛需。
那在hbase中是否有更好一點的隔離策略?
答案是有,之前yahoo在大規模使用hbase集群的時候也遇到了隔離的問題,他們開發了rsgroup解決方案,比較好地解決了不同應用在regionserver上的隔離。並將rsgroup推薦給了官方,官方版本整合了yahoo提交的rsgroup隔離方案。rsgroup方案的原理如下下圖所示:
在上圖中有兩個rsgroup,具體原理為:
1、將不同的regionserver分配到不同的rsgroup中
上圖中regionserver1、regionserver2、regionserver3被分配到了important_group中,regionserver4、regionserver5、regionserver6被分配到了normal_group中。
2、將不同的表分配到不同的group中
上圖中表t1和t2分配到了important_group,表t3和t4分配到了normal_group。
3、表、regionserver分配到具體的rsgroup後就達到了隔離的效果
做好分配後,以表t1為例,t1的所有region都只會落到important_group所屬的regionserver中。此時當normal_group的任何regionserver異常,都不會引起t1表的異常(datanode異常會有影響,後面有說明)。只有當important_group所屬的regionserver異常,並且有t1的region落在該regionserver上才會有影響。表代著業務,你可以將同型別(重要等級)的表放在同乙個rsgroup中,這就實現了不同業務的隔離。
對於於重點業務,可以分配更多的regionserver的機器,負載更低;而對於非重點業務,則可以更少的機器承擔負更多的業務。目前datanode已經支援了分級儲存,甚至可以將重點業務使用不同的介質,比如ssd。
優點:
管理方便缺點:充分利用集群的資源
機器騰挪擴容很方便
有利於整個集群效能的提公升
隔離不徹底,hdfs層還是共用,如果datanode出現異常,還是會影響到多個業務。修改hbase-site.xml, 並重啟master即可
hbase.coprocessor.master.classes
org.apache.hadoop.hbase.rsgroup.rsgroupadminendpoint
hbase.master.loadbalancer.class
org.apache.hadoop.hbase.rsgroup.rsgroupbasedloadbalancer
cdh集群配置方法:
幫助命令解釋的很詳細,大概有9個命令, 這裡大致說一下:
add_rsgroup 'my_group'
例如:add_rsgroup 'g01_group'
例如:
move_servers_rsgroup 'g01_group',['a2502f09:60020'](a2502f09 和 a2502f12 是機器別名)move_servers_rsgroup 'g01_group',['a2502f12:60020']
經測試, rs移動到新組的時候, 該rs上原有的region會自動分配到原組的其他rs上, 移動之後的rs是空的
move_tables_rsgroup '組名',['table1','table2']
例如:經測試, 表移動到新組, 所有和表相關的region會自動移動到新組所屬的regionserver上move_tables_rsgroup 'g01_group', ['hbase:meta']
注意:如果表的region很多,建議每次只遷移乙個表,否則很容易超時。
get_rsgroup 'default'get_rsgroup 'g01_group'
balance_rsgroup 'g01_group'
get_server_rsgroup 'server1:port1'例如:
get_server_rsgroup 'a2502f09:60020'
get_table_rsgroup 'hbase:meta'
list_rsgroups也可用正規表示式篩選
list_rsgroups 'de*'
remove_rsgroup 'g01_group'1、遷移完錶後記得做major compact(本地化) major_compact 'tablename'
2、遷移完錶後做hbase hbck校驗,防止新增遷移表的時候有部分region未上線的情況
3、刪除group之前需要將group下的regionserver和table都移除掉
4、default組和其他的rsgroup不一樣,default是動態的,其他的group則是靜態的
HBase隔離方案實戰 rsgroup
本文參考 這篇文章寫的很好,就是命令沒法用,一度以為我們的集群不支援rsgroup,無意中試出了幫助命令,才發現,命令不太對,不知道是作者粗心還是每個版本的命令不一樣,這裡做了一些修正,我們的集群是cdh5.12.1,hbase是1.2.0 hbase適合用於海量資料的儲存,橫向擴充套件非常方便,隨...
HBase程式設計實戰
程式設計實現以下指定功能,並用hadoop提供的hbase shell命令完成相同任務 1 列出hbase所有的表的相關資訊,例如表名 public static void main string args throws ioexception if admin null admin.close i...
《HBase實戰》一導讀
hbase實戰 2008年秋季我開始和hbase結緣,當時它還是乙個新生專案,一年前剛剛發布。早期版本出來時,hbase表現很不錯,但是也不是沒有令人尷尬的缺陷。hbase專案當時有近10個軟體commiffer,作為乙個apache子專案還算不錯。接下來是nosql宣傳的高潮。當時專有名詞nosq...