如何设置对象存储
通过阅读 JuiceFS 的技术架构可以了解到,JuiceFS 是一个数据与元数据分离的分布式文件系统,以对象存储作为主要的数据存储,以 Redis、PostgreSQL、MySQL 等数据库作为元数据存储。
存储选项
在创建 JuiceFS 文件系统时,设置数据存储一般涉及以下几个选项:
--storage
指定文件系统要使用的存储类型,例如:--storage s3
。--bucket
指定存储访问地址,例如:--bucket https://myjuicefs.s3.us-east-2.amazonaws.com
。--access-key
和--secret-key
指定访问存储时的身份认证信息。
例如,以下命令使用 Amazon S3 对象存储创建文件系统:
juicefs format --storage s3 \
--bucket https://myjuicefs.s3.us-east-2.amazonaws.com \
--access-key abcdefghijklmn \
--secret-key nmlkjihgfedAcBdEfg \
redis://192.168.1.6/1 \
myjfs
其他选项
在执行 juicefs format
或 juicefs mount
命令时,可以在 --bucket
选项中以 URL 参数的形式设置一些特别的选项,比如 https://myjuicefs.s3.us-east-2.amazonaws.com?tls-insecure-skip-verify=true
中的 tls-insecure-skip-verify=true
即为跳过 HTTPS 请求的证书验证环节。
客户端证书也受支持,因为它们通常用于 mTLS 连接,例如:
https://myjuicefs.s3.us-east-2.amazonaws.com?ca-certs=./path/to/ca&ssl-cert=./path/to/cert&ssl-key=./path/to/privatekey
配置数据分片(Sharding)
创建文件系统时,可以通过 --shards
选项定义多个 Bucket 作为文件系统的底层存储。这样一来,系统会根据文件名哈希值将文件分散到多个 Bucket 中。数据分片技术可以将大规模数据并发写的负载分散到多个 Bucket 中,从而提高写入性能。
启用数据分片功能需要注意以下事项:
- 只能使用同一种对象存储下的多个 bucket
--shards
选项接受一个 0~256 之间的整数,表示将文件分散到多少个 Bucket 中。默认值为 0,表示不启用数据分片功能。- 需要使用整型数字通配符
%d
或许%x
之类指定用户生成 bucket 的 endpoint 的字符串,例如"http://192.168.1.18:9000/myjfs-%d"
,可以按照这样的格式预先创建 bucket,也可以在创建文件系统时由 JuiceFS 客户端自动创建; - 数据分片在创建时设定,创建完毕不允许修改。不可增加或减少 bucket,也不可以取消 shards 功能。
例如,以下命令创建了一个数据分片为 4 的文件系统:
juicefs format --storage s3 \
--shards 4 \
--bucket "https://myjfs-%d.s3.us-east-2.amazonaws.com" \
...
执行上述命令后,JuiceFS 客户端会创建 4 个 bucket,分别为 myjfs-0
、myjfs-1
、myjfs-2
和 myjfs-3
。
Access Key 和 Secret Key
一般而言,对象存储通过 Access Key ID 和 Access Key Secret 验证用户身份,对应到 JuiceFS 文件系统就是 --access-key
和 --secret-key
这两个选项(或者简称为 AK、SK)。
创建文件系统时除了使用 --access-key
和 --secret-key
两个选项显式指定,更安全的做法是通过 ACCESS_KEY
和 SECRET_KEY
环境变量传递密钥信息,例如:
export ACCESS_KEY=abcdefghijklmn
export SECRET_KEY=nmlkjihgfedAcBdEfg
juicefs format --storage s3 \
--bucket https://myjuicefs.s3.us-east-2.amazonaws.com \
redis://192.168.1.6/1 \
myjfs
公有云通常允许用户创建 IAM(Identity and Access Management)角色,例如:AWS IAM 角色 或 阿里云 RAM 角色,可将角色分配给 VM 实例。如果云服务器实例已经拥有读写对象存储的权限,则无需再指定 --access-key
和 --secret-key
。
使用临时访问凭证
永久访问凭证一般有两个部分:Access Key 和 Secret Key,而临时访问凭证一般包括 3 个部分:Access Key、Secret Key 与 token,并且临时访问凭证具有过期时间,一般在几分钟到几个小时之间。
如何获取临时凭证
不同云厂商的获取方式不同,一般是需要已具有相应权限用户的 Access Key、Secret Key 以及代表临时访问凭证的权限边界的 ARN 作为参数请求访问云服务厂商的 STS 服务器来获取 临时访问凭证。这个过程一般可以由云厂商提供的 SDK 简化操作。比如 Amazon S3 获取临时凭证方式可以参考这个链接,阿里云 OSS 获取临时凭证方式可以参考这个链接。
如何使用临时访问凭证设置对象存储
使用临时凭证的方式与使用永久凭证差异不大,在格式化文件系统时,将临时凭证的 Access Key、Secret Key、token 分别通过 --access-key
、--secret-key
、--session-token
设置值即可。例如:
juicefs format \
--storage oss \
--access-key xxxx \
--secret-key xxxx \
--session-token xxxx \
--bucket https://bucketName.oss-cn-hangzhou.aliyuncs.com \
redis://localhost:6379/1 \
test1
由于临时凭证很快就会过期,所以关键在于格式化文件系统以后,如何在临时凭证过期前更新 JuiceFS 正在使用的临时 凭证。一次凭证更新过程分为两步:
- 在临时凭证过期前,申请好新的临时凭证;
- 无需停止正在运行的 JuiceFS,直接使用
juicefs config Meta-URL --access-key xxxx --secret-key xxxx --session-token xxxx
命令热更新访问凭证。
新挂载的客户端会直接使用新的凭证,已经在运行的所有客户端也会在一分钟内更新自己的凭证。整个更新过程不会影响正在运行的业务。由于临时凭证过期时间较短,所以以上步骤需要长期循环执行才能保证 JuiceFS 服务可以正常访问到对象存储。
内网和外网 Endpoint
通常情况下,对象存储服务提供统一的 URL 进行访问,但云平台会同时提供内网和外网通信线路,比如满足条件的同平台云服务会自动解析通过内网线路访问对象存储,这样不但时延更低,而且内网通信产生的流量是免费的。
另外,一些云计算平台也区分内外网线路,但没有提供统一访问 URL,而是分别提供内网 Endpoint 和外网 Endpoint 地址。
JuiceFS 对这种区分内网外地址的对象存储服务也做了灵活的支持,对于共享同一个文件系统的场景,在满足条件的服务器上通过内网 Endpoint 访问对象存储,其他计算机通过外网 Endpoint 访问,可以这样使用:
- 创建文件系统时:
--bucket
建议使用内网 Endpoint 地址; - 挂载文件系统时:对于不满足内网线路的客户端,可以通过
--bucket
指定外网 Endpoint 地址。
使用内网 Endpoint 创建文件系统可以确保性能更好、延时更低,对于无法通过内网访问的客户端,可以在挂载文件系统时通过 --bucket
指定外网 Endpoint 进行挂载访问。
存储类 新增自 v1.1
对象存储通常支持多种存储类,如标准存储、低频访问存储、归档存储。不同的存储类会有不同的价格及服务可用性,你可以在创建 JuiceFS 文件系统时通过 --storage-class
选项设置默认的存储类,或者在挂载 JuiceFS 文件系统时通过 --storage-class
选项设置一个新的存储类。请查阅你所使用的对象存储的用户手册了解应该如何设置 --storage-class
选项的值(如 Amazon S3)。
当使用某些存储类(如归档、深度归档)时,数据无法立即访问,需要提前恢复数据并等待一段时间之后才能访问。
当使用某些存储类(如低频访问)时,会有最小计费单位,读取数据也可能会产生额外的费用,请查阅你所使用的对象存储的用户手册了解详细信息。
使用代理
如果客户端所在的网络环境受防火墙策略或其他因素影响需要通过代理访问外部的对象存储服务,使用的操作系统不同,相应的代理设置方法也不同,请参考相应的用户手册进行设置。
以 Linux 为例,可以通过创建 http_proxy
和 https_proxy
环境变量设置代理:
export http_proxy=http://localhost:8035/
export https_proxy=http://localhost:8035/
juicefs format \
--storage s3 \
... \
myjfs
支持的存储服务
如果你希望使用的存储类型不在列表中,欢迎提交需求 issue。
名称 | 值 |
---|---|
Amazon S3 | s3 |
Google 云存储 | gs |
Azure Blob 存储 | wasb |
Backblaze B2 | b2 |
IBM 云对象存储 | ibmcos |
Oracle 云对象存储 | s3 |
Scaleway | scw |
DigitalOcean Spaces | space |
Wasabi | wasabi |
Storj DCS | s3 |
Vultr 对象存储 | s3 |
Cloudflare R2 | s3 |
阿里云 OSS | oss |
腾讯云 COS | cos |
华为云 OBS | obs |
百度云 BOS | bos |
火山引擎 TOS | tos |
金山云 KS3 | ks3 |
青云 QingStor | qingstor |
七牛云 Kodo | qiniu |
天翼云 OOS | oos |
移动云 EOS | eos |
京东云 OSS | s3 |
优刻得 US3 | ufile |
Ceph RADOS | ceph |
Ceph RGW | s3 |
Gluster | gluster |
Swift | swift |
MinIO | minio |
WebDAV | webdav |
HDFS | hdfs |
Apache Ozone | s3 |
Redis | redis |
TiKV | tikv |
etcd | etcd |
SQLite | sqlite3 |
MySQL | mysql |
PostgreSQL | postgres |
本地磁盘 | file |
SFTP/SSH | sftp |
NFS | nfs |
Amazon S3
S3 支持两种风格的 endpoint URI:「虚拟托管类型」和「路径类型」。区别如下:
- 虚拟托管类型:
https://<bucket>.s3.<region>.amazonaws.com
- 路径类型:
https://s3.<region>.amazonaws.com/<bucket>
其中 <region>
要替换成实际的区域代码,比如:美国西部(俄勒冈)的区域代码为 us-west-2
。点此查看所有的区域代码。
AWS 中国的用户,应使用 amazonaws.com.cn
域名。相应的区域代码信息点此查看。
如果 S3 的桶具有公共访问权限(支持匿名访问),请将 --access-key
设置为 anonymous
。
JuiceFS 中可选择任意一种风格来指定存储桶的地址,例如:
- 虚拟托管类型
- 路径类型
juicefs format \
--storage s3 \
--bucket https://<bucket>.s3.<region>.amazonaws.com \
... \
myjfs
juicefs format \
--storage s3 \
--bucket https://s3.<region>.amazonaws.com/<bucket> \
... \
myjfs
你也可以将 --storage
设置为 s3
用来连接 S3 兼容的对象存储,比如:
- 虚拟托管类型
- 路径类型
juicefs format \
--storage s3 \
--bucket https://<bucket>.<endpoint> \
... \
myjfs
juicefs format \
--storage s3 \
--bucket https://<endpoint>/<bucket> \
... \
myjfs
所有 S3 兼容的对象存储服务其 --bucket
选项的格式为 https://<bucket>.<endpoint>
或者 https://<endpoint>/<bucket>
,默认的 region
为 us-east-1
,当需要不同的 region
的时候,可以通过环境变量 AWS_REGION
或者 AWS_DEFAULT_REGION
手动设置。
Google 云存储
Google 云采用 IAM 管理资源的访问权限,通过对服务账号授权,可以对云服务器、对象存储的访问权限进行精细化的控制。
对于归属于同一服务账号的云服务器和对象存储,只要该账号赋予了相关资源的访问权限,创建 JuiceFS 文件系统时无需提供身份验证信息,云平台会自行完成鉴权。
对于要从谷歌云平台外部访问对象存储的情况,比如要在本地计算机上使用 Google 云存储创建 JuiceFS 文件系统,则需要配置认证信息。由于 Google 云存储并不使用 Access Key ID 和 Access Key Secret,而是通过服务账号的 JSON 密钥文件验证身份。
请参考「以服务帐号身份进行身份验证」为服务账号创建 JSON 密钥文件并下载到本地计算机,通过 GOOGLE_APPLICATION_CREDENTIALS
环境变量定义密钥文件的路径,例如:
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/service-account-file.json"
可以把创建环境变量的命令写入 ~/.bashrc
或 ~/.profile
让 Shell 在每次启动时自动设置。
配置了传递密钥信息的环境变量以后,在本地和在 Google 云服务器上创建文件系统的命令是完全相同的。例如:
juicefs format \
--storage gs \
--bucket <bucket>[.region] \
... \
myjfs
可以看到,命令中无需包含身份验证信息,客户端会通过前面环境变量设置的 JSON 密钥文件完成对象存储的访问鉴权。同时,由于 bucket 名称是 全局唯一 的,创建文件系统时,--bucket
选项中只需指定 bucket 名称即可。
Azure Blob 存储
使用 Azure Blob 存储作为 JuiceFS 的数据存储,请先 查看文档 了解如何查看存储帐户的名称和密钥,它们分别对应 --access-key
和 --secret-key
选项的值。
--bucket
选项的设置格式为 https://<container>.<endpoint>
,请将其中的 <container>
替换为实际的 Blob 容器的名称,将 <endpoint>
替换为 core.windows.net
(Azure 全球)或 core.chinacloudapi.cn
(Azure 中国)。例如:
juicefs format \
--storage wasb \
--bucket https://<container>.<endpoint> \
--access-key <storage-account-name> \
--secret-key <storage-account-access-key> \
... \
myjfs
除了使用 --access-key
和 --secret-key
选项之外,你也可以使用 连接字符串 并通过 AZURE_STORAGE_CONNECTION_STRING
环境变量进行设定。例如:
# Use connection string
export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=XXX;EndpointSuffix=core.windows.net"
juicefs format \
--storage wasb \
--bucket https://<container> \
... \
myjfs
对于 Azure 中国用户,EndpointSuffix
的值为 core.chinacloudapi.cn
。
Backblaze B2
使用 Backblaze B2 作为 JuiceFS 的数据存储,需要先创建 application key,Application Key ID 和 Application Key 分别对应 Access Key 和 Secret Key。
Backblaze B2 支持两种访问接口:B2 原生 API 和 S3 兼容 API。
B2 原生 API
存储类型应设置为 b2
,--bucket
只需设置 bucket 名称。例如:
juicefs format \
--storage b2 \
--bucket <bucket> \
--access-key <application-key-ID> \
--secret-key <application-key> \
... \
myjfs
S3 兼容 API
存储类型应设置为 s3
,--bucket
应指定完整的 bucket 地址。例如:
juicefs format \
--storage s3 \
--bucket https://s3.eu-central-003.backblazeb2.com/<bucket> \
--access-key <application-key-ID> \
--secret-key <application-key> \
... \
myjfs
IBM 云对象存储
使用 IBM 云对象存储创建 JuiceFS 文件系统,你首先需要创建 API key 和 instance ID。API key 和 instance ID 分别对应 Access Key 和 Secret Key。
IBM 云对象存储为每一个区域提供了 公网
和 内网
两种 endpoint 地址,你可以根据实际需要选用。例如:
juicefs format \
--storage ibmcos \
--bucket https://<bucket>.<endpoint> \
--access-key <API-key> \
--secret-key <instance-ID> \
... \
myjfs
Oracle 云对象存储
Oracle 云对象存储支持 S3 兼容的形式进行访问,详细请参考官方文档。
该对象存储的 endpoint
格式为:${namespace}.compat.objectstorage.${region}.oraclecloud.com
,例如:
juicefs format \
--storage s3 \
--bucket https://<bucket>.<endpoint> \
--access-key <your-access-key> \
--secret-key <your-sceret-key> \
... \
myjfs
Scaleway
使用 Scaleway 对象存储作为 JuiceFS 数据存储,请先 查看文档 了解如何创建 Access Key 和 Secret Key。
--bucket
选项的设置格式为 https://<bucket>.s3.<region>.scw.cloud
,请将其中的 <region>
替换成实际的区域代码,例如:荷兰阿姆斯特丹的区域代码是 nl-ams
。点此 查看 所有可用的区域代码。
juicefs format \
--storage scw \
--bucket https://<bucket>.s3.<region>.scw.cloud \
... \
myjfs
DigitalOcean Spaces
使用 DigitalOcean Spaces 作为 JuiceFS 数据存储,请先 查看文档 了解如何创建 Access Key 和 Secret Key。
--bucket
选项的设置格式为 https://<space-name>.<region>.digitaloceanspaces.com
,请将其中的 <region>
替换成实际的区域代码,例如:nyc3
。点此查看 所有可用的区域代码。
juicefs format \
--storage space \
--bucket https://<space-name>.<region>.digitaloceanspaces.com \
... \
myjfs
Wasabi
使用 Wasabi 作为 JuiceFS 数据存储,请先 查看文档 了解如何创建 Access Key 和 Secret Key。
--bucket
选项的设置格式为 https://<bucket>.s3.<region>.wasabisys.com
,请将其中的 <region>
替换成实际的区域代码,例如:US East 1 (N. Virginia) 的区域代码为 us-east-1
。点此查看 所有可用的区域代码。
juicefs format \
--storage wasabi \
--bucket https://<bucket>.s3.<region>.wasabisys.com \
... \
myjfs
Tokyo (ap-northeast-1) 区域的用户,查看 这篇文档 了解 endpoint URI 的设置方法。
Storj DCS
使用 Storj DCS 作为 JuiceFS 数据存储,请先参照 这篇文档 了解如何创建 Access Key 和 Secret Key。
Storj DCS 兼容 AWS S3,存储类型使用 s3
,--bucket
格式为 https://gateway.<region>.storjshare.io/<bucket>
。<region>
为存储区域,目前 DCS 有三个可用存储区域:us1、ap1 和 eu1。
juicefs format \
--storage s3 \
--bucket https://gateway.<region>.storjshare.io/<bucket> \
--access-key <your-access-key> \
--secret-key <your-sceret-key> \
... \
myjfs
因为 Storj DCS 的 ListObjects API 并非完全 S3 兼容(返回结果没有实现排序功能),所以 JuiceFS 的部分功能无法使用,比如 juicefs gc
,juicefs fsck
,juicefs sync
,juicefs destroy
。另外,使用 juicefs mount
时需要关闭元数据自动备份功能,即加上 --backup-meta 0
。
Vultr 对象存储
Vultr 的对象存储兼容 S3 API,存储类型使用 s3
,--bucket
格式为 https://<bucket>.<region>.vultrobjects.com/
。例如:
juicefs format \
--storage s3 \
--bucket https://<bucket>.ewr1.vultrobjects.com/ \
--access-key <your-access-key> \
--secret-key <your-sceret-key> \
... \
myjfs
访问对象存储的 API 密钥可以在 管理控制台 中找到。
Cloudflare R2
R2 是 Cloudflare 的对象存储服务,提供 S3 兼容的 API,因此用法与 Amazon S3 基本一致。请参照文档了解如何创建 Access Key 和 Secret Key。
juicefs format \
--storage s3 \
--bucket https://<ACCOUNT_ID>.r2.cloudflarestorage.com/myjfs \
--access-key <your-access-key> \
--secret-key <your-sceret-key> \
... \
myjfs
对于生产环境,建议通过 ACCESS_KEY
和 SECRET_KEY
环境变量传递密钥信息,例如:
export ACCESS_KEY=<your-access-key>
export SECRET_KEY=<your-sceret-key>
juicefs format \
--storage s3 \
--bucket https://<ACCOUNT_ID>.r2.cloudflarestorage.com/myjfs \
... \
myjfs
因为 Cloudflare R2 的 ListObjects
API 并非完全 S3 兼容(返回结果没有实现排序功能),所以 JuiceFS 的部分功能无法使用,比如 juicefs gc
、juicefs fsck
、juicefs sync
、juicefs destroy
。另外,使用 juicefs mount
时需要关闭元数据自动备份功能,即加上 --backup-meta 0
。
阿里云 OSS
使用阿里云 OSS 作为 JuiceFS 数据存储,请先参照 这篇文档 了解如何创建 Access Key 和 Secret Key。如果你已经创建了 RAM 角色 并指派给了云服务器实例,则在创建文件系统时可以忽略 --access-key
和 --secret-key
选项。
阿里云也支持使用 Security Token Service (STS) 作为 OSS 的临时访问身份验证。如果你要使用 STS,请设置 ALICLOUD_ACCESS_KEY_ID
、ALICLOUD_ACCESS_KEY_SECRET
和 SECURITY_TOKEN
环境变量,不要设置 --access-key
and --secret-key
选项。例如:
# Use Security Token Service (STS)
export ALICLOUD_ACCESS_KEY_ID=XXX
export ALICLOUD_ACCESS_KEY_SECRET=XXX
export SECURITY_TOKEN=XXX
juicefs format \
--storage oss \
--bucket https://<bucket>.<endpoint> \
... \
myjfs
阿里云 OSS 为每个区域都提供了 公网
和 内网
endpoint 链接,你可以根据实际的场景选用。
如果你是在阿里云的服务器上创建文件系统,可以在 --bucket
选项中直接指定 bucket 名称。例如:
# 在阿里云中运行
juicefs format \
--storage oss \
--bucket <bucket> \
... \
myjfs