Øtable
中的所有行都按照
row key
的字典序排列。
Ø table
在行的方向上分割为多个
Hregion
。
Øregion
按大小分割的,每个表一开始只有一个
region
,随着数据不断插入表,
region
不断增大,当增大到一个阀值的时候,
Hregion
就会等分会两个新的
Hregion
。当
table
中的行不断增多,就会有越来越多的
Hregion
。
ØHRegion
虽然是分布式存储的最小单元,但并不是存储的最小单元。
事实上,
HRegion
由一个或者多个
Store
组成,每个
store
保存一个
columns family
。
每个
Strore
又由一个
memStore
和
0
至多个
StoreFile
组成。
如图:
StoreFile
以
HFile
格式保存在
HDFS
上。
ØHLog(WAL log)
WAL
意为
Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging)
,类似
mysql
中的
binlog,
用来做灾难恢复只用,
Hlog
记录数据的所有变更。在分布式系统环境中,无法避免系统出错或者宕机,一旦
HRegionServer
以外退出,
MemStore
中的内存数据就会丢失,引入
HLog
就是防止这种情况
每个
Region Server
维护一个
Hlog,
而不是每个
Region
一个。这样不同
region(
来自不同
table)
的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对
table
的写性能。带来的麻烦是,如果一台
region server
下线,为了恢复其上的
region
,需要将
region server
上的
log
进行拆分,然后分发到其它
region server
上进行恢复。
每次用户操作写入
Memstore
的同时,也会写一份数据到
HLog
文件,
HLog
文件定期会滚动出新,并删除旧的文件
(
已持久化到
StoreFile
中的数据
)
。当
HRegionServer
意外终止后,
HMaster
会通过
Zookeeper
感知,
HMaster
首先处理遗留的
HLog
文件,将不同
region
的
log
数据拆分,分别放到相应
region
目录下,然后再将失效的
region
重新分配,领取到这些
region
的
HRegionServer
在
Load Region
的过程中,会发现有历史
HLog
需要处理,因此会
Replay HLog
中的数据到
MemStore
中,然后
flush
到
StoreFiles,
完成数据恢复。