HBase海量业务数据二级查询实现毫秒级响应,HBase原理与数据模型设计详解

    HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。表是行的集合,行是列族的集合,列族是列的集合,列是键值对的集合。

为什么需要使用HBase做海量业务数据的存储

1、扩展性强、容量大,支持百亿行、百万列数据的存储。HBase底层基于HDFS,可动态增加节点

2、高可靠性,WAL机制保证数据的安全性,Replication机制保证集群的数据容灾能力

3、高性能,实时读写。由于底层的LSM数据结构和RowKey有序排序,HBase具备较好的随机读取性能,RowKey的查询可达毫秒级响应

4、稀疏性、面向列存储,空列不占空间,且可动态添加,独立检索

5、支持多版本,每列的数据可存储多个版本,这一特性使得HBase能比较轻松的实现类似用户历史记录的功能

主从式架构

主服务器
    分配区域给区域服务器并在Apache ZooKeeper的帮助下完成这个任务。
    处理跨区域的服务器区域的负载均衡。它卸载繁忙的服务器和转移区域较少占用的服务器。
    通过判定负载均衡以维护集群的状态。
    负责模式变化和其他元数据操作,如创建表和列。

区域服务器
    与客户端进行通信并处理数据相关的操作。
    句柄读写的所有地区的请求。
    由以下的区域大小的阈值决定的区域的大小

Zookeeper
    在模拟和独立模式,HBase由zookeeper来管理。Zookeeper是一个开源项目,提供管理服务,如维护配置信息,命名,提供分布式同步等;Zookeeper代表不同区域的服务器短暂节点。主服务器使用这些节点来发现可用的服务器。除了可用性,该节点也用于追踪服务器故障或网络分区。客户端通过与zookeeper区域服务器进行通信。

     Zookeeper 用来协调分布式系统中集群状态信息的共享。Region Servers 和 在线 HMaster(active HMaster)和 Zookeeper 保持会话(session)。Zookeeper 通过心跳检测来维护所有临时节点(ephemeral nodes)。
    每个 Region Server 都会创建一个 ephemeral 节点。HMaster 会监控这些节点来发现可用的 Region Servers,同样它也会监控这些节点是否出现故障。
    HMaster 们会竞争创建 ephemeral 节点,而 Zookeeper 决定谁是第一个作为在线 HMaster,保证线上只有一个 HMaster。在线 HMaster(active HMaster) 会给 Zookeeper 发送心跳,不在线的待机 HMaster (inactive HMaster) 会监听 active HMaster 可能出现的故障并随时准备上位。
    如果有一个 Region Server 或者 HMaster 出现故障或各种原因导致发送心跳失败,它们与 Zookeeper 的 session 就会过期,这个 ephemeral 节点就会被删除下线,监听者们就会收到这个消息。Active HMaster 监听的是 region servers 下线的消息,然后会恢复故障的 region server 以及它所负责的 region 数据。而 Inactive HMaster 关心的则是 active HMaster 下线的消息,然后竞争上线变成 active HMaster。

HBase怎么做到海量数据存储和秒级响应的

    通过切分表、BlockCache,Block索引和布隆过滤器等技术,实现了单表海量数据的毫秒级查询。   

你真的正确建立HBase数据模型了吗

列簇的合理设计,结合业务设计一张大表的列簇时,应不超过5个

1.行键在表设计中非常重要,决定着应用中的交互以及提取数据的性能。

2.hbase表示非常灵活的,你可以使用字节数组存储任何数据。

3.存错任何数据到列族中,都可以使用相同的访问模式来访问数据。

4.索引仅仅是行键,好好利用,将成为你的优势。

5.深度高的表结构,可以使得你快速且简单的访问数据,但是却丢掉了原子性。宽度广的表结构,可以保证行级别的原子操作,但每行会有很多的列。

6.你需要好好的思考你的表设计,使得可以使用单条API就可以操作,而不是使用多条。hbase不支持跨行的事务,也尽量避免在客户端代码中使用这样的逻辑。

7.行键的哈希可以使得行键有固定的长度和更好的分布。但是却丢弃了使用字符串时的默认排序功能。

8.列标识可以用来存储数据,就像单元数据一样。

9.列标识的长度影响数据存储的足迹。也影响硬盘和网络IO的花销,所以应该尽量简洁。

10.列族名字的长度影响到发送到客户端的数据长度。所以尽量简洁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章