sofastack / sofa-jraft

A production-grade java implementation of RAFT consensus algorithm.
https://www.sofastack.tech/projects/sofa-jraft/
Apache License 2.0
3.57k stars 1.14k forks source link

raft log删除策略 #976

Closed tdxafpdq closed 1 year ago

tdxafpdq commented 1 year ago

Your question

背景: 快照机制,使用LogStorage#truncatePrefix(final long firstIndexKept)来删除firstIndexKept之前的所有日志;

我的业务场景,有2种: (1)像快照机制一样,删除firstIndexKept之前的所有日志,目前是支持的,没有问题; (2)删除[first_log_index, first_index_kept)区间的日志,其中first_log_index不是从起始下标开始,例如: 已有日志的log index为:[1, 1000];此时,业务需要删除[101, 900],RocksDB上留下[1, 100]和[901, 1000]的raft log。 (由于某种原因,我想通过这种方式来删除日志,以释放磁盘空间,实现可持续性;业务场景原因,我并不开启快照功能)

我进行了以下尝试,但是没有成功: (1)多态的形式,追加LogStorage#truncatePrefix(final long startIndex, final long firstIndexKept),其中startIndex由业务调用方决定; (2)startIndex取代原来的【final long startIndex = getFirstLogIndex()】,参照截图: image (3)业务方调用LogStorage#truncatePrefix(101, 901)

但是,测试结果是[1, 901)的raft log仍然全部被删除了,与期待值不符。 我对java操作RocksDB并不精通,烦请帮忙确认,问题出在了哪里?是否支持这样设计?谢谢!

Your scenes

(1)业务原因,关闭snapshot快照机制 (2)业务数据删除时,自行开发代码去删除对应的raft log数据 (3)目的:数据实现滚动删除;释放磁盘空间,保证可持续性

Your advice

实现LogStorage#truncatePrefix(final long startIndex, final long firstIndexKept);startIndex和firstIndexKept均由业务调用方传参

Environment

tdxafpdq commented 1 year ago

image 是不是把这几行也注释掉,就可以了? 这样做,是否有什么隐患?

fengjiachun commented 1 year ago

我觉得思路不太对,你把 raflt log 中你需要的内容保存到你自己的状态机里面,你爱怎么删怎么删,你自己能保证多个节点的状态机处理是一致的就可以, snapshot 正常开启就行了

tdxafpdq commented 1 year ago

我觉得思路不太对,你把 raflt log 中你需要的内容保存到你自己的状态机里面,你爱怎么删怎么删,你自己能保证多个节点的状态机处理是一致的就可以, snapshot 正常开启就行了

我的业务是这样的: raft log里的数据是从mq来的,里面是json串且数据较大,同步到多个节点的状态机,各自写入mysql。 (json数据有insert请求,也有update请求)

我面临的问题: 收到1万个json串,没办法将1万个json串进行计算,仅仅将计算结果存入snapshot;(像计数器例子那样) 而且,1万个json串,数据量太大,由于状态机是存放在内存里的,所以1万个json串,状态机里放不下。

fengjiachun commented 1 year ago

状态机是你自定义的呀,除了内存里的数据,你可以将那些个 json 写到磁盘上的

tdxafpdq commented 1 year ago

RocksDBLogStorage#truncatePrefixInBackground(final long startIndex, final long firstIndexKept) 这个方法执行后,会删除[startIndex, firstIndexKept)下标区间的raft log;

问题:删除日志后,log目录下的哪个文件的size会减小?(是.sst文件吗?)我测试发现文件size并没有减小 image

tdxafpdq commented 1 year ago

还有个问题 谢谢! 【LOG.old.1681984914655906】这样格式的文件,运维人员是否可以手动删除?是否影响功能

fengjiachun commented 1 year ago

978