Cassandra levelcompaction
ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(ColumnFamilyStore.getBackgroundCompactionTaskSubmitter(), 5, 1, TimeUnit.MINUTES);
cassandra 启动时compaction后台定时任务加载,为了防止因为调度错误或者竞争条件导致的compaction停滞。
遍历所有的cfs,对每个cfs提交一个compaction后台任务
若该cfs的compaction参数中的enable为false,则任务结束。否则步骤2
获取正在compaction的cf数量,判断该线程池是否满,是则该任务结束。否则步骤3
提交new BackgroundCompactionCandidate(cfs)任务,该对象构造方法会将该cf加入正在compaction的cf集合
执行上步对象的run方法,调用getNextBackgroundTask方法
对sst文件分类repair和unrepair,并有对应的compactionStrategy对象,只是里面的manifest对象里的sst不通,分别是repair和unrepair的
根据每个compactionStrategy对象,根据其负责的sst超过每层阈值大小逆序排序,优先调用该对象的getNextBackgroundTask方法
manifest.getCompactionCandidates()
计算待compaction的候选者(多个sst文件),生成CompactionCandidate对象,同时该对象的生成构造方法中也指定了compaction后的sst对应的level将上步计算的sst文件组成一个LeveledCompactionTask
调度指定该task的runMayThrow方法
进行compaction。即迭代需要compaction的sst,将该sst里面的row迭代合并生成新的sst文件
bootstrap期间level0采用STCS方式进行compact
通常方式
遍历每一层级的SST文件。从leveln --> level1
首先获取该层级的所有SST文件,然后剔除掉正在做compaction的sst
剩余的该层级的sst文件计算score。
score=该sst文件的总大小/该层sst文件预制的大小
score=getTotalBytes(ssts)/math.pow(10, level) * maxSSTableSizeInBytes,
首先判断level0的sst,发现其数量超过阈值(MAX_COMPACTING_L0=32)时,采用STCS策略获取热度最高的几个sst文件列表,然后进行compaction,如果没有则做下面
获取该level待做compaction的sst列表
在level==0时特殊处理
首先获取level0的sst文件列表,按sst.maxTimestamp(文件最后修改时间)正序排序
迭代排序过的sst列表,找到该sst在其所在列表中有数据交集的所有sst
上步找到的sst同正在compaction的sst文件列表没有交集,且同正在compaction的firstkey和lastkey之间的数据没有交集,则吧该sst列表加入待compaction列表中
发现该待compaction列表的sst个数超过阈值(MAX_COMPACTING_L0),则截取阈值数量的sst文件,结束sst的迭代
首先将该level的sst按sst.firstKey进行正序排列
在有序的sst中找到比lastcompactionkey大的第一个sst文件(通过和sst.first比较)
获取level+1级的sst文件列表,以及每个sst文件的[firstkey, lastkey]
从2中找到的sst文件开始进行迭代计算。找出该sst文件以及同level+1级的中有数据交集的所有sst
第2步中找到的所有sst所有做过compaction并且同正在compaction的sst没有交集,则返回该所有sst,将准备做这部分sst的compaction
未完....
- 点赞
- 收藏
- 关注作者
评论(0)