分布式数据库HBase
HBase是在Hadoop平台上高性能、高可靠、面向列、可伸缩的分布式数据库。HBase不同于一般的关系数据库
HBase概述
数据量的激增和数据形式的改变给传统的关系型数据库带来了巨大压力,常常出现共享中心数据库的CPU和I/O负载大大增加,SQL语句执行速度变慢,数据库的性能直线下降等问题。为了解决这些问题,NoSQL(not only SQL)数据库应运而生,HBase是目前应用广泛的NoSQL数据库之一。
HBase特征
1)线性可拓展,用户可以通过增加系统规模线性的提高HBase的吞吐量和存储容量。 2)HBase是强一致性的系统,不是最终一致性数据存储,适合高速的计数聚合类任务。 3)HBase通过HRegion在集群上分布,随着数据的增长,HRegion会自动分隔和重新分布到其他HRegion Server。 4)HBase能够自动进行HRegion服务器的故障检测,当服务器故障时,能够自动恢复。 5)HBase通过MapReduce支持大规模并行处理,通过HDFS作为底层存储提供系统可靠性和健壮性的保证。 6)HBase支持易于使用的JavaAPI进行编程访问,且当前HBase的Java API已经较为完善。 7)可以通过服务器端的过滤器进行谓词下推查询。所有的过滤器都在服务器端生效,这样可以保证所有过滤掉的数据不会被传送到客户端。 8)为实时查询提供了块缓存和Bloom Filiter。块缓存主要用来保持底层HFile从HDFS读取的存储块,Bloom Filiter可以减少I/O数量,快速判断一个文件中是否包含指定行键。HBase的块缓存和Bloom Filiter提供了强大的功能来帮助用户实现实时查询。 9)HBase支持JMX提供的内置网页用于运维
HBase数据模型
数据模型相关概念
1、行键 HBase中每一行数据都由行键来标识。访问表中的行,可以通过单个行键来访问,也可以通过行键的范围来访问或者全表扫描。行键由任意字符串组成,最大长度是6kb,是将应用中的长度一般为10-100B。在HBase内部,行键以字节数据的形式按照字典顺序存储,因此在HBase中,相邻行键的行在存储时也相邻存放。在设计行键时,应充分利用这种特性,将经常一起访问的行存储在一起,同时应该避免时许或单调行键的使用,防止大量数据被分配到同一个HRegion形成热点,从而造成效率降低。 2、列族和列名 列族在创建表时定义,数量不能太多。HBase表由不同的列族组成,每一个列族又分为不同的列。列的引用格式为"column family:qualifer",列名以列族作为前缀,如sc:cno、sc:grade ,列名在不同的列族中可以重复。列的数量没有限制,一个列族可以有多达数百万个列。列族作为HBase表模式的一部分必须预先给出,而列则不需要预先定义,可以随后按需要随时加入。在行之间,列不需要保持一致性,差别也可能非常大。HBase访问控制、磁盘和内存的使用统计都是在列族层面进行的。 3、单元格 HBase将通过行键、列族和列确定的区域叫做单元格(cell)。单元格中存储的数据没有数据类型,总是被视为字节数组。 4、时间戳 HBase在进行数据存储时,不是直接覆盖旧的单元格数据,而是通过设定时间戳,在单元格内保留多个版本。时间戳由64位整型组成,时间戳一般在HBase写入数据时自动赋值,也可以由用户进行显示指定赋值。同一个单元格,不同版本的数据按照时间戳大小降序排列,即最新的数据总是排在最前面,访问时优先读取。
数据模型
HBase通过键值对进行数据的存储操作,其中键值对的表现形式如下
{row key,column family,column name,timestamp}->value
从概念结构来看,HBase是稀疏存储的,因此HBase表的某些列值可能为空,即不存在值。
HBase运行机制
系统架构
HBase是Hadoop生态系统的组成部分,HBase的系统架构遵循主从架构的原则,主要由HRegion Server服务器群和HMaster服务器构成,HBase数据库中的数据一般存储在Hadoop的HDFS分布式文件系统中,由HRegion Server服务器存取。 1、HMaster HMaster是HBase集群的主节点,主要负责管理和维护集群的运行状态,并且是所有元数据个该的接口。当HMaster节点发生故障时,由于客户端能够直接与HRegion Server进行交互,并且用于存储数据所在Region位置信息的.META表存储在ZooKeeper中,因此整个集群仍然可以继续运行。但是如果没有及时处理故障,HMaster的相关功能(如HRegion的迁移等)仍然会收到影响。为了避免HMaster的单点故障,Zookeeper提供了多HMaster机制,即HMaster可以启动多个,这些HMaster通过ZooKeeper的Master选举机制来保证同时处于活跃状态的只有一个,其余的则处于热预备状态。这种多HMaster的机制提高了HBase的可用性已经健壮性。 HMaster的主要功能: 1)为HRegion Server分配HRegion。 2)维持HRegion Server的负载均衡,调整HRegion分布。 3)检测HRegion Server的运行状态,当HRegion Server出现故障时,重新分配该HRegion Server中的HRegion,负责失效HRegion的迁移。 4)管理用户对表的增删改查操作 5)管理权限控制 2、Zookeeper Zookeeper是协同服务组件,对HBase中所有的HRegion Server进行协调处理。Zookeeper的主要功能。 1)负责HMaster的故障恢复工作,Zookeeper可以帮助选举出一个HMaster作为集群的总管,并保证在每个时刻都只有一台HMaster运行,这就避免了HMaster的"单点失效"问题。 2)存储HBase中ROOT表和.META.表的位置信息,即所有HRegion的寻址入口 3)实时监控HRegion Server的状态,并将消息回复给HMaster 3、HRegion HRegion是HBase中分布式存储和负载均衡的最小单位,当HBase表行的数量非常多,无法存储在一台机器上时,就需要将表的数据进行分区存储。表的分区是按行键进行的,在一定范围内的行键(起始键值和结束键值之间)会放到同一分区(HRegion)。每个分区在物理上由多个Store构成,每个Store对应了表在该分区中一个列族的物理存储。每个Store由一个MemStore(内存中的缓存)和多个StoreFile文件组成。 在HBase中,不同的HRegion可以分布在不同的HRegion Server上。 一个HRegion存储一个连续的集合,也就是说在同一个HRegion中数据介于start key与end key之间有序排列,同时一个HRegion只被一个HRegion Server服务。 当一个HRegion随着数据的插入而超过设定阈值时,会启动拆分(Split)操作。 在进行拆分时,无论进行多少次拆分操作,相同行键的数据一定存储在同一个HRegion。当一个分区切分成两个时,后一个分区中所有行键均大于前一个分区的行键。为了保证实现这一点,在写入数据时,HBase会按行键的ASCII码进行排序。 而另一个方面,随着表的增大,HRegion的数量也将越来越多,而过多的HRegion会增加Zookeeper的负担,因此,与拆分操作类似,当HRegion Server中的HRegion数量达到阈值时,HRegion Server会启动HRegion的合并操作。 1)客户端发起一个HRegion的合并处理并将请求发送给HMaster。 2)HMaster将HRegion移动到一起,并由HRegion Server将准备合并的HRegion进行合并,在.META.表中更新HRegion的元数据。 3)合并后的HRegion开始接收访问并将更新的HRegion信息发送给HMaster,至此HRegion合并操作结束。 HRegion Server 集群中负责管理HRegion的节点叫做HRegion Server,是HBase的核心模块,负责向外提供服务,进行数据读写。每个HRegion Server大约可以管理1000个HRegion。HRegion Server使用HDFS或本地文件系统以及其他存储系统作为底层存储,而HBase自身并不具备为何数据副本等的功能。 HRegion Server的主要功能 1)维护HMaster分配的HRegion,处理HRegion的I/O请求。 2)负责切分在运行过程中超过设定阈值的HRegion 3)StoreFile的合并 客户端 客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的HRegion位置信息,用来加快后续数据访问过程。此外,客户端使用HBase的RPC机制与HMaster进行管理类操作的信息以及与HRegion Server进行数据读写类操作。
HBase存储
在HBase中,Region是分布式存储的最小单元,但不是存储的最小单元,一个Region由一个或多个Store组成,每个Store保存一个列簇的数据。在每个Store中,由一个MemStore以及零或多个StoreFile组成。 MemStore的排列顺序为RowKey、Column Family、Column的顺序以及Timestamp的倒叙。HBase数据在更新时,首先写入HLog和MemStore中。当MemStore累积到超过阈值时,就会创建一个新的MemStore,而之前的MemStore则会刷写到磁盘中称为StoreFile,StoreFile底层由HFile实现。当一个Store中的StoreFile的文件数量达到一定的与之后,就会进行合并操作,即访问Store中全部的StoreFile和MemStore,将对同一个key的修改合并形成一个大的StoreFile。当StoreFile的文件大小达到阈值后,会对StoreFile进行Split操作,等分为两个StoreFile,而原StoreFile下线。 当系统出现意外时,可能导致MemStore中的数据丢失,此时使用HLog来恢复检查点之后的数据。 HFile是HBase中HRegion Server的底层文件存储格式,是Hadoop的二进制格式文件,由多个数据块组成。 Data块用于存放key-value数据,一般一个Data块大小默认为64kb。Meta块用于保存HFile的元数据,Index块用于记录Data和Meta块的偏移量,File Info块用于保存HFile的相关信息,Trailer块则用来保存指向其他块的指针以通过指针找到Meta Index块、Data Index块及File Info块。 HFile里面的每个Key-Value对就是一个简单的byte数组。这个byte数组中包含了很多项,并且有固定的结构。每个key-value由Key Length、Value Length、Key和Value四部分组成。 Key Length和Value Length占有固定的存储长度,分别表示Key和Value部分的长度。Key部分是变长的,Row Length表示RowKey的长度,接着是RowKey,然后是ColumnFamily Length表示列族长度,之后是列族,然后是列标识符与时间戳,并以Key Type结束。KeyType有4种类型,分别是Put、Delete、DeleteColumn和DeleteFamily。Value部分则纯粹的二进制数据。
HLog
在分布式系统环境中,一旦Region Server意外宕机,MemStore中的内存数据将会丢失,这就需要引入HLog。每个Region Server中都有一个HLog对象,它是WAL(write ahead log)类的实现。Region Server会将更新操作先记录到HLog中,然后再写入到Store的MemStore中,最终MemStore会将数据持久到HFile中,这样保证了写操作的可靠性。 当HMaster通过Zookeeper感知到某个Region Server意外宕机时,HMaster首先会处理遗留的Hlog文件,按Region将Log数据拆分为多个日志文件,分别放到对应Region的目录下。然后HMaster将宕机的Region Server中的Region重新分配到正常的Region Server中。对应的Region Server在加载Region的过程中,会发现有历史HLog日志文件需要处理,Region Server就会将日志进行重放。日志重放只是简单地读入一个日志,将日志中的条目写入到MemStore中,最终MemStore的数据会持久化到硬盘,从而实现失效Region的数据恢复。
HBase数据读写
数据读取 在HBase中,所有Region元数据的相关位置信息包括Region Server Name和Region标识符被存储在.META.表中,并且.META.表会随着存储的信息的增多而增大,进而分裂成多个新的Region 用于存储相关位置信息。 在.META.表中,RowKey由表名、起始行键和时间戳信息构成,info列族包含三个列:Regioninfo列、server列以及Server startcode列,其中Regioninfo用于记录行键范围、列族列表和属性;server用于记录Region Server对应的地址,Server startcode则记录了Region Server的启动时间戳。 存储所需数据的Region位置信息存储在.META.表中,Zookeeper记录了-ROOT-表的位置,而-ROOT-表则只有一个Region用于记录.META.表的位置信息。 三层结构寻址机制的第一步是在Zookeeper中查找-ROOT-表的位置信息。在获取-ROOT-表的位置信息后,第二步是从-ROOT-表中查找对应.META.表的位置信息。第三步从相应的.META.表中找到用户数据所在Region和Region Server并开始访问。 在HBase中,客户端会缓存一个Region的地址,因此在下次访问该Region时无须再次访问.META.表。但是若发生了Region的移动和合并等操作,则需要从新查找.META.表获得该Region的位置信息。若.META.表中的相应地址无效,则向-ROOT-表查询对应.META.表的地址;若-ROOT-的地址无效,则向Zookeeper查询-ROOT-表的地址。 数据读取流程 1)客户端通过Zookeeper中的文件得到-ROOT-表的位置,然后通过-ROOT-表来查询相应.META.的位置信息。 2)从.META.表中获取存放目标数据的Region信息,并找到对应的Region Server。 3)Region Server先从MemStore中读写数据,若查找不到,则到StoreFile中读取数据。 在HBase0.96及之后的版本中,为了提高性能及简化结构,将-ROOT-表去掉,只保留了可分区的.META.表,数据读取简化流程。 1)客户端通过zookeeper获取.META.表所在的Region Server的地址。 2)从.META.表中获取存放目标数据的Region信息,并找到对应的Region Server获取所需要的数据。 数据写入 1)客户端向Region Server提交写数据请求。 2)客户端通过zookeeper和HMaster沟通,并由HMaster分配要写入的Region Server,客户端获取到即将要写入的Region的位置信息后,将数据写入到MemStore中。 3)在数据写入到MemStore中时,会同样将操作和数据写入到HLog以防数据丢失或写入失败不能恢复。 4)若MemStore中数据量超过阈值溢满,会将数据溢写磁盘生成一个StoreFile文件。 5)StoreFile数量超过阈值时,会执行合并操作,即将若干StoreFile合并为一个StoreFile。在进行合并操作时,HBase会将读取的多个文件进行外部排序来合并成一个有序的大文件,此过程需要占用大量的I/O以及内存,短期内会对Region Server的性能产生影响但是有利于HBase的长期性能优化。 6)当单个StoreFile的大小超过阈值时,会执行Split操作,将当前Region拆分成2个Region。
|