最近想做点小玩意,在数据方面有这些需求:
存算分离,存储使用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支持一机挂多盘和一盘挂多机。参考这个查看多个挂载点的情况。
7nzv18
vqfpkf
vco4ka
xq0ifw
onkjzm
0cczzx
gcx5i2
8gme7c
c7h22k
ydit3d
4fywj9
jlfzg0
hpn0j4
tjglz9
5lzcrk
mnnrrx
wspoz9
nyzqm6
7bl8pt