《HBase 不睡觉》第一章 - 初识 HBase

《HBase 不睡觉书》是一本让人看了不会睡着的HBase技术书籍,写的很是不错,为了加深记忆,决定把书中重要的部分整理成读书笔记,便于后期查阅,同时但愿为初学 HBase 的同窗带来一些帮助。数据库

目录

1、基本概念

一、CAP 理论

CAP 全称 是Consistency Availability and Partition tolerance:编程

  • Consistency(一致性):数据一致更新,全部数据变更都是同步的;
  • Availability(可用性):良好的响应性能;
  • Partition tolerance(分区容错性):可靠性。

任何分布式系统只可同时知足二点,无法三者兼顾。架构师不要将精力浪费在如何设计能知足三者的完美分布式系统,而是应该进行取舍。缓存

CAP 理论

二、NoSQL

不少人以 为 NoSQL 是非 SQL 的意思,其实它是 Not Only SQL 的缩写,意思是不仅是 SQL。与关系型数据库正好相反,非关系型数据库 NoSQL 对事务性的要求并不严格,甚至能够说是至关马虎。服务器

有些数据库是保证最终一致性,信息不会当即同步,而是通过了一段时间才达到一致性。好比你发了一篇文章,你的一部分朋友立马看到了这篇文章,另外一部分朋友却要等到 5 分钟以后才能刷出这篇文章。架构

虽然有延时,可是对于一个娱乐性质的 Web 2.0 网站又有谁会在意这几分钟的延时呢?若是你用传统关系型数据库,网站可能早就宕掉了。并发

有些数据库能够在部分机器宕机的状况下依然能够正常运行,其实原理就是把同一份数据复制成了好几份放到了好几个地方,正应了那句老话:不要把鸡蛋同时放在一个篮子里。负载均衡

Not Only SQL

三、列式存储与行式存储

列式存储(Column-based)是相对于传统关系型数据库的行式存储(Row-based)来讲的,简单来讲二者的区别就是如何组织表。分布式

将表放入存储系统中有两种方法,而咱们绝大部分是采用行存储的。行存储法是将各行放入连续的物理位置,这很像传统的记录和文件系统。列存储法是将数据按照列存储到数据库中,与行存储相似,下图是两种存储方法的图形化解释。oop

列式、行式存储模型

应用行式存储的数据库系统称为行式数据库,同理应用列式存储的数据库系统称为列式数据库。post

列式、行式数据库的区别

列式存储的主要优势之一就是能够大幅下降系统的 I/O,尤为是在海量数据查询时,经过下面这张图,相信咱们可以完全明白这一点。

列存储能够大幅下降系统的 I/O

2、何时使用 HBase?

HBase 的存储是基于 Hadoop 的,Hadoop 实现了一个分布式文件系统(HDFS)。HDFS 有高容错性的特色,被设计用来部署在低廉的硬件上,并且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于 Hadoop 意味着 HBase 与生俱来的超强的扩展性和吞吐量

HBase 采用的是 Key/Value 的存储方式,这意味着,即便随着数据量增大,也几乎不会致使查询的性能降低。

HBase 又是一个列式数据库,当你的表字段不少的时候,你甚至能够把其中几个字段放在集群的一部分机器上,而另外几个字段放到另一部分机器上,充分分散了负载压力。

然而,如此复杂的存储结构和分布式的存储方式带来的代价就是:哪怕只是存储少许数据,它也不会很快。因此我经常跟人说:HBase 并不快,只是当数据量很大的时候它慢的不明显

不适合使用 HBase 的场景:

  • 主要需求是数据分析,好比作报表。
  • 单表数据量不超过千万。

适合使用 HBase 的场景:

  • 单表数据量超千万,并且并发还挺高。
  • 数据分析需求较弱,或者不须要那么灵活或者实时

3、HBase 部署架构

一、部署架构

HBase 有两种服务器:Master 服务器和 RegionServer 服务器,通常一个 HBase 集群有一个 Master 服务器和多个 RegionServer 服务器。

Master 服务器负责维护表结构信息,实际的数据都存储在 RegionServer 服务器上,RegionServer 是直接负责存储数据的服务器,RegionServer 保存的表数据直接存储在 Hadoop 的 HDFS 上。

HBase 有一点很特殊:客户端获取数据由客户端直连 RegionServer 的,因此当 Master 挂掉以后你依然能够查询数据,只是丧失了表管理相关的能力。

RegionServer 很是依赖 ZooKeeper 服务,能够说没有 ZooKeeper 就没有 HBase。ZooKeeper 管理了 HBase 全部 RegionServer 的信息,包括具体的数据段存放在哪一个 RegionServer 上。客户端每次与 HBase 链接,其实都是先与 ZooKeeper 通讯,查询出哪一个 RegionServer 须要链接,而后再链接 RegionServer。

HBase 总体架构

二、Region

Region 就是一段数据的集合,HBase 中的表通常拥有一个到多个 Region,Region 有如下特性:

  • Region 不能跨服务器,一个 RegionServer 上有一个或者多个 Region;
  • 数据量小的时候,一个 Region 足以存储全部数据;可是,当数据量大的时候,HBase 会拆分 Region;
  • 当 HBase 在进行负载均衡的时候,也有可能会从一台 RegionServer 上把 Region 移动到另外一台 RegionServer 上;
  • Region 是基于 HDFS 的,它的全部数据存取操做都是调用了 HDFS 的客户端接口来实现的。

三、RegionServer

RegionServer 就是存放 Region 的容器,直观上说就是服务器上的一个服务。通常来讲,一个服务器只会安装一个 RegionServer 服务。当客户端从 ZooKeeper 获取 RegionServer 的地址后,它会直接从 RegionServer 获取数据。

四、Master

HBase 中 Master 的角色不像领导,更像是打杂的。客户端从 ZooKeeper 获取了 RegionServer 的地址后,会直接从 RegionServer 获取数据。其实不光是获取数据,包括插入、删除等全部的数据操做都是直接操做 RegionServer,而不须要通过 Master。

Master 只负责各类协调工做,好比建表、删表、移动 Region、合并等操做。它们的共性就是须要跨 RegionServer,这些操做由哪一个 RegionServer 来执行都不合适,因此 HBase 就将这些操做放到了Master上了。

这种结构的好处是大大下降了集群对 Master 的依赖,而 Master 节点通常只有一个到两个,一旦宕机,若是集群对 Master 的依赖度很大,那么就会产生单点故障问题。在 HBase 中,即便 Master 宕机了,集群依然能够正常地运行,依然能够存储和删除数据。

4、HBase 存储架构

一、存储架构

最基本的存储单位是列(column),一个列或者多个列造成一行(row)。传统数据库是严格的行列对齐,好比这行有三个列 a、b、c,下一行确定也有三个列 a、b、c。而在 HBase 中,这一行有三个列 a、b、c,下一个行也许是有 4 个列 a、e、f、g。

在 HBase 中,行跟行的列能够彻底不同,这个行的数据跟另一个行的数据也能够存储在不一样的机器上,甚至同一行内的列也能够存储在彻底不一样的机器上!每一个行(row)都拥有惟一的行键(row key)来标定这个行的惟一性。每一个列都有多个版本,多个版本的值存储在单元格(cell)中,若干个列又能够被归类为一个列族

HBase 列存储

二、行键(rowkey)

rowkey 是由用户指定的一串不重复的字符串,rowkey 会直接决定这个 row 的存储位置的。HBase 中没法根据某个 column 来排序,系统永远是根据 rowkey 来排序的(根据字典排序),rowkey 就是决定 row 存储顺序的惟一凭证。

若是插入 HBase 的时候,不当心用了以前已经存在的 rowkey,这会把以前存在的那个 row 更新掉。以前已经存在的值会被放到这个单元格的历史记录里面,并不会丢掉,只是你须要带上版本参数才能够找到这个值。一个列上能够存储多个版本的单元格(cell),单元格就是数据存储的最小单元。

三、列族(column family)

若干列能够组成列族(column family),建表的时候有几个列族是一开始就定好的。表的不少属性,好比过时时间、数据块缓存以及是否压缩等都是定义在列族上,而不是定义在表上或者列上。

同一个表里的不一样列族能够有彻底不一样的属性配置,可是同一个列族内的全部列都会有相同的属性,由于他们都在一个列族里面,而属性都是定义在列族上的。一个没有列族的表是没有意义的,由于列必须依赖列族而存在。

列名称的规范是列族:列名,好比 brother:age、brother:name。列族存在的意义是:HBase 会把相同列族的列尽可能放在同一台机器上,若是想让某几个列被放到一块儿,你就给他们定义相同的列族。

一个表要设置多少个列族比较合适?官方的建议是:越少越好(通常来讲一个就够用了),由于 HBase 并不但愿你们指定太多的列族。列族太多会极大程度地下降数据库性能;此外,列族定得太多,容易出 BUG。

四、单元格(cell)

一个列上能够存储多个版本的值,多个版本的值被存储在多个单元格里面,多个版本之间用版本号(Version)来区分,惟一肯定一条结果的表达式应该是:行键:列族:列:版本号(rowkey:column family:column:version)。不过,版本号是能够省略的,若是你不写版本号,HBase 默认返回最后一个版本的数据。

HBase 存储结构

一个 Region 就是多个行(Row)的集合,在 Region 中行的排序按照行键(rowkey)字典排序。

5、总结

一、HBase 与关系型数据库的功能对比

HBase 与关系型数据库的功能对比

二、主要概念回顾

  • Maser
  • RegionServer
  • HDFS
  • Client
  • ZooKeeper
  • Region
  • Row
  • Rowkey
  • Column Family
  • Column
  • Cell

若是看到这些词语,你能回想起它们之间的关系,那么,恭喜你已迈入 HBase 的大门。

三、参考文档


Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一块儿前行。

相关文章
相关标签/搜索