(1). 为什么学习HBase(以及看源码)?

该方案在生产验证(3台4核8G):30亿文档,检索时间为:1.8/sec.

我们知道,数据存储比较简单,而基于数据检索(Query)反而是比较复杂的,特别是Sass化的今天,数据量庞大,检索的条件比较复杂(模糊检索).
而在Query时,再使用RDBMS,会感觉到力不从心了(特别是模糊检索),那么,业界有没有一个好的解决方案呢?
在业界确实存在一套整合方案(HBase+Solr/ES),大体的解决方案如下:

  1. 订阅MySQL binlog.
  2. 解析binlog往Hbase里进行存储.
  3. HBase在保存时,会产生WAL(类似于MySQL binlog)日志.
  4. 订阅HBase WAL日志,存储到Elastic Search里.
  5. ES只存储与检索条件相关的数据,而不是所有的数据,尽量让ES(Term Index)热块在内存里(比如:富文本在ES中只做索引,而原文本内容存储在HBase里).
  6. 检索时,从ES检索出数据,返回的是:rowkey(HBase概念).
  7. 通过rowkey到HBase里批量检索出数据,再对数据进行拼装(这过程是不是感觉和MySQL的辅助索引很像).
  8. 方案是比较完美,但是,说实话,开发人员需要懂:ES和Hbase,所以,我的想法是自己写ES Plugin,实现第6步和第7步.
  9. ES的x-pack已经支持了SQL,为什么要还要自己写(ES Plugin)?因为x-pack是收费的,同时,我不仅要通过ES查询,还会要检索HBase,再进行组合(跨多个源).这个步骤,我也想通过SQL来做到,整个开发过程让开发是无感知的.
  10. 稍微提一下,SQL解析框架:Apache Calcite,后期,会对它进行源码分析和应用.
  11. HBase的缺陷是什么?HBase只能通过rowkey来检索(从性能上来说),所以,针对HBase的缺陷,有一些框架提供了二级索引的功能.
  12. 最终要实现如下图:

"MySQL-HBase-ES-Writer"

"MySQL-HBase-ES-Query"

(2). HBase是怎么来的?

2006年Google技术人员Fay Chang发布了一篇文章Bigtable:A Distributed Storage System For Structured Data.
它向我们介绍了一种分布式的数据库,这种数据库可以在局部几台服务器崩溃的情况下,仍然可以继续提供服务.

(3). Hbase中的角色

ZK : 存储RegsionServer节点信息.
Master:负责维护表的结构信息.
RegsionServer:负责数据存储(内部维护N个Region容器).
Client:每次与HBase连接时,都是先和ZK通信,查询出:RegsionServer,然后,再连接:RegsionServer.

(4). Hbase数据模型 VS RDBMS

RDBMS存储模型

id name sex pwd
1 张三 123
2 李四 321

HBASE存储模型

rowkey cf:column-key time cell value
1 info:name 123 张三
1 info:sex 123
1 info:pwd 123 123
2 info:name 123 李四
2 info:sex 123
2 info:pwd 123 321

(5). Hbase术语介绍

术语 介绍
cell 数据
column family 在Hbase里,列簇一般用于将相关的列(Cloumn)组合起来,在物理上Hbase其实是按照CF存储的,可以包含N个列
column 列是数据存储的最小单元
row 一个列或者多个列(列簇),形成一行
region region类似于一个容器,由N个row组合而成

(6). HBase学习目录

“HBase 伪集群搭建(二)”
“HBase 基本操作(三)”
“HBase Java API基本操作(四)”
“HBase + Phoenix搭配(五)”
“HBase内部结构详解(六)”

(7). HBase源码目录

“Lily-HBase-Indexer(一)”
“HBase HRegionServer(二)”