存储架构
Kudu的存储是将一个Table 拆分成多个Tableat进行存储的。当然不是指像Hbase一样,当一个Region数据量达到一定大小后进行动态的拆分。Kudu在建表时需要事先制定分区数量。可以通过Range或Hash的方式来进行分区,分多少个区就存在多少个Tablet。需要注意的是这两种分区方式只能通过主键来进行操作,Range只能根据单个主键进行分区。Hash则可以根据多个主键进行分区。
每个Tablet中都会存在一个Metadata,用来存放该Tablet中存在着哪些RowSet和各个RowSet存放的位置(我猜测是这样,网上资料实在太少。。)
有兴趣的同学可以打开看一下 在/kudu/tablet/data下
存放着一些.metadata文件和.data文件
Rowset则是存放真正数据的地方包括 MemRowset和 DiskRowSet。
MemRowSet:
用于存储insert和update的数据,写满MemRowSet所在的内存后会进行一次flush,将全部数据写入磁盘(DIskRowSet)中并重新生成一个空的MemRowSet区域
MemRowSet是行式存储,可以并发的进行访问。虽然是行式存储,但是由于数据量不大,并且是在内存中所以速度还是可以让人接受的。
MemRowSet写入磁盘后会生成一个或多个DIskRowSet文件(每32M会生成一个DiskRowSet文件,方便后期的compaction即压缩合并)
DiskRowSet分为:
BloomFile:是根据主键生成的一个过滤文件,用来快速模糊的判断某个主键知否存在与这个DiskRowSet中;
AdhocIndex:主键的索引,用它来确定主键的偏移量,方便快速地找到数据;
BaseData:MemRowSet flush下来的数据,按列存储,按主键有序;
DeltaMem:当进行更新的数据存在与DiskRowSet时会写入相应的DiskRowSet所在的DeltaMem中
RedoFile:当DeltaMem写满时,会写入RedoFile中(redofile可能存在多个)当RedoFile达到一定数量时会进行compaction(合并压缩)默认1000个文件合并一次
UndoFile:是BaseData compaction 之前的数据,RedoFile和BaseData合并后会生成新的UndoFile
注:在进行更新操作时如果要更新的数据存在于MemRowSet上时,更新的数据会在MemRowSet上找到他所在的行,将更新记录记录在一个mutation链表中,落盘时合并在BaseData上
更新的数据在DiskRowSet上时,会在对应的DiskRowSet上的DeltaMem写入记录,达到一定大小时写入RedoFile。