Skip to main content

常见问题(FAQ)

文档没能解答我的疑问

请首先尝试使用「Ask AI」功能(右下角),如果 AI 助手的回答有帮到你或者给了你错误的回答,欢迎在回答里给出你的反馈。或者使用文档搜索功能(右上角),尝试用不同的关键词进行检索。

如果以上方法依然未能解决你的疑问,可以加入 JuiceFS 开源社区以寻求帮助。

一般问题

JuiceFS 与 XXX 的区别是什么?

请查看「同类技术对比」文档了解更多信息。

怎么升级 JuiceFS 客户端?

首先请卸载 JuiceFS 文件系统,然后使用新版本的客户端重新挂载。

JuiceFS 的日志在哪里?

不同类型的 JuiceFS 客户端获取日志的方式也不同,详情请参考「客户端日志」文档。

JuiceFS 是否可以直接读取对象存储中已有的文件?

不可以,JuiceFS 是一个用户态文件系统,虽然它通常使用对象存储作为数据存储层,但它并不是一般意义上的对象存储访问工具。可以查看技术架构文档了解详情。

如果你希望把对象存储 Bucket 中已有数据迁移到 JuiceFS,可以使用 juiceFS sync

如何将多台服务器组合成一个 JuiceFS 文件系统来使用?

不可以,虽然 JuiceFS 支持使用本地磁盘或 SFTP 作为底层存储,但是它并不干预底层存储的逻辑结构管理。如果你希望把多台服务器的存储空间整合起来,可以考虑使用 MinIO 或 Ceph 创建对象存储集群,然后在其之上创建 JuiceFS 文件系统。

元数据相关问题

支持哨兵或者集群模式的 Redis 作为 JuiceFS 的元数据引擎吗?

支持,另外这里还有一篇 Redis 作为 JuiceFS 元数据引擎的最佳实践文档可供参考。

对象存储相关问题

为什么不支持某个对象存储?

已经支持了绝大部分对象存储,参考这个列表。如果它跟 S3 兼容的话,也可以当成 S3 来使用。否则,请创建一个 issue 来增加支持。

为什么我在挂载点删除了文件,但是对象存储占用空间没有变化或者变化很小?

第一个原因是你可能开启了回收站特性。为了保证数据安全回收站默认开启,删除的文件其实被放到了回收站,实际并没有被删除,所以对象存储大小不会变化。回收站的保留时间可以通过 juicefs format 指定或者通过 juicefs config 修改。请参考「回收站」文档了解更多信息。

第二个原因是 JuiceFS 是异步删除对象存储中的数据,所以对象存储的空间变化会慢一点。如果你需要立即清理对象存储中需要被删除的数据,可以尝试运行 juicefs gc 命令。

关于 JuiceFS 的异步删除,具体流程是怎样的?

  • 当未开启回收站时,文件不会立刻从对象存储中消失,而是打上一个”待删除 (delfile)"的标签,记录在删除清单中。系统会检查这个文件是否被其他程序使用,如果文件正在被使用,会标记为”暂缓删除 (sustained)",等程序关闭文件后再处理;如果文件没有被使用,则尝试将其放入删除队列。
  • 当开启回收站时,系统会在回收站中按照当前时间(精确到小时)创建子目录,比如"2024-01-15-14"这样的格式。并且把待删除的文件移动到回收站的对应时间目录中,在这个过程中文件的所有 chunk 和 slice 数据均保持完整,只有元数据中的父目录指向发生变化,文件名会被重新编码以避免冲突。有专门负责清理回收站的后台任务,根据设置的保留天数,计算哪些文件已经过期。然后从最老的目录开始,逐个清理过期文件。清理的方法依然是打上一个”待删除“的标签,放入删除队列 (maxDeleting)。
  • 进入删除队列后的文件,通过异步的方式后台清理,首先找到此文件对应的所有 chunk 并删除,在删除 chunk 的过程中,会减少其中 slice 的引用计数,当 slice 的引用计数减为零后,才会真正从对象存储中删除这些数据片段。
  • 删除队列是有容量限制的,如果同时删除的文件过多,队列满后删除请求会先返回。然后由一个每小时工作一次的后台清理任务继续清理。它查找所有标记为”待删除“的文件,对其进行清理,清理方法和删除队列中的文件一致。
  • 如果配置了 NoBGJob,每小时间隔的后台定时清理任务和回收站清理任务都会被禁用,删除文件后需要手动去回收站中进一步清理。
  • 一种特殊情况是,当你手动直接删除回收站里的文件时,它可以确保以同步的方式插入到删除队列中,相对较快地回收对象存储空间,但是后续清理 chunk 的动作仍然是异步的。

JuiceFS-delete-file

为什么文件系统数据量与对象存储占用空间存在差异?

  • JuiceFS 随机写会产生文件碎片,因此对象存储的占用空间大部分情况下是大于等于实际大小的,尤其是短时间内进行大量的覆盖写产生许多文件碎片后,这些碎片仍旧占用着对象存储的空间。不过也不必担心,因为在每次读/写文件的时候都会检查,并在后台任务进行该文件相关碎片的整理工作。你可以通过 juicefs gc —-compact -—delete 命令手动触发合并与回收。
  • 如果开启了「回收站」功能,被删除的文件不会立刻清理,而是在回收站内保留指定时间后,才进行清理删除。
  • 碎片被合并以后,失效的旧碎片也会在回收站中进行保留(但对用户不可见),过期时间也遵循回收站的设置。如果想要清理这些碎片,阅读回收站和文件碎片
  • 如果文件系统开启了压缩功能(也就是 format 命令的 --compress 参数,默认不开启),那么对象存储上存储的对象有可能比实际文件大小更小(取决于不同类型文件的压缩比)。
  • 根据所使用对象存储的存储类型不同,云服务商可能会针对某些存储类型设置最小计量单位。例如阿里云 OSS 低频访问存储的最小计量单位是 64KB,如果单个文件小于 64KB 也会按照 64KB 计算。
  • 对于自建对象存储,例如 MinIO,实际占用大小也受到存储级别设置的影响。

JuiceFS 支持使用对象存储中的某个目录作为 --bucket 选项的值吗?

到 JuiceFS 1.0 为止,还不支持该功能。

JuiceFS 支持访问对象存储中已经存在的数据吗?

到 JuiceFS 1.0 为止,还不支持该功能。

一个文件系统可以绑定多个不同的对象存储吗(比如同时用 Amazon S3、GCS 和 OSS 组成一个文件系统)?

不支持。但在创建文件系统时可以设定关联同一个对象存储的多个 bucket,从而解决单个 bucket 对象数量限制的问题,例如,可以为一个文件系统关联多个 S3 Bucket。具体请参考 --shards 选项的说明。

性能相关问题

JuiceFS 的性能如何?

JuiceFS 是一个分布式文件系统,元数据访问的延时取决于挂载点到服务端之间 1 到 2 个网络来回(通常 1-3 ms),数据访问的延时取决于对象存储的延时 (通常 20-100 ms)。顺序读写的吞吐量可以到 50MiB/s 至 2800MiB/s(查看 fio 测试结果),取决于网络带宽以及数据是否容易被压缩。

JuiceFS 内置多级缓存(主动失效),一旦缓存预热好,访问的延时和吞吐量非常接近单机文件系统的性能(FUSE 会带来少量的开销)。

JuiceFS 支持随机读写吗?原理如何?

支持,包括通过 mmap 等进行的随机读写。目前 JuiceFS 主要是对顺序读写进行了大量优化,对随机读写的优化也在进行中。如果想要更好的随机读性能,建议关闭压缩(--compress none)。

JuiceFS 不将原始文件存入对象存储,而是将其按照某个大小(默认为 4MiB)拆分为 N 个数据块(Block)后,上传到对象存储,然后将数据块的 ID 存入元数据引擎。随机写的时候,逻辑上是要覆盖原本的内容,实际上是把要覆盖的数据块的元数据标记为旧数据,同时只上传随机写时产生的新数据块到对象存储,并将新数据块对应的元数据更新到元数据引擎中。

当读取被覆盖部分的数据时,根据最新的元数据,从随机写时上传的新数据块读取即可,同时旧数据块可能会被后台运行的垃圾回收任务自动清理。这样就将随机写的复杂度转移到读的复杂度上。

详见「内部实现」「读写请求处理流程」

怎么快速地拷贝大量小文件到 JuiceFS?

请在挂载时加上 --writeback 选项,它会先把数据写入本机的缓存,然后再异步上传到对象存储,会比直接上传到对象存储快很多倍。

请查看「客户端写缓存」了解更多信息。

JuiceFS 支持分布式缓存吗?

企业版支持,详见「分布式缓存」

访问相关问题

为什么同一个用户在主机 X 上有权限访问 JuiceFS 的文件,在主机 Y 上访问该文件却没有权限?

该用户在主机 X 和主机 Y 上的 UID 或者 GID 不一样。使用 id 命令可以显示用户的 UID 和 GID:

$ id alice
uid=1201(alice) gid=500(staff) groups=500(staff)

阅读文档「多主机间同步账户」解决这个问题。

JuiceFS 除了挂载外还支持哪些方式访问数据?

除了挂载外,还支持以下几种方式:

  • Kubernetes CSI 驱动:通过 Kubernetes CSI 驱动的方式将 JuiceFS 作为 Kubernetes 集群的存储层,详情请参考「JuiceFS CSI 驱动」
  • Hadoop Java SDK:方便在 Hadoop 体系中使用兼容 HDFS 接口的 Java 客户端访问 JuiceFS。详情请参考「Hadoop 使用 JuiceFS」
  • S3 网关:通过 S3 协议访问 JuiceFS,详情请参考「配置 JuiceFS S3 网关」
  • Docker Volume 插件:在 Docker 中方便使用 JuiceFS 的方式,详情请参考「Docker 使用 JuiceFS」
  • WebDAV 网关:通过 WebDAV 协议访问 JuiceFS

JuiceFS S3 网关支持多用户管理等高级功能吗?

JuiceFS 内置的 gateway 从 1.2 版本开始支持多用户管理等高级功能。

JuiceFS 目前有 SDK 可以使用吗?

截止到 JuiceFS 1.0 发布,社区有两个 SDK,一个是 Juicedata 官方维护的 HDFS 接口高度兼容的 Java SDK,另一个是由社区用户维护的 Python SDK