HBase 原理
一、HBase系统架构
HBase采用主从架构,主要由以下几个组件组成:
- Client:客户端,可以是HBase Shell、Java API客户端、Rest API等,提供访问接口,并维护对应的缓存以加速HBase的访问。客户端缓存Region的位置信息,以减少获取元数据的时间。
- Zookeeper:HBase通过Zookeeper来实现HMaster的高可用、HRegionServer的监控、元数据的入口以及集群配置的维护等工作。Zookeeper的选举机制保证集群中只有一个HMaster,同时监控HRegionServer的状态,并在HRegionServer异常时通过Master收到通知。
- HMaster:HMaster是所有HRegion Server的管理者,负责分配regions到每个HRegionServer,监控每个HRegionServer的状态,进行负载均衡和故障转移。
- HRegionServer:HRegionServer负责响应用户读写的IO请求,与底层HDFS交互,存储数据到HDFS,并处理分配给它的HRegion。它还负责刷新缓存到HDFS,维护HLog日志存储文件,处理来自客户端的读写请求,以及负责HRegion变大后的拆分和StoreFile的合并工作。
- HDFS:HDFS为HBase提供最终的底层数据存储服务,并提供高可用的支持。
二、HBase数据存储与读取
- 数据存储:
- HBase的数据存储在HDFS的文件中,数据按照表名进行组织存储。
- 每个表被分割成多个Region,每个Region存储一部分数据。Region通过一定的规则和策略进行划分,以实现数据的均衡存储和查询效率的最大化。
- Region内部由多个Store组成,每个Store对应表中的一个列族。Store由一个MemStore和零个或多个StoreFile(HFile)组成。MemStore负责保存内存中的数据,而StoreFile则是磁盘上保存原始数据的实际物理文件。
- 分布式存储:
HBase利用Hadoop分布式文件系统(HDFS)作为底层存储,将数据分片并分布存储在多个节点上。这种分布式存储方式使得HBase能够处理PB级别的数据量,并提供了高容错性和可扩展性。 - 表与Region:
在HBase中,数据被组织成表的形式,每个表由多个Region组成。Region是HBase中数据分布和负载均衡的基本单位,它包含了表中一部分行的数据。HBase会根据数据的量和访问模式动态地调整Region的数量和分布,以实现负载均衡和性能优化。 - 列族与Store:
HBase中的表由多个列族组成,每个列族包含了表中具有相同访问模式的列。每个列族在物理上对应一个或多个Store,Store是HBase中数据存储的基本单元,它包含了列族中所有列的数据。 - MemStore与HFile:
HBase使用内存中的MemStore来暂存写入的数据,以提高写入性能。当MemStore中的数据量达到一定阈值时,会触发Flush操作,将数据写入到磁盘上的HFile(Hadoop File)中。HFile是HBase中存储数据的物理文件,它采用了高效的压缩和编码技术,以减少磁盘IO和提高查询性能。 - WAL(Write-Ahead Logging):
为了保证数据的可靠性和持久性,HBase在写入数据时采用了WAL机制。在数据写入MemStore之前,会先写入到WAL文件中。如果系统发生故障,可以通过WAL文件来恢复未写入到HFile中的数据。
- 分布式存储:
- 数据读取:
- HBase的数据读取采用分布式的方式。客户端将查询请求发送到HMaster节点,HMaster通过查询元数据信息,确定数据所在Region的位置,并将查询请求转发到对应的HRegionServer节点。
- HRegionServer通过访问本地存储的数据,并将查询结果返回给客户端。在查询过程中,HRegionServer会首先查找内存(MemStore和BlockCache),如果未找到数据,则会到StoreFile上读取。为了提高读取效率,从StoreFile读取的数据会先写入BlockCache,再返回给客户端。
- 客户端缓存:
HBase客户端会缓存Region的位置信息,以减少获取元数据的时间。当客户端需要读取数据时,会首先根据缓存的Region位置信息找到对应的HRegionServer。 - MemStore与BlockCache:
当HRegionServer接收到读取请求时,会首先尝试从内存中的MemStore和BlockCache中读取数据。如果数据存在于MemStore或BlockCache中,则可以直接返回给客户端,无需访问磁盘。 - HFile读取:
如果MemStore和BlockCache中未找到数据,HRegionServer会到HFile中读取数据。HFile采用了高效的索引和数据结构,使得读取操作能够快速定位到所需的数据。 - 数据合并与过滤:
在读取数据时,HBase还支持数据的合并和过滤操作。例如,可以使用过滤器来只读取满足特定条件的行或列,以减少数据传输量并提高查询效率。 - 分布式读取:
HBase支持分布式读取操作,即多个HRegionServer可以同时处理同一个查询请求。这种方式可以充分利用集群的计算能力,提高查询性能。
- 客户端缓存:
三、HBase数据更新与删除
- 数据更新:
- HBase支持原子性的写入操作。所有的数据更新都是基于HLog(WAL)文件的。数据写入时会先写入到HLog文件中,以确保数据的持久化和可恢复性。
- 数据写入HLog文件后,再写入到MemStore中。由于MemStore是内存中的数据,写入速度非常快,因此HBase能够提供高性能的写入能力。
- 当MemStore中的数据达到一定的阈值时,会触发Flush操作,将MemStore中的数据写入到StoreFile中。这个过程是异步的,不会阻塞客户端的写入请求。
- 更新方式:
- 可以通过put命令来更新数据,这实际上是向表中插入一条新的数据记录,如果记录的row key已经存在,则会覆盖原有记录。
- 也可以使用update命令来覆盖写入数据,这种方式需要指定表名、row key、列名和值。
- 更新原理:
- 客户端向HBase的主节点发送更新请求。
- 主节点接收请求后,根据表的分区规则将请求转发给相应的Region Server。
- 目标Region Server接收到请求后,在内存中查找要更新的数据。
- 如果数据在内存中存在(即MemStore中),Region Server会直接更新内存中的数据,并将更新后的数据写入WAL(Write-Ahead Log)日志文件中以保证数据的持久性。
- 如果数据在内存中不存在,Region Server会从HFile(HBase的底层数据存储文件)中检索数据,加载到内存中进行更新,并写入WAL日志文件。
- 更新操作完成后,Region Server会将更新后的数据保留在MemStore中,等待后续的刷写操作。
- 当MemStore中的数据达到一定大小时,Region Server会将数据刷写到磁盘上的HFile中。
- 更新成功后,Region Server将响应返回给客户端。
- 数据删除:
- HBase的数据删除采用标记删除的方式。即将要删除的数据标记为已删除,实际上并不从磁盘上删除。直到垃圾回收机制将其清理掉。
- 删除方式:
- 可以使用delete命令来删除数据。如果只需要删除特定列的数据,可以在delete命令中指定列名。
- 删除原理:
- HBase的删除操作不会立即将数据从磁盘上删除,而是通过插入一个keytype为Delete的KeyValue来标记数据已被删除。
- 当执行删除操作时,HBase会新插入一条与要删除的数据相同的KeyValue数据,但keytype设置为Delete。
- 删除标记会一直保留在StoreFile(HBase中存储数据的物理文件)中,直到发生Major Compaction操作时,数据才会被真正地从磁盘上删除,同时删除标记也会从StoreFile中删除。
- 默认情况下,删除操作会标记所有版本的数据。因此,在执行Get或Scan操作时,不会看到已删除的单元格(行或列)。
- TTL(Time To Live)功能:
- HBase允许为行或单元格设置存活时间(TTL),超出后数据会自动删除。
- ColumnFamilies可以设置TTL长度(以秒为单位),HBase将在到期时间后自动删除行。这适用于行的所有版本,包括当前版本。
- HBase还支持按每个单元格设置生存时间(TTL),Cell TTL以毫秒为单位表示,且不能超过ColumnFamily的TTL。
四、HBase数据访问控制
HBase通过访问控制列表(ACL)来控制用户对表和列族的访问权限。支持读、写和管理等多种操作,管理员可以授予或撤销用户的权限。
- 用户身份验证
- HBase通过ZooKeeper或其他认证机制实现客户端的身份验证。
- 客户端在访问HBase之前,需要向认证服务器提供身份信息,如用户名和密码。
- 认证服务器验证客户端的身份信息后,会生成一个会话标识符,客户端使用该标识符与HBase通信。
- 授权机制
- HBase通过访问控制列表(ACL)实现用户和角色的授权。
- ACL可以设置在表、列族和列级别,以实现精细的权限控制。
- 管理员可以创建角色,并为角色分配特定的权限,然后将角色分配给用户。
- 用户根据所分配的角色或ACL规则,获得对HBase数据的访问权限。
- 数据加密
- HBase支持多种数据加密方法,如AES、DES和RSA等。
- 管理员可以配置HBase的加密策略,指定加密算法和密钥。
- 客户端在写入数据时,通过加密策略将数据加密后存储在HBase中。
- 客户端在读取数据时,通过加密策略解密数据。