Skip to content
This repository has been archived by the owner on Aug 4, 2024. It is now read-only.

Compactor

Kould edited this page Apr 9, 2023 · 1 revision

Compactor用于Minor/Major压缩的执行器,将MemTable/SSTable转化为下一级的SSTable,同时保证SSTable按照指定的规则进行排列。

Compactor定时检查MemTable中数据条数是否越出阈值,当达到阈值后或尝试使用通过乐观锁获取其写锁以避免事务存在或数据正在读取/写入时执行Compaction导致数据异常。 (后文上下级: 上->下即0->6)

Minor Compaction

Minor Compaction: MemTable中数据转换为单个Level 0的SSTable

Level 0和其他Level有比较大的差别

  • Level 0中的SSTable之间是仅仅按生成时间排序,而其他Level中的SSTable是根据起始和末尾的Key有序排列
  • Level 0中的SSTable之间数据可能产生冲突,而其他Level中的SSTable彼此数据连续有序不重复

值得注意的一点是:各个Level之间的数据是区间重复的(上一级Level往往是下一级Level数据的子集)

major Compaction

Major Compaction: 上级多个SSTable转换为下级多个SSTable

目前Major压缩的大体步骤是:

  1. 获取当前Version,读取当前Level的指定数量SSTable,命名为vec_ss_table_l
  2. vec_ss_table_l的每个SSTable中的scope属性进行融合,并以此获取下一Level与该scope相交的SSTable,命名为vec_ss_table_l_1
  3. 获取的vec_ss_table_l_1向上一Level进行类似第2步骤的措施,获取两级之间压缩范围内最恰当的数据
  4. vec_ss_table_l与vec_ss_table_l_1之间的数据并行取出排序归并去重等处理后,分片成多个Vec
  5. 并行将每个分片各自生成SSTable
  6. 生成的SSTables插入到vec_ss_table_l的第一个SSTable位置,并将vec_ss_table_l和vec_ss_table_l_1的SSTable删除
  7. 将变更的SSTable插入至vec_ver_edit以持久化
  8. 将vec_ver_edit中的数据进行log_and_apply生成新的Version作为最新状态

查询操作

Level 0中的SSTable之间数据可能产生冲突,而其他Level中的SSTable彼此数据连续有序不重复

当涉及到Disk的查询时,会由Level 0读取到存在Key的数据直到Level 6,而Level 0读取时会遍历Level 0中所有的SSTable,而以外Level的SSTable仅仅只会读取一个SSTable(Key可能存在该SSTable中的区间)

因此Level 0的读取是主要的性能瓶颈

Clone this wiki locally