最近想做点小玩意,在数据方面有这些需求:
存算分离,存储使用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了。
默认的模板刷新时间可能比较长,点击右上角齿轮,修改刷新时间到5秒。
可以显示当前的总容量,文件数,IO之类的数据。更详细的数据还是要通过stats命令。
3,疑难杂症
下面开始出现疑难杂症:
1,各类权限不足,访问失败
其他需要访问JuiceFS挂载盘上的数据的程序访问数据时报权限错误,Permission Denied之类的错误。
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支持一机挂多盘和一盘挂多机。参考这个查看多个挂载点的情况。
q9n07z
zt71cs
aox1z6
bstu5k
65el8h
lrbjdh