seaweedfs java api_seaweedfs代码详解

SeaweedFS在删除文件时,通过在索引文件尾部标记并保留数据,而非真正删除。每15分钟,SeaweedFS会检查垃圾门限,当达到阈值时,启动压缩流程。在压缩过程中,读取datafile的needlehead,若不在needlemap中则视为已删除,不写入新文件。最终,master完成数据文件和索引文件的更新与重命名。
摘要由CSDN通过智能技术生成

在seaweedfs分布式文件系统中,删除文件时,deleteNeedle会做三件事情,如下图

76ad923ef2d37fd0e5744373c32c502c.png

第一个删除kv数据库中的索引信息,第二件是,在索引文件的尾部添加删除的信息,对索引文件中原来存储的信息,并不删除。第三件是删除datafile文件中的数据 ,但是并没有真正的删除数据,在datafile文件尾部,写了一个包含needle head的数据,但是并不包含needel中的数据,needlehead包括分配的needleid,以及needle的cookie和校验数据。seaweedfs在向文件尾部写数据时,写的数据大小保持八字节对其,如果不够,会补齐。我理解是为了提高cpu的读取效率。总而言之,在删除文件时,会在索引文件尾部添加如下needle信息,needle的size修改为uint32的最大值,offset为当前datafile中的到文件尾的偏移。datafile文件会写一个needle的头部。在写文件的时候,仍然会如此。

seaweedfls中会每15分钟向master发送/admin/vacuum/check请求,代码如下:

ce98acaa4762513ca8884d706ac5c88f.png

如果超过垃圾门限值,则leader会向master发送/admin/vacuum/compact消息,master收到消息后,开始压缩volume

849e14c6c7290dbea2d51a01f036cf4d.png

在volume的Compact函数中,执行压缩流程,压缩时从datafile中读取needlehead,如果读取的needlehead不在volume的needlemap中,则认为文件已经删除,不会向新的文件中添加:

12ffb67527a04e35c2a7ce5455c967c0.png

在compact压缩有,leader向master发送/admin/vacuum/commit,master收到后,把compact过程中生成的datafile和idx的压缩文件更改为datafile和idx文件名。最后完成压缩。在更改名字之前,会检查当前数据文件是否有更新,如果有,则把更新的needle刷新到压缩文件中。代码如下:

3af73be28f1f08a5b503b785ec83addd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值