试用JuiceFS挂载S3 Object Storage

最近想做点小玩意,在数据方面有这些需求:

存算分离,存储使用S3/OSS供应商,与计算单元解耦。S3/OSS支持无限容量扩容,只要付得起费用。

直接支持POSIX,避免更改现有的应用程序。最好能支持容器化。

支持透明加解密,S3中不能保存明文。

最好能支持一定程度的缓存,减少费用。

性能过得去就行。之所以不把S3源地址暴露给客户端是安全考虑。

研究了一下JuiceFS和SeeweedFS,先从比较简单的JuiceFS开始测试吧!

JuiceFS是一家Chinese公司的产品,但是开源。

1,安装、挂载S3

按照官方社区版(免费)说明直接安装在主机上,不推荐安装在容器内。

到S3供应商申请S3账号,准备AK/SK、桶名、Endpoint URL等必要参数。

生成RSA私钥

openssl genrsa -out key.pem -aes256 2048

会要求对私钥加密,输入加密密码。此密码记作 rsapasswd 今后需要使用。

请备份好RSA私钥文件、RSA私钥密码,丢失将无法对文件系统解密。

因为是测试环境,这里就用sqlite了。生产环境用redis之类的。

在S3指定的bucket里创建你自己的文件系统:

juicefs format --storage s3 \
    --encrypt-rsa-key key.pem \
    --bucket https://endpoint.s3provider.com/yourbucketname \
    --access-key ACCESSKEY******* \
    --secret-key SECRETKEY******* \
    sqlite3://testjfs.db testjfs

这里就建立了一个文件系统,建立在指定的S3 bucket yourbucketname上,元数据存储在 sqlite3://testjfs.db 文件系统名称 testjfs。

注意此时所有数据(S3挂载点、桶结构、AK/SK)都已经存储在数据库里了,也就是任何计算机只要持有testjfs.db 就可以使用这个盘。同理,如果元数据存入了正常的数据库里,其他主机通过访问这个数据库即可获得挂载所需参数。

按照下面命令挂载:

首先通过环境变量载入刚才设置的RSA私钥密码:

export JFS_RSA_PASSPHRASE=rsapasswd
juicefs mount -o allow_other sqlite3://testjfs.db /mnt/jfs --background

挂载选项:-o allow_other 允许非挂载用户访问, –background 后台运行,关闭终端后如果没有后台运行,会取消挂载。

注意此时如果没有指定RSA密钥位置,默认当前目录下寻找刚才设定的key.pem,找不到文件会报错,可以给绝对路径。key.pem已经被刚才设定的密码加密,因此必须通过环境变量载入密码,不然也会失败。

开机自动挂载见文档

此时就在 /mnt/jfs 下挂载了JuiceFS,其元数据存储在 sqlite3://testjfs.db, 数据文件存储在S3, RSA私钥是key.pem,由设定的密码 rsapasswd加密。

其使用类似于FUSE,解密是透明的,打开S3浏览器可以看到chunk文件,都是大小4MB以下的密文碎片。

JuiceFS自带缓存功能,可以减少一些S3的流量费。

2,控制面板

JuiceFS社区版没有自己的控制面板,要么使用juicefs stats之类的命令,要么使用普罗米修斯。

JuiceFS默认给了一个普罗米修斯的接口,下面安装一套Prometheus+Grafana 状态面板。

从这里开始,终于开始出现各类问题。开源软件哪有不折腾的?

官方文档,发现普罗米修斯的接口在 http://localhost:9567/metrics

localhost就是127.0.0.1,可是一般情况下我们会把Prometheus和Grafana装在容器里,谁吃饱了装在host上呢? 然而容器要访问host的127.0.0.1就困难了….

我看了一圈文档,说是mac和windows上面可以通过一个特殊的名称来访问host的127.0.0.1,要么把prometheus装在host网络,其他的linux很难办。

后来我看到官方文档下面说了….你也可以自定义metrics……

juicefs mount --metrics localhost:9567 ...

改成0.0.0.0,就比较容易访问到了…

Grafana在官方文档里下载一个模板,载入Prometheus数据到模板,就有了自己的dashborad了。

Grafana

默认的模板刷新时间可能比较长,点击右上角齿轮,修改刷新时间到5秒。

可以显示当前的总容量,文件数,IO之类的数据。更详细的数据还是要通过stats命令。

3,疑难杂症

下面开始出现疑难杂症:

1,各类权限不足,访问失败

其他需要访问JuiceFS挂载盘上的数据的程序访问数据时报权限错误,Permission Denied之类的错误。

按照官方文档,建议用root挂载文件系统。

2,下载来的数据权限有问题

经过仔细检查,似乎JuiceFS本身不会改动外部输入的文件的权限属性。假如你使用一些数据同步工具(Syncthing这一类)或者什么下载器,文件下载来是什么权限,就还是什么权限。这些工具有的是容器化的,有的是直接安装的,创建的文件用户、权限五花八门,再被其他程序调用会出错。

有的容器进程在没有 allow_other 的情况下无法访问bind挂载进来的JuiceFS目录。

各类容器的GID UID也不一样。

如果你有时间就慢慢排查吧,没时间, sudo chmod -R 777 /mnt/jfs/your-data-dir 一把梭。 (切勿在生产环境中这样做)

3, S3慢…

你可以选择加钱… 比如你用AWS,那就用AWS的虚拟机… 同理阿里云,最大限度的降低访问S3的延迟。

或者挂载多个S3供应商… 把数据分类,比如备份什么的就Backblaze B2…

JFS支持一机挂多盘和一盘挂多机。参考这个查看多个挂载点的情况。