JuiceFS 对比 S3QL

与 JuiceFS 类似,S3QL 也是一款由对象存储和数据库组合驱动的开源网络文件系统,所有存入的数据会被分块后存储到亚马逊 S3、Backblaze B2、OpenStack Swift 等主流的对象存储中,相应的元数据会存储在数据库中。

共同点

  • 都是通过 FUSE 模块实现对标准 POSIX 文件系统接口的支持,从而可以将海量的云端存储挂载到本地,像本地存储一样使用。
  • 都能提供标准的文件系统功能:硬链接、符号链接、扩展属性、文件权限。
  • 都支持数据压缩和加密,但二者采用的算法各有不同。

不同点

  • S3QL 仅支持 SQLite 一种数据库,而 JuiceFS 除了支持 SQLite 以外还支持 Redis、TiKV、MySQL、PostgreSQL 等数据库。
  • S3QL 没有分布式能力,不支持多主机同时挂载。JuiceFS 是典型的分布式文件系统,在使用基于网络的数据库时,支持多主机分布式挂载读写。
  • S3QL 在一个数据块几秒内未被访问时将其上传到对象存储。文件被关闭甚者 fsync 后其仍仅保证在系统内存中,节点故障时可能丢失数据。JuiceFS 确保了数据的高可靠性,在文件关闭时会将其同步上传到对象存储。
  • S3QL 提供数据去重,相同数据只存储一份,可以降低对象存储的用量,但也会加重系统的性能开销。相比之下,JuiceFS 更注重性能,对大规模数据去重代价过高,暂不提供该功能。
  • S3QL 提供了元数据远程同步备份功能,存有元数据的 SQLite 数据库会异步备份到对象存储。JuiceFS 以使用 Redis、MySQL 等网络数据库为主,并未直接提供 SQLite 数据库同步备份功能,但 JuiceFS 支持元数据的导入导出,以及各种存储后端的同步功能,用户可以很容易将元数据备份到对象存储,也支持在不同数据库之间迁移。
S3QLJuiceFS
元数据引擎SQLiteRedis、MySQL、SQLite、TiKV
存储引擎对象存储、本地磁盘对象存储、WebDAV、本地磁盘
操作系统Unix-likeLinux、macOS、Windows
压缩算法LZMA, bzip2, gziplz4, zstd
加密算法AES-256AES-GCM, RSA
POSIX 兼容
硬链接
符号链接
扩展属性
标准 Unix 权限
数据分块
本地缓存
空间弹性伸缩
元数据备份
数据去重
只读目录
快照
共享挂载
Hadoop SDK
Kubernetes CSI Driver
S3 网关
开发语言PythonGo
开源协议GPLv3Apache License 2.0
开源时间20112021.1

易用性

这部分主要评估两个产品在安装和使用上的的易用程度。

安装

在安装过程中,我们使用 Rocky Linux 8.4 操作系统(内核版本 4.18.0-305.12.1.el8_4.x86_64)。

S3QL

S3QL 采用 Python 开发,在安装时需要依赖 python-devel 3.7 及以上版本。另外,还需要至少满足以下依赖:fuse3-devel、gcc、pyfuse3、sqlite-devel、cryptography、defusedxml、apsw、dugong。另外,需要特别注意 Python 的包依赖和位置问题。

S3QL 会在系统中安装 12 个二进制程序,每个程序都提供一个独立的功能,如下图。

JuiceFS 对比 S3QL - 图1

JuiceFS

JuiceFS 客户端采用 Go 语言开发,直接下载预编译的二进制文件即可直接使用。JuiceFS 客户端只有一个二进制程序 juicefs,将其拷贝到系统的任何一个可执行路径下即可,比如:/usr/local/bin

使用

S3QL 和 JuiceFS 都使用数据库保存元数据,S3QL 仅支持 SQLite 数据库,JuiceFS 支持 Redis、TiKV、MySQL、MariaDB、PostgreSQL 和 SQLite 等数据库。

这里使用本地创建的 Minio 对象存储,使用两款工具分别创建文件系统:

S3QL

S3QL 使用 mkfs.s3ql 工具创建文件系统:

  1. $ mkfs.s3ql --plain --backend-options no-ssl -L s3ql s3c://127.0.0.1:9000/s3ql/

挂载文件系统使用 mount.s3ql

  1. $ mount.s3ql --compress none --backend-options no-ssl s3c://127.0.0.1:9000/s3ql/ mnt-s3ql

S3QL 在创建和挂载文件系统时都需要通过命令行交互式的提供对象存储 API 的访问密钥。

JuiceFS

JuiceFS 使用 format 子命令创建文件系统:

  1. $ juicefs format --storage minio \
  2. --bucket http://127.0.0.1:9000/myjfs \
  3. --access-key minioadmin \
  4. --secret-key minioadmin \
  5. sqlite3://myjfs.db \
  6. myjfs

挂载文件系统使用 mount 子命令:

  1. $ sudo juicefs mount -d sqlite3://myjfs.db mnt-juicefs

JuiceFS 只在创建文件系统时设置对象存储 API 访问密钥,相关信息会写入元数据引擎,之后挂载使用无需重复提供对象存储地址、密钥等信息。

对比总结

S3QL 采用对象存储 + SQLite 的存储结构,数据分块存储既能提高文件的读写效率,也能降低文件修改时的资源开销。贴心的提供了快照、数据去重、数据保持等高级功能,加之默认的数据压缩和数据加密,让 S3QL 非常适合个人在云存储上用较低的成本、更安全的存储文件。

JuiceFS 支持对象存储、HDFS、WebDAV、本地磁盘作为数据存储引擎,支持 Redis、TiKV、MySQL、MariaDB、PostgreSQL、SQLite 等流行的数据作为元数据存储引擎。除了通过 FUSE 提供标准的 POSIX 文件系统接口以外,JuiceFS 还提供 Java API,可以直接替代 HDFS 为 Hadoop 提供存储。同时还提供 Kubernetes CSI Driver,可以作为 Kubernetes 的存储层做数据持久化存储。JucieFS 是为企业级分布式数据存储场景设计的文件系统,广泛应用于大数据分析、机器学习、容器共享存储、数据共享及备份等多种场景。