为什么说hbase是一个面向列的数据库?

为什么说hbase是一个面向列的数据库?,第1张

在说HBase之前,我想再唠叨几句。做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了,结果您的系统应付不过来了了,不干了,这岂不是咱哥几个的悲哀,说时髦点就叫“杯具啊”。\x0d\\x0d\其实说白了,这些就是事先没有认清楚互联网应用什么才是最重要的。从系统架构的角度来说,互联网应用更加看重系统性能以及伸缩性,而传统企业级应用都是比较看重数据完整性和数据安全性。那么我们就来说说互联网应用伸缩性这事儿对于伸缩性这事儿,哥们儿我也写了几篇博文,想看的兄弟可以参考我以前的博文,对于web server,app server的伸缩性,我在这里先不说了,因为这部分的伸缩性相对来说比较容易一点,我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。\x0d\\x0d\首先刚开始,人不多,压力也不大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一个Server里,包括web server,app server,db server,但是随着人越来越多,系统压力越来越多,这个时候可能你把web server,app server和db server分离了,好歹这样可以应付一阵子,但是随着用户量的不断增加,你会发现,数据库这哥们不行了,速度老慢了,有时候还会宕掉,所以这个时候,你得给数据库这哥们找几个伴,这个时候Master-Salve就出现了,这个时候有一个Master Server专门负责接收写 *** 作,另外的几个Salve Server专门进行读取,这样Master这哥们终于不抱怨了,总算读写分离了,压力总算轻点了,这个时候其实主要是对读取 *** 作进行了水平扩张,通过增加多个Salve来克服查询时CPU瓶颈。一般这样下来,你的系统可以应付一定的压力,但是随着用户数量的增多,压力的不断增加,你会发现Master server这哥们的写压力还是变的太大,没办法,这个时候怎么办呢?你就得切分啊,俗话说“只有切分了,才会有伸缩性嘛”,所以啊,这个时候只能分库了,这也是我们常说的数据库“垂直切分”,比如将一些不关联的数据存放到不同的库中,分开部署,这样终于可以带走一部分的读取和写入压力了,Master又可以轻松一点了,但是随着数据的不断增多,你的数据库表中的数据又变的非常的大,这样查询效率非常低,这个时候就需要进行“水平分区”了,比如通过将User表中的数据按照10W来划分,这样每张表不会超过10W了。\x0d\\x0d\综上所述,一般一个流行的web站点都会经历一个从单台DB,到主从复制,到垂直分区再到水平分区的痛苦的过程。其实数据库切分这事儿,看起来原理貌似很简单,如果真正做起来,我想凡是sharding过数据库的哥们儿都深受其苦啊。对于数据库伸缩的文章,哥们儿可以看看后面的参考资料介绍。\x0d\\x0d\好了,从上面的那一堆废话中,我们也发现数据库存储水平扩张scale out是多么痛苦的一件事情,不过幸好技术在进步,业界的其它弟兄也在努力,09年这一年出现了非常多的NoSQL数据库,更准确的应该说是No relation数据库,这些数据库多数都会对非结构化的数据提供透明的水平扩张能力,大大减轻了哥们儿设计时候的压力。下面我就拿Hbase这分布式列存储系统来说说。\x0d\\x0d\一 Hbase是个啥东东? \x0d\在说Hase是个啥家伙之前,首先我们来看看两个概念,面向行存储和面向列存储。面向行存储,我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的,面向行存储的数据库主要适合于事务性要求严格场合,或者说面向行存储的存储系统适合OLTP,但是根据CAP理论,传统的RDBMS,为了实现强一致性,通过严格的ACID事务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣,而目前的很多NoSQL产品,包括Hbase,它们都是一种最终一致性的系统,它们为了高的可用性牺牲了一部分的一致性。好像,我上面说了面向列存储,那么到底什么是面向列存储呢?Hbase,Casandra,Bigtable都属于面向列存储的分布式存储系统。看到这里,如果您不明白Hbase是个啥东东,不要紧,我再总结一下下:\x0d\\x0d\Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写 *** 作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。\x0d\\x0d\二 Hbase数据模型 \x0d\HBase,Cassandra的数据模型非常类似,他们的思想都是来源于Google的Bigtable,因此这三者的数据模型非常类似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我没发现。好了,废话少说,我们来看看Hbase的数据模型到底是个啥东东。\x0d\\x0d\在Hbase里面有以下两个主要的概念,Row key,Column Family,我们首先来看看Column family,Column family中文又名“列族”,Column family是在系统启动之前预先定义好的,每一个Column Family都可以根据“限定符”有多个column下面我们来举个例子就会非常的清晰了。\x0d\\x0d\假如系统中有一个User表,如果按照传统的RDBMS的话,User表中的列是固定的,比如schema 定义了name,age,sex等属性,User的属性是不能动态增加的。但是如果采用列存储系统,比如Hbase,那么我们可以定义User表,然后定义info 列族,User的数据可以分为:info:name = zhangsan,info:age=30,info:sex=male等,如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了。\x0d\\x0d\也许前面的这个例子还不够清晰,我们再举个例子来解释一下,熟悉SNS的朋友,应该都知道有好友Feed,一般设计Feed,我们都是按照“某人在某时做了标题为某某的事情”,但是同时一般我们也会预留一下关键字,比如有时候feed也许需要url,feed需要image属性等,这样来说,feed本身的属性是不确定的,因此如果采用传统的关系数据库将非常麻烦,况且关系数据库会造成一些为null的单元浪费,而列存储就不会出现这个问题,在Hbase里,如果每一个column 单元没有值,那么是占用空间的。下面我们通过两张图来形象的表示这种关系:\x0d\\x0d\上图是传统的RDBMS设计的Feed表,我们可以看出feed有多少列是固定的,不能增加,并且为null的列浪费了空间。但是我们再看看下图,下图为Hbase,Cassandra,Bigtable的数据模型图,从下图可以看出,Feed表的列可以动态的增加,并且为空的列是不存储的,这就大大节约了空间,关键是Feed这东西随着系统的运行,各种各样的Feed会出现,我们事先没办法预测有多少种Feed,那么我们也就没有办法确定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基于列存储的数据模型就非常适合此场景。说到这里,采用Hbase的这种方式,还有一个非常重要的好处就是Feed会自动切分,当Feed表中的数据超过某一个阀值以后,Hbase会自动为我们切分数据,这样的话,查询就具有了伸缩性,而再加上Hbase的弱事务性的特性,对Hbase的写入 *** 作也将变得非常快。\x0d\\x0d\上面说了Column family,那么我之前说的Row key是啥东东,其实你可以理解row key为RDBMS中的某一个行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询需求来设计了额。我还拿刚才那个Feed的列子来说,我们一般是查询某个人最新的一些Feed,因此我们Feed的Row key可以有以下三个部分构成,这样以来当我们要查询某个人的最进的Feed就可以指定Start Rowkey为,End Rowkey为来查询了,同时因为Hbase中的记录是按照rowkey来排序的,这样就使得查询变得非常快。\x0d\\x0d\三 Hbase的优缺点 \x0d\1 列的可以动态增加,并且列为空就不存储数据,节省存储空间\x0d\\x0d\2 Hbase自动切分数据,使得数据存储自动具有水平scalability\x0d\\x0d\3 Hbase可以提供高并发读写 *** 作的支持\x0d\\x0d\Hbase的缺点:\x0d\\x0d\1 不能支持条件查询,只支持按照Row key来查询\x0d\\x0d\2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉\x0d\\x0d\四补充\x0d\1数据类型,HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。\x0d\2数据 *** 作:HBase只有很简单的插入、查询、删除、清空等 *** 作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接 *** 作。 \x0d\3存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的 \x0d\4数据维护,HBase的更新 *** 作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改\x0d\5可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能

1、FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。

2、RegionServer

HRegionServer is the RegionServer implementation It is responsible for serving and managing regions In a distributed cluster, a RegionServer runs on a DataNode

3、Regions

Regions are the basic element of availability and distribution for tables, and are comprised of a Store per Column Family The hierarchy of objects is as follows:

Table                    (HBase table)

    Region              (Regions for the table)

        Store            (Store per ColumnFamily for each Region for the table)

            MemStore    (MemStore for each Store for each Region for the table)

            StoreFile    (StoreFiles for each Store for each Region for the table)

                Block    (Blocks within a StoreFile within a Store for each Region for the table)

对应的数据存储结构:
Region结构说明

(二)单个节点停止
HBASE 节点停止分为优雅停止(Graceful Stop)和立即停止(• Stop  )

• Graceful Stop 该方式会促使Regions重新分配到其它的RegionServer节点,下线region在新节点部署后才重新分配下一个region,当所有region都在新节点部署后才下线自己,这样增加节点断开hbase服务的有效性。该方式设置了一个超时时间,如果在指定的超时时间没有成功完成停止节点的工作,会转为使用kill -9 终止RegionServe服务。恢复时会从受影响的region开始。执行的命令:

$ /bin/graceful_stopsh

Usage: graceful_stopsh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--

rest] &hostname>

thrift If we should stop/start thrift before/after the hbase stop/start

rest If we should stop/start rest before/after the hbase stop/start

restart If we should restart after graceful stop

reload Move offloaded regions back on to the stopped server

debug Move offloaded regions back on to the stopped server

hostname Hostname of server we are to stop

• Stop    刚方式RegionServer会立即关所有的region,然后关闭自己,不会将Regions重新分配到其它的RegionServer节点,这种方式当region比较多时关闭有可能需要很长时间,该方式使用ill -5 终止RegionServe服务。

$ /bin/hbase-daemonsh stop regionserver

两种方式都建议关闭Load Balancer:

关闭命令:

hbase(main):001:0> balance_switch false

开启命令:

balance_switch true

(三)、节点启动

手工启动命令:
$ /bin/hbase daemonsh start regionserver

bin/graceful_stopsh --restart --reload --debugregionserver_nodename;

他会先将需要重启的regionserver上面的所有region迁移到其它的服务器,然后重启,最后又会将之前的region迁移回来。

Hbase中每个Region自己维护其在hbase:meta表中的信息。
状态机中包括下面几种状态

offline:region离线没有开启

opening:region正在被打开

open:region正在打开,并且region server通知了master

failed_open:regionserver打开失败

closing:region正在被关闭

closed:regionserver正在关闭,并且已经通知了master

failed_close:regionserver关闭失败了

splitting:region server通知master,region正在被切分

split:region server通知master,region已经被切分完了

spliting_new:region是切分过程中新建的文件

merging:regionserver通知master region正在合并

merged:regionserver通知master region合并完了

merging_new:region是合并新建出来的

不同的颜色是不同含义:

棕色:离线状态,属于一种短暂的瞬间状态(比如关闭后开启的中间状态)、停止状态或者初始化的时候的状态

绿色:正常的状态,可以支持请求访问

蓝色:短暂的状态

红色:失败

:合并或者切分的状态

灰色:刚开始的状态

各个序号代表不同的 *** 作场景:

1、Master向region server发起region从offline到openning的状态请求,regionserver如果没有收到,master会尝试重试几次。RegionServer接收到请求后,regin状态变成opening

2、如果Master发起的open请求超过次数,那么无论region server是否已经打开region,master都会命令region server关闭文件,状态变为closing

3、当region server打开region后,会尝试通知master,让他把region状态修改为open,并通知regsion server。这样region才能变为open状态

4、如果region server打开四百,会尝试通知master。master会把region的状态变更为closed,并且尝试去其他的region server打开region

5、如果master尝试几次后,都没有打开region,就会把状态变更为failed_open

6、master通知region server关闭region,如果没有反应,会重试

7、如果region server没有在线,会抛出异常。然后region的状态会变成closing

8、如果region server在线,但是好几次都没响应,就会更新状态为failed_close

9、如果region server收到请求,并且关闭了region,那么会通知master把region状态修改为closed。并且把region分配给其他的server

10、在分配之前,master会先把region从closed状态转换为offline

11、如果region server正在切分region,会通知mastere。master把region状态由open变为splitting,并且把新增两个region的信息,这两个region都是splitting_new状态

12、如果region切分成功,当前的region状态从splitting变成split;新增的两个region状态从splitting_new变成open

13、如果切分失败,状态从splitting回到open,两个region也从splitting_new变成offline

14、如果region server想要合并两个region,那么也会先通知master。master把两个region从open变成merging,然后增加一个新的region,状态为merging_new

15、合并成功,旧的region从merging变为merged,新的region从merging_new变为open

16、如果合并失败,region的状态从merging变回open,新建的一个region状态又变成offline

17、如果管理员通过hbase shell *** 作分配region,master会尝试把失败的状态变成close
baiduX��,�

选择
BHbase是分布式的数据库, 可以通过不断增加服务器,来增加计算和存储能力
CHbase中一个存贮单元可以保存同一份数据的多个版本
A是错的,hbase是面向列的存储
D hbase可扩展性和海量数据存储,恰恰可以用在高并发场景。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10570350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存