架构图
写流程:
1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server,因为要想操作hbase:meta这个系统表之前必须要有RegionServer服务器. 这个数据是存放在Zookeeper里面的.
2)访问对应的Region Server,获取hbase:meta这个系统表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
所有的Region对应的RegionServer的信息在hbase:meta这张表里面存放着.
3)与目标Region Server进行通讯;
4)将数据顺序写入(追加)到WAL;
5)将数据写入对应的MemStore,数据会在MemStore进行排序;
6)向客户端发送ack;
7)等达到MemStore的刷写时机后,将数据刷写到HFile(StoreFile)。
写入数据的微观流程:
①尝试尽可能获取多个锁,至少需要获取一把
②如果当前数据没有设置时间戳,更新时间戳
③构建WAL对象
④写入WAL对象的buffer中,但是并不sync到磁盘
⑤写入memstore
⑥将WAL对象buffer中的数据sync到磁盘
⑦滚动MVCC版本号,滚动后,客户端就可以查询到数据
⑧如果在整个写入过程中发生异常,此时,会将已经写入到memstore中的数据回滚!