一,数据模型
- namespace:多表分到一个组里管理的时候用到。数据库中表 很多的时候才用到
- Table:由多个列族组成,有数据属性,eg:超时时间TTL,压缩算法(conpression),都在列族中定义,
- Row:多列组成,by列族分类。
- Culumn Family:列族是多个列的集合,HBase会把一个列族的列放到同一个服务器上,提高存取性能。
- 批量管理一堆列,建表定义列族而非列。
- Cell:列中的每个数据叫做cell,多版本。
- TimeStamp:版本号
rowkey严格按照字典排序。
表命名空间:
作用:把多个属性相同的业务领域的表分成一个组,一个表可以自由选择是否有命名空间(create 'mynamespace:mytable')
二,HBase是怎么存储数据的?
既然是数据库,肯定某种形式存储在应硬盘上。
2.1宏观架构
hbase集群有一个Master(HA:多个master),多个region server组成,
Master:负责启动时非陪region到regionserver,之心个管理操作,数据的读取写入和它没关系。也不能宕机久,建表,修改列配置,分割合并需要它。
regionserver:上有多个region,读写的数据就在region上,如果基于hdfs,region所有读写操作都调用hdfs的客户端接口。
Region:表的一部分接口,HBase会自动分片的数据库,一个region相当于关系型数据库中分区表的一个分区。
ZK:第三方基础组件,功能:1管理小部分数据2监听功能。ZK作用对于hbase很大。读取数据的元数据表(hbase:meta)的位置就存放在ZK上。
由图我们可以看到RegionServer内部:
- WAL:预写日志,Write-Ahead Log。即操作region先把操作写到WAL中,hbase会先把数据放到基于内存实现的Memstore,达到一定数量才会刷写(flush)到最终存储的HFile。宕机断电时,WAL就是保险机制,恢复的时候从WAL中恢复数据。
- 多个Region:region相当于数据分片,存储row某个范围。有其实rowkey和endrowkey
单个region:
- 多个store:每个store对应一个列族的数据。两个列族的话对应两个store。单个store中又有Memstore和HFile组成。
2.2 预写日志是个啥?
解决断电宕机恢复的,数据到达region先写进wal,在加载到 memstore的,wal时存在hdfs里的。
我们看看store的内部:
很显然,有两个重要部分组成:
-
MemStore:内存存储对象,数据写入wal就会放入这里,满了就刷写到HFile
-
HFile:Menstore满了就在hdfs生成新的HFile,数据写里面,这才是数据最终存储的实体啊!
来个小结:WAL是存储在HDFS上的,Memstore是存储在内存中的,HFile又是存储在HDFS上。
数据是先写入WAL,再被放入Memstore,最后被持久化到HFile 中。
数据在写入HFile前都已经存储到HDFS中一次了,为啥还在放入memstore中???
这说明memstore肯定有他很重要的总用!hdfs可不能修改数据啊,按数据存放数据对数据库很重要,这决定了它的性能。所以我们想要存储的数据整理成一定的顺序存放.Memstore存在的意义是维持数据按照rowkey顺序排列,而不是做一个缓 存。
2.3 增删改查的真面目
hbase时最忌读写的,hdfs只能增删不可修改,hbase到底是怎么样进行CRUD的呢??
答案:都是在做新增操作!!!
- 新增cell时:在hdfs上新增一条数据,这个很好理解。
- 修改cell:哈哈,它还是新增一天数据,只不过版本号更新。
- 删除单元格:你没猜错!还是增加一条数据,只不过没有value,类型时delete,这个数据叫:墓碑标记!
那到底啥时候真正去删除呢??
合并(Compaction):多个HFile合并成一个HFile,检测到被标记墓碑的数据忽略,新HFile就没有这条数据了。
数据单元层次图:
-
一个RegionServer包含多个Region,划分依据:一段rowkey,如果一行数据量超级大,会把这个region根据列族切分到不同机器上。
-
一个Region包含多个Store,划分:一个列族一个store
-
一个Store里面有一个memstore多个HFile
三,一个KeyValue的历程
3.1写入
3.2 读出
实际的读取顺序是先从BlockCache中找数据,找不到了再去 Memstore和HFile中查询数据。
二层查询数据流程:
(1)客户端先通过ZooKeeper的/hbase/meta-region-server节点 查询到哪台RegionServer上有hbase:meta表。
(2)客户端连接含有hbase:meta表的RegionServer。hbase:meta 表存储了所有Region的行键范围信息,通过这个表就可以查询出你要取的rowkey属于哪个Region的范围里面,以及这个Region又是属于哪个 RegionServer。
(3)获取这些信息后,客户端就可以直连其中一台拥有你要存取 的rowkey的RegionServer,并直接对其操作。
(4)客户端会把meta信息缓存起来,下次操作就不需要进行以上 加载hbase:meta的步骤了。
注:以上内容全部来自---《HBase不睡觉书》想了解HBase的其他内容的可以去购买此书,很不错。