juicefs据说不错,开始进行调研
在很多场景中,业务会倾向于使用成熟方便的文件存储,像本地目录、NFS、smb等等,文件存储有其应用优势,在松鼠哥的课程中对各种存储方式的利弊介绍已经很详细了,本篇我们来介绍juicefs。
ceph虽然支持文件存储cephfs,但是它的稳定性还是不太足够,而且在大规模数据场景下,可靠性还是不太行,时至今日,使用cephfs进行大量数据的文件存储,松鼠哥还是觉得要慎重~
juicefs最开始是听一些朋友介绍,据说性能彪悍,稳定性也不错,所以一直打算调研,终于,有了本篇
开始
首先是ceph的准备,松鼠哥使用ceph 16.2.14
的二进制部署环境,集群是基本的S3对象存储环境,配置了zone
1 | root@debian:~# ceph df |
这个测试小集群只有3台机器,为了更贴合应用场景,松鼠哥使用另外一台非集群节点来作为juicefs的客户端节点。
对接S3
在使用juicefs对接ceph的S3前,需要在集群创建用户并在该用户下创建bucket
1 | root@debian:~# radosgw-admin user list |
首先要安装一个redis,juicefs可以使用多种存储引擎来存储元数据,松鼠推荐使用redis,无他,性能好
1 | root@debian4:~# apt install redis-server |
安装完成后做一下配置,指定它的监听ip,这里是测试环境,安装一个单机的试试,如果要生产用,要考虑高可用
1 | root@debian4:~# grep 'bind' /etc/redis/redis.conf |grep -v '#' |
redis准备好之后,接下来在节点安装juicefs,使用官方推荐的一键安装
1 | root@debian4:~# apt install curl |
安装完成后,格式化bucket,在这个环境中,使用方式为
1 | root@debian4:~# juicefs format --storage s3 \ |
- –storage s3 使用后端存储为S3
- –bucket 指定使用的bucket和endpoint,这里就是rgw的ip地址和端口,格式为bucket.endpoint:port
- –access-key和–secret-key
- redis://192.168.56.122/1 指定redis,刚才已经试过了,redis没问题
- myjfs 指定将该bucket格式化为myjfs的文件存储
执行后正常退出,显示已经成功,那么格式化就好了,接下来是挂载
1 | root@debian4:~# juicefs mount --background redis://192.168.56.122/1 ~/jfs |
最后显示myjfs is ready at /root/jfs
,说明挂载成功了,可以在本地文件系统查看
1 | root@debian4:~# df -h |
测试了一下,拷贝数据进去没有问题。
这里有个小问题,挂载目录后,可用大小显示为1PiB,实际上后端没有这么大的空间,应该是默认写的大小,后端对象存储是不能显式确定可用容量的,这个问题在社区群问过,确认这个是默认值,而且可以配置,比如后端实际10PiB,可以在format的时候指定显示的容量大小,这个设计合不合理,就看个人理解了。
对接librados
既然我们都玩转ceph了,走一层s3似乎没道理,多此一举,要是能够直接操作rados,岂不是更high!
实际上,juicefs支持通过librados直接操作ceph的rados,因为本质上ceph的rados就是一个对象存储,但是,要直接使用juicefs对接rados,现有的二进制包不支持,需要自己重新编译,所幸难度不大,首先下载源代码,这里松鼠哥的系统是Debian Buster 10.13,使用juicefs v1.1.2版本即可
1 | root@debian4:~# git clone https://github.com/juicedata/juicefs.git -b v1.1.2 |
接下来,配置清华源,然后安装开发包,主要是要用到它的头文件
1 | root@debian4:~# apt install software-properties-common |
当然,少不了go的环境,这里直接下载go的二进制然后配置一下路径,juicefs的编译对go版本有要求,需要1.20以上,另外gcc也要5.4以上
1 | root@debian4:~# wget https://dl.google.com/go/go1.20.4.linux-amd64.tar.gz |
在开始前,还有个步骤,juicefs在编译时会下载很多的其他代码,这些代码如果跑到外面去下载就特别慢,因此在开始前要对go进行加速器的设置,改为国内的加速器
1 | root@debian4:~# go env -w GOPROXY=https://goproxy.cn,direct |
环境没问题,那就进入juicefs目录开始编,我们只需要juicefs.ceph,所以直接编
1 | root@debian4:~# cd juicefs-1.1.2/ |
即便松鼠哥用的是很挫的虚拟机,编译速度也挺快的,算上下载,10分钟就好了。
接下来使用这个编译好的juicefs.ceph二进制进行格式化,参数和格式为
1 | root@debian4:~# juicefs format --storage=ceph \ |
- –storage=ceph表示用的librados
- –bucket 这里按照指定的格式填入使用的存储池,ceph://POOL
- –access-key和–secret-key 这里就是指定ceph的用户,不是s3用户是ceph用户
- 其他的与s3无异
讲道理,加一些新的参数是不难的,复用参数这种操作一言难尽=.=
格式化正常返回,没有报错,没问题,接下来是挂载
1 | root@debian4:~/juicefs-1.1.2# ./juicefs.ceph mount --background redis://192.168.56.122/2 ~/rados_jfs |
很顺利,看了一下本地文件系统,挂载没问题
1 | root@debian4:~/juicefs-1.1.2# df -h |
测试了一下拷贝数据进去,没问题
最后,如果要卸载juicefs挂载的目录,直接使用本地文件系统的unmount /root/jfs
即可。
总结
相比于cephfs,由于juicefs可以使用高效的源数据库,比如redis,其性能比起cephfs更高,也更灵活,由于松鼠哥的环境是虚拟机的测试环境,所以没有进行性能测试,只是简单地完成了功能测试,都挺顺利的。
fs在很多场景中应用广泛,本篇初步接触juicefs,后续将继续进行性能和稳定性及场景的测试,松鼠哥也想进一步了解这个juicefs的能力,以评估其生产环境的能力。
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2024/06/14/ceph对接juicefs/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!