脏数据在cluster场景的定义是,某节点并不是slot 的属主,但是其在底层rockdb 的对应slot位置保存数据不为空
垃圾清理的场景
默认情况下 不需要用户手动去执行垃圾清理命令, 垃圾清理主要在下面两种场景中产生:
(1)slot搬迁时,源节点完成数据搬迁后,需要修改lsot 归属为目标节点,那么其持有的数据就变成了脏数据
(2)slot搬迁失败时,目标节点会保存搬迁过去的slot数据,但它并不是这个slot 的持有者,因此这部分数据也是脏数据
脏数据如果没有及时清理 会产生副作用,除了占用多余空间以外,涉及到脏数据的slot 都不能再进行数据搬迁,知道数据清理干净
垃圾清理作为一个独立模块,按照storeid 来分组数据 然后底层使用rockdb deleleRange能力实现了批量快速删除排练连续slot的数据,在后续开发中,如果有新功能需要处理脏数据都可以使用这个模块接口来处理。
垃圾清理相关配置
在正常搬迁过程中,如果遇到failover的情况,可能需要手动执行垃圾清理的相关命令
例如 假设挂的时候 30% slot搬完,failover 后 新的master会接管这30%搬过来的slot数据 , 但这个slot在cluster 元数据层面并不归属于这个master , 因此这部分都是脏数据需要清理,否则后面继续搬迁到这个新的slot就会报错
和垃圾清理相关的配置有
// 默认为true , 表示是否允许在搬迁时进行垃圾清理,默认情况下每个子任务搬迁完都会立刻进行清理,
//设为false后会延迟垃圾清理直到所有任务数据搬迁完
// garbageDeleteThreadnum 默认为1 ,表示gc 使用的线程数
// garbageDeleteSize 默认为30 , 表示deleteRange最大一次性删除的slot个数
bool enableGcInMigrate;
垃圾清理相关命令
CLUSTER CLEAR
命令说明
该命令只支持在master上执行,功能是立刻开始删除该节点上不属于它的slot上的脏数据,该命令只需要在搬迁时候出现failover 的情况下使用,该命令为异步执行命令
命令返回
Simple string reply:OK 或 错误