Hbase有一个叫做Meta的特殊的目录表,用于保存集群中regions的位置信息(region列表)。ZooKeeper存储着Meta表的位置。
具体含义:
rowKey:([table],[region start key],[region id])
column family:info
column:regioninfo、server、serverstartcode
1.rowkey中第一个分隔符前存的是表名;
2.第二分隔符前存的是region的第一个rowKey:
3.region id代表region的id,通常基于region创建时的timestamp;
4.regioninfo是HRegionInfo的序列化值;
5.server是指服务器的地址和端口;
6.serverstartcode是指服务开始的timestamp。
根据meta表查找key对应的region,当一个key需要做put操作时,会先扫描meta表,找到对应的region,然后进行插入操作。
eg:当有一个table有三个region,每个region的startkey分别如下:
1 table,,1351700811858
2 table,bar,1351700819876
3 table,foo,1351700829874
如果我们需要插入key ‘baz’时,我们能找到meta表中对应的rowkey为(table,bar,1351700819876)这个查找完,会缓存到客户端,下次查询的时候根据缓存直接访问对应的region。
当不断向一个table写数据,会触发region spilt,具体过程不再此描述,主要描述meta表的变化:
1)首先是更新meta表中parent region的info:regionfo列的值,然后增加两列info:spiltA和info:splitB(top child的regioninfo,这里约定top为startkey较小的HRegionInfo,bottom则反)。整个过程正常完成后,会删除parent region;
2)更新完meta表中parent region的记录时,需要把child region相关信息插入到meta表中,top child region的startkey和parent key region完全一样,这个时候regionId就发挥作用了,如果没有regionId,当meta表中有top region和parent region时,就不知道选哪个了,因为他们的startkey一样的。而可以通过timestamp作为region的id作区分(top region id取timestamp+1)。这样就可以保证child region总是排在parent region前面;
3)另外,bottom child必须先插入到meta表中,然后,top child才能插入,否则,就会出现在meta表中,bottom region里面key找不到对应region的情况。
举个例子还是以上面的例子为基础 meta中rowkey为(table,bar,1351700819876)的region分裂成两个region的meta rowkey分别是(table,bar,1351700819810)和(table,belong,1351700819810),如果这个时候先插入top child:
1 table,,1351700811858
2 table,bar,1351700819876 <---- offline!
3 table,bar,1351700819810 <---- top child
4 table,foo,1351700829874
例如这个时候我需要找key为bgood,我最终会找到这里的第三行top region里面,但是top region里面并不包含bgood。bgood这个这个key是在bottom region里面的。如果先加入bottom就没有这个问题,如下 :
table,,1351700811858
table,bar,1351700819876 <---- offline!
table,belong,1351700819810 <---- bottom child
table,foo,1351700829874
参考链接:https://www.cnblogs.com/niurougan/p/3976543.html