Cassandra levelcompaction

举报
提桶 发表于 2020/03/26 22:58:12 2020/03/26
【摘要】 ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(ColumnFamilyStore.getBackgroundCompactionTaskSubmitter(), 5, 1, TimeUnit.MINUTES);cassandra 启动时compaction后台定时任务加载,为了防止因为调度错误或者竞争条件导致的compacti...

ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(ColumnFamilyStore.getBackgroundCompactionTaskSubmitter(), 5, 1, TimeUnit.MINUTES);

cassandra 启动时compaction后台定时任务加载,为了防止因为调度错误或者竞争条件导致的compaction停滞。

遍历所有的cfs,对每个cfs提交一个compaction后台任务

  1. 若该cfs的compaction参数中的enable为false,则任务结束。否则步骤2

  2. 获取正在compaction的cf数量,判断该线程池是否满,是则该任务结束。否则步骤3

  3. 提交new BackgroundCompactionCandidate(cfs)任务,该对象构造方法会将该cf加入正在compaction的cf集合

  4. 执行上步对象的run方法,调用getNextBackgroundTask方法

  5. 对sst文件分类repair和unrepair,并有对应的compactionStrategy对象,只是里面的manifest对象里的sst不通,分别是repair和unrepair的

  6. 根据每个compactionStrategy对象,根据其负责的sst超过每层阈值大小逆序排序,优先调用该对象的getNextBackgroundTask方法

  7. manifest.getCompactionCandidates()计算待compaction的候选者(多个sst文件),生成CompactionCandidate对象,同时该对象的生成构造方法中也指定了compaction后的sst对应的level

  8. 将上步计算的sst文件组成一个LeveledCompactionTask

  9. 调度指定该task的runMayThrow方法

  10. 进行compaction。即迭代需要compaction的sst,将该sst里面的row迭代合并生成新的sst文件


public synchronized CompactionCandidate getCompactionCandidates()

  1. bootstrap期间level0采用STCS方式进行compact

  2. 通常方式

    1. 遍历每一层级的SST文件。从leveln --> level1

    2. 首先获取该层级的所有SST文件,然后剔除掉正在做compaction的sst

    3. 剩余的该层级的sst文件计算score。

      1. score=该sst文件的总大小/该层sst文件预制的大小

      2. score=getTotalBytes(ssts)/math.pow(10, level) * maxSSTableSizeInBytes,

      3. 当level==0, score=getTotalBytes(ssts)/4 * maxSSTableSizeInBytes

      4. maxSSTableSizeInBytes默认值为32M

    4. 当score > 1.001时

      1. 首先判断level0的sst,发现其数量超过阈值(MAX_COMPACTING_L0=32)时,采用STCS策略获取热度最高的几个sst文件列表,然后进行compaction,如果没有则做下面

      2. 获取该level待做compaction的sst列表

        1. 在level==0时特殊处理

        2. 首先获取level0的sst文件列表,按sst.maxTimestamp(文件最后修改时间)正序排序

        3. 迭代排序过的sst列表,找到该sst在其所在列表中有数据交集的所有sst

        4. 判断待compaction的sst列表的文件总大小超过maxSSTableSizeInBytes,则还要获取level1中与该列表中有数据交集的sst,且没有正在compaction,则吧该sst列表也加入待compaction的sst列表中返回。

        5. 上步找到的sst同正在compaction的sst文件列表没有交集,且同正在compaction的firstkey和lastkey之间的数据没有交集,则吧该sst列表加入待compaction列表中

        6. 发现该待compaction列表的sst个数超过阈值(MAX_COMPACTING_L0),则截取阈值数量的sst文件,结束sst的迭代

        7. 首先将该level的sst按sst.firstKey进行正序排列

        8. 在有序的sst中找到比lastcompactionkey大的第一个sst文件(通过和sst.first比较)

        9. 获取level+1级的sst文件列表,以及每个sst文件的[firstkey, lastkey]

        10. 从2中找到的sst文件开始进行迭代计算。找出该sst文件以及同level+1级的中有数据交集的所有sst

        11. 第2步中找到的所有sst所有做过compaction并且同正在compaction的sst没有交集,则返回该所有sst,将准备做这部分sst的compaction

未完....

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。