架构
- 1个Table包含多个Tablet,其中Tablet的数量是根据hash或者是range进行设置的
- 1个Tablet中包含MetaData信息和多个RowSet信息,其中MetaData信息是block和block在data中的位置。
- 1个RowSet包含一个MemRowSet和多个DiskRowSet,其中MemRowSet用于存储insert数据和update后的数据,写满后会刷新到磁盘中也就是多个DiskRowSet中,默认是1G刷新一次或者是2分钟。
- DiskRowSet用于老数据的mutation,比如说数据的更新操作,后台定期对DiskRowSet进行合并操作,删除历史数据和没有的数据,减少查询过程中的IO开销。
- 1个DiskRowSet包含1个BloomFilter,1个Ad_hoc Index,多个UndoFile、RedoFile、BaseData、DeltaMem
- BloomFile:根据DiskRowSet中key生成一个bloom filter,用于快速模糊的定位某一个key是否在DiskRowSet中
- Ad_hoc Index:是主键的索引,用于定位key在DiskRowSet中具体哪个偏移位置
- BaseData:是MemRowSet flush下来的数据,按照列存储,按照主键有序
- UndoFile:是BaseData之前的数据历史数据
- RedoFile:是BaseData之后的mutation记录,可以获得较新的数据
- DeltaMem:用于在内存中存储mutation记录,先写到内存中,然后写满后flush到磁盘,形成deltafile
MemRowSet
- 实现方式:B+Tree
DiskRowSet
实现方式:二叉平衡树
内部数据组织:
DeltaMem和MemRowSet在存在中的组织方式是一致的,都是B+Tree,在磁盘上的存储都是放在CFile文件中的,以下为CFile的文件格式:
CFile包含Header,Data,Index,Footer四块,其中Data部分起始部分是为空值,仅仅针对为null的column,对应主键没有这个的null值的,bitmap就是以那些值为null的RowId建立起来的位图,这样Data就不用存储这些空值,data部分不同的column类型文件会有不同的编码方式
对于ad_hoc文件使用的prefix,delta fle使用的是plain,bloomfile使用的是plain
Index有两种,posidx index是根据rowId找到Data中的偏移,validx index是根据key的值找到data中的偏移,validx只针对只有一个column为key的情况下,这个时候DiskRowSet是没有Ad_hoc索引的,使用validx来代替。这两个index内部实现了B-Tree,index不一定是联系的,在达到一定长度后就会刷盘
Footer是记录CFile的元数据,包括posidx_index,validx_index两棵树根节点所在位置,数据条目、编码、压缩方式等
- DiskRowSet数据在磁盘上分布:
磁盘上每一个DiskRowSet有若干.metadata和.data文件,metadata文件记录的是DiskRowSet的元信息,主要包括哪些block和block在data中的位置,上图为block和DiskRowSet中各部分的映射关系,在写磁盘时是通过container来写入,每个container可以写很大的一块连续的磁盘空间,用于给某一个CFile写数据,当一个CFile写完后会将container归还给BlockManager,这时container就可以用于下一个CFile写数据了,当BlockManager中没有container可用是会创建一个新的container给新的CFile使用。
对应新建block先看看是否有container可用,若没有,目前默认的是在所在的配置中的data_dir中随机选取一个dir建一个新的metadata和data文件。先写data,block落盘后再写metadata
MVCC
表的主键排序,受益于MVCC(Multi-Version Concurrency Control 多版本并发控制,一旦数据写入到MemRowSet,后续的reader能立马查询到
Compaction
minor compaction:
多个deltafile进行合并。默认是1000个deltafile进行合并一次
major compaction:
deltafile文件的大小和basedata的文件的比例为0.1的时候,会进行合并操作
转自:https://blog.csdn.net/weixin_39478115/article/details/79267330