Seafile GC

Seafile 利用存储去重技术来减少存储资源的利用。 简单来说,这包含如下两层含义:

运用这项技术之后,在你删除一个资料库时,会导致底层数据块不会被立即删除,因此 Seafile 服务器端没用的数据块将会增多。

通过运行垃圾回收程序,可以清理无用的数据块,释放无用数据块所占用的存储空间。

垃圾回收程序将会清理如下两种无用数据:

  1. 已被删除的资料库的所有 block, fs, commit 对象。注意,资料库被用户删除后,会被移动到系统回收站保留一定的时间。在他们被从回收站清理掉之前,是不会删除 block, fs, commits 对象的。(已删除资料库在系统回收站的保留期限由 seafile.conf 中的 expire_days 选项控制。具体参考 seafile.conf 配置文档。)

  2. 设置了历史长度限制的资料库的过期数据块(block 对象),这包括已删除的文件和文件的旧版本。commit 对象始终不会被删除。fs 对象默认不会被删除,需要使用一个选项来清理(参考下文)。(用户或者管理员可以给每个资料库独立设置历史保留期限,如果某个资料库没有设置保留期限,则默认使用 seafile.conf 中的 keep_days 选项中指定的值。)

如果使用社区版服务器,运行垃圾回收程序之前,请先在服务器端停掉 Seafile 程序。这是因为垃圾回收程序,会错误的删除刚刚写入 Seafile 的新的数据块。对于专业版你不需要暂停 Seafile 程序来进行垃圾回收。​

Dry-run 模式

如果仅为了查看有多少垃圾可以回收而不进行删除操作,用 dry-run 选项:

seaf-gc.sh --dry-run [repo-id1] [repo-id2] ...

运行输出如下所示:

[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo My Library(ffa57d93)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 265.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo ffa57d93.
[03/19/15 19:41:49] gc-core.c(308): Traversed 5 commits, 265 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 265 blocks total, about 265 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo aa(f3d0a8d0)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 5.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo f3d0a8d0.
[03/19/15 19:41:49] gc-core.c(308): Traversed 8 commits, 5 blocks.
[03/19/15 19:41:49] gc-core.c(264): Populating index for sub-repo 9217622a.
[03/19/15 19:41:49] gc-core.c(308): Traversed 4 commits, 4 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 5 blocks total, about 9 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:49] seafserv-gc.c(115): GC version 1 repo test2(e7d26d93)
[03/19/15 19:41:49] gc-core.c(394): GC started. Total block number is 507.
[03/19/15 19:41:49] gc-core.c(75): GC index size is 1024 Byte.
[03/19/15 19:41:49] gc-core.c(408): Populating index.
[03/19/15 19:41:49] gc-core.c(262): Populating index for repo e7d26d93.
[03/19/15 19:41:49] gc-core.c(308): Traversed 577 commits, 507 blocks.
[03/19/15 19:41:49] gc-core.c(440): Scanning unused blocks.
[03/19/15 19:41:49] gc-core.c(472): GC finished. 507 blocks total, about 507 reachable blocks, 0 blocks can be removed.
[03/19/15 19:41:50] seafserv-gc.c(124): === Repos deleted by users ===
[03/19/15 19:41:50] seafserv-gc.c(145): === GC is finished ===
[03/19/15 19:41:50] Following repos have blocks to be removed:
repo-id1
repo-id2
repo-id3

如果在参数中指定资料库 ID,则程序只检查指定的资料库,否则所有的资料库将会被检查。

在程序输出的结尾,你会看到 "repos have blocks to be removed" 部分,这部分内容会列出含有可回收垃圾块的资料库的 ID,后续你可以运行程序不加 --dry-run 选项来回收这些资料库的垃圾数据块。

删除垃圾数据块

运行垃圾回收程序,不加 --dry-run 选项来删除垃圾数据块:

./seaf-gc.sh [repo-id1] [repo-id2] ...

如果在参数中指定资料库 ID, 则程序只检查和删除指定的资料库。

正如前面所说,有两种类型的垃圾数据块可被回收,有时仅删除第一类无用数据块(属于删除的资料库)便可达到回收的目的,这种情况下,垃圾回收程序将不会检查未被删除的资料库,加入 “-r” 选项便可实现这个功能:

./seaf-gc.sh -r

注意,Seafile 中被用户删除的资料库不会直接从系统中删除,它们会被转移到系统管理员界面的垃圾箱。垃圾箱中的资料库,只有在从垃圾箱中清除以后,它们的数据块才可被回收。

删除 FS 对象

从 server 8.0 开始,您可以删除垃圾 fs 对象。 它应该在没有 --dry-run 选项的情况下运行:

seaf-gc.sh --rm-fs

注意, 专业版 10.0.15 之前,社区版 11.0.5 之前的版本这个命令有 bug,请不要运行这个命令。

多线程模式 GC

在专业版(Pro) 5.1.0 之后,您可以在GC中指定线程数。默认:

您可以使用 "-t" 选项指定线程数。"-t" 选项可以与所有的其他选项一起使用。每个线程都会在一个资料库中执行GC。例如,以下命令将使用20个线程来GC所有库:

./seaf-gc.sh -t 20

由于线程是并发的,每个线程的输出可能会互相混合。在每行输出中会打印库ID。

根据库ID前缀运行GC

由于GC通常需要相当慢的时间才能遍历整个库的历史记录。您可以使用多个线程并行运行GC。对于更大的部署,还希望在多台服务器上并行运行GC。

在多个GC服务器之间分配工作负载的简单模式是基于库ID将库分配给服务器。从 7.1.5 版本开始支持这个功能,您可以在seaf-gc.sh中添加“ --id-prefix”选项,以指定库ID前缀。例如,以下命令将仅处理ID前缀为“ a123”的库。

seaf-gc.sh --id-prefix a123

Last modified by Daniel Pan, 2024-03-30

Dry-run 模式
删除垃圾数据块
删除 FS 对象
多线程模式 GC
根据库ID前缀运行GC