如何设置元数据引擎
META_PASSWORD
是 JuiceFS v1.0 新增功能,旧版客户端需要升级后才能使用。
JuiceFS 采用数据和元数据分离的存储架构,元数据可以存储在任意支持的数据库中,称为「元数据存储引擎」。JuiceFS 支持众多元数据存储引擎,各个数据库 性能、易用性、场景均有区别,具体性能对比可参考该文档。
元数据存储用量
元数据所需的存储空间跟文件名的长度、文件的类型和长度以及扩展属性等相关,无法准确地估计一个文件系统的元数据存空间需求。简单起见,我们可以根据没有扩展属性的单个小文件所需的存储空间来做近似:
- 键值(Key-Value)数据库(如 Redis、TiKV):300 字节/文件
- 关系型数据库(如 SQLite、MySQL、PostgreSQL):600 字节/文件
当平均文件更大(超过 64MB),或者文件被频繁修改导致有很多碎片,或者有很多扩展属性,或者平均文件名很长(超过 50 字节),都会导致需要更多的存储空间。
当你需要在两种类型的元数据引擎之间迁移时,就可以据此来估算所需的存储空间。例如,假设你希望将元数据引擎从一个关系型数据库(MySQL)迁移到键值数据库(Redis),如果当前 MySQL 的用量为 30GB,那么目标 Redis 至少需要准备 15GB 以上的内存。反之亦然。
Redis 兼容数据库
Redis
JuiceFS 要求使用 4.0 及以上版本的 Redis。JuiceFS 也支持使用 Redis Cluster 作为元数据引擎,但为了避免在 Redis 集群中执行跨节点事务,同一个文件系统的元数据总会坐落于单个 Redis 实例中。
为了保证元数据安全,JuiceFS 需要 maxmemory-policy noeviction
,否则在启动 JuiceFS 的时候将会尝试将其设置为 noeviction
,如果设置失败将会打印告警日志。更多可以参考 Redis 最佳实践。
创建文件系统
使用 Redis 作为元数据存储引擎时,通常使用以下格式访问数据库:
- TCP
- Unix socket
redis[s]://[<username>:<password>@]<host>[:<port>]/<db>
unix://[<username>:<password>@]<socket-file-path>?db=<db>
其中,[]
括起来的是可选项,其它部分为必选项。
- 如果开启了 Redis 的 TLS 特性,协议头需要使用
rediss://
,否则使用redis://
。 <username>
是 Redis 6.0 之后引入的,如果没有用户名可以忽略,但密码前面的:
冒号需要保留,如redis://:<password>@<host>:6379/1
。- Redis 监听的默认端口号为
6379
,如果没有改变默认端口号可以不用填写,如redis://:<password>@<host>/1
,否则需要显式指定端口号。 - Redis 支持多个逻辑数据库,请将
<db>
替换为实际使用的数据库编号。 - 如果需要连接 Redis 哨兵(Sentinel),元数据 URL 的格式会稍有不同,具体请参考「Redis 最佳实践」。
- 如果 Redis 的用户名或者密码中包含特殊字符,需要使用单引号进行封闭,避免 shell 进行解释。或者使用环境变量
REDIS_PASSWORD
进行传递。
一个 Redis 实例默认可以创建 16 个逻辑数据库,而一个逻辑数据库可以创建一个 JuiceFS 文件系统。也就是说,在默认情况下,你可以使用一个 Redis 实例创建 16 个 JuiceFS 文件系统。需要注意,用于 JuiceFS 的逻辑数据库不要和其他应用共享,否则可能会造成数据混乱。
例如,创建名为 pics
的文件系统,使用 Redis 的 1
号数据库存储元数据:
juicefs format \
--storage s3 \
... \
"redis://:[email protected]:6379/1" \
pics
安全起见,建议使用环境变量 META_PASSWORD
或 REDIS_PASSWORD
传递数据库密码,例如:
export META_PASSWORD=mypassword
然后就无需在元数据 URL 中设置密码了:
juicefs format \
--storage s3 \
... \
"redis://192.168.1.6:6379/1" \
pics