目 录
1 前言 1
2 实验环境 1
2.1 JuiceFS系统架构 1
2.2 JuiceFS的S3网关架构 2
2.3 系统架构 2
3 软件安装 3
3.1 Redis容器 3
3.1 JuiceFS客户端(Linux) 6
3.2 JuiceFS客户端(Windows) 7
4 创建文件系统 8
5 使用S3 网关 8
6 挂载文件系统 11
7 共享文件系统 13
分布式存储-第5期
(MinIO集群+JuiceFS)
元工:2022.07.22
前言
背景:最近大家对容器技术的讨论越来越多,兴趣也越来越浓,容器的应用场景也非常之多,其中在分布式系统应用领域更突显它的优势和魅力,本文是工作之余所做相关实验的整理,供大家一起学习和分享。
目标:在仅有的一台工作电脑上搭建全能型虚拟化容器平台,并在其上运行目前主流的分布式存储系统(如:Ceph、Minio、GlusterFS等)作为应用场景进行全方位体验和学习。
亮点:验证了MinIO集群与JuiceFS的接口、S3网关、POSIX文件系统接口、以及之上的NFS文件服务等功能。
价值:减少学习的硬件成本、减少学习目标前面的障碍、化天堑为通途;不仅是学习容器技术的入门宝典,也为学习分布式存储系统的同学提供了实验环境准备的方法。
使用要求:对Linux、VMware workstaion有一定的熟悉,祝您使用愉快!
本系列书目:
- 第1期:容器化部署分布式系统(Docker-Compose+MinIO集群), [元工]
- 第2期:容器化部署分布式系统(kubernetes之kubeadm安装), [元工]
- 第3期:容器化部署分布式系统(kubernetes之操作实践), [元工]
- 第4期:容器化部署分布式系统(kubernetes+MinIO集群), [元工,李有军]
- 第5期:容器化部署分布式系统(MinIO集群+JuiceFS), [元工,王伟]
实验环境
JuiceFS系统架构
JuiceFS 文件系统由三个部分组成:
- JuiceFS 客户端:协调对象存储和元数据存储引擎,以及 POSIX、Hadoop、Kubernetes CSI Driver、S3 Gateway 等文件系统接口的实现;
- 数据存储:存储数据本身,支持本地磁盘、公有云或私有云对象存储、HDFS 等介质;
- 元数据引擎:存储数据对应的元数据(metadata)包含文件名、文件大小、权限组、创建修改时间和目录结构,支持 Redis、MySQL、TiKV 等多种引擎;
PS:本文将后面两个部分统称为"后端系统"。
JuiceFS的S3网关架构
JuiceFS 会将文件分块存储到底层的对象存储中,不能直接使用底层对象存储的接口和界面来直接访问文件,而S3 网关提供了类似底层对象存储的访问能力,架构图如下:
系统架构
本期将直接利用第1期在虚拟机CS01上完成的“单节点MinIO集群”环境,或者基于它克隆出虚拟机MR01(方法请参考第2期3.1章节),然后再增加redis容器运行实例,即可完成整个后端系统的部署。JuiceFS客户端根据实际需要,在宿主机、虚拟机(CS01、CS02...)、甚至在其中的容器实例中都是可安装和部署的,条件是只要网络可到达后端系统即可,本实验中的“JuiceFS客户端1/2”分别安装在宿主机windows平台 CS01虚拟机Linux平台上的。整个系统的网络拓扑如下图所示:
软件安装
Redis容器
1)创建Redis目录
// 修改host名 [root@cs01 ~]# hostnamectl set-hostname mr01 && bash // 创建目录 [root@mr01 ~]# mkdir redis [root@mr01 ~]# cd redis/ [root@mr01 redis]# mkdir conf data logs |
2)创建redis配置文件
[root@mr01 redis]# cd conf/ [root@mr01 conf]# vim redis.conf bind 0.0.0.0 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile "" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir ./ slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # 验证密码 requirepass 123 |
3)复制"第1期"中的"docker-compose.yaml"文件,并在其中增加redis的安装
[root@mr01 conf]# cd [root@mr01 ~]# cp ./MinIO/docker-compose.yaml ./ [root@mr01 ~]# vim docker-compose.yaml // 在"nginx"的后面增加下面内容: redis: image: redis restart: always hostname: redis container_name: redis privileged: true ports: - 6379:6379 environment: TZ: Asia/Shanghai volumes: - ~/redis/data:/data - ~/redis/conf/redis.conf:/etc/redis/redis.conf - ~/redis/logs:/logs command: ["redis-server","/etc/redis/redis.conf"] // 结果如下: // 保存后退出。 |
4)启动整个后台系统(包括了Minio集群和redis)
// 拉取镜像 [root@mr01 ~]# docker-compose pull // 创建运行 [root@mr01 ~]# docker-compose up // 以上输出结果,表示Minio集群和redis都已创建完成和启动成功。 |
5)验证Redis的安装结果
// 另开启一个终端,进入redis容器控制台 [root@mr01 ~]# docker exec -it redis redis-cli 按以上的测试结果,表示redis安装成功!然后退出 |
JuiceFS客户端(Linux)
1)下载
在 GitHub 找到最新版客户端下载地址,面向x86架构的Linux发行版文件为"juicefs-x.x.x-linux-amd64.tar.gz",保存至下面新建的目录中。 [root@mr01 ~]# mkdir juicefs |
2)解压
[root@mr01 ~]# cd juicefs [root@mr01 juicefs]# tar -zxf juicefs-1.0.0-rc2-linux-amd64.tar.gz |
3)安装
[root@mr01 juicefs]# install juicefs /usr/local/bin/ |
4)验证
// 回到home目录 [root@mr01 juicefs]# cd // 执行命令 [root@mr01 ~]# juicefs // 如以上输出结果,表示安装成功! |
JuiceFS客户端(Windows)
1)安装依赖程序WinFsp
由于Windows没有原生支持FUSE 接口,还需下载安装 WinFsp才能实现对FUSE的支持。 // 安装过程简单,略! |
2)下载
在 GitHub 找到最新版客户端下载地址,面向x86架构的Windows发行版文件为"juicefs-x.x.x-windows-amd64.tar.gz" |
3)解压和安装
// 解压到C:\juicefs 文件夹,并将其添加到系统环境'Path'变量中。 |
4)验证
// 打开命令行终端后,执行命令'juicefs' // 如以上输出结果,说明安装成功! |
创建文件系统
1)准备MinIO对象存储(即第1期完成的环境)
Bucket Endpoint:http://192.168.66.11:9000/buck1/ Access Key ID:minioadmin Access Key Secret:minioadmin |
2)准备redis数据库
数据库地址:192.168.66.11:6379 数据库用户名:空 数据库密码:123 |
3)创建文件系统
// 执行命令 juicefs format --storage minio --bucket http://192.168.66.11:9000/buck1/ --access-key minioadmin --secret-key minioadmin redis://:[email protected]:6379/1 myjfs // 结果1(在Linux系统下) // 结果2 (在windows系统下) |
使用S3 网关
1)先决条件
已经完成了前面的“创建文件系统” |
2)设置环境变量
选择1(linux系统客户端) [root@mr01 ~]# export MINIO_ROOT_USER=admin [root@mr01 ~]# export MINIO_ROOT_PASSWORD=12345678 选择2(windows系统客户端) C:\Windows\system32>set MINIO_ROOT_USER=admin C:\Windows\system32>set MINIO_ROOT_PASSWORD=12345678 |
3)启用S3网关
// 执行命令 juicefs gateway redis://:[email protected]:6379/1 localhost:9080 // 结果1(在Linux系统下) // 结果2(在Windows系统下) |
4)访问S3网关
在JuiceFS客户端(也是S3网关)上,通过浏览器打开"http://localhost:9080",输入用户名/密码(admin/12345678),如下图所示:
5)上传文件
登录进入后,并上传一个文件(如:'hujy-music.mp3',大小为3.2MB),如下图所示:
6)查看对象存储:登录到MinIO管理控制台(http://192.168.66.11:9001/),查看"buck1/myjfs/"中的对象存储情况,如下图所示:
简析:前面上传的文件是3.2MiB,因为小于4MiB,所以没有分片,只有1个文件。
7)重新上传一个大文件(如:'hujy-2music.mp3',大小为6.48MB),结果如下:
- 使用S3网关查看:
- 使用MinIO对象存储查看:
简析:第2文件按照4MB规格分成了2个文件(2_0_4194304和2_1_2599274)
小结:JuiceFS系统的存储文件思想,简单讲就是其客户端先按自己存储策略"Chunks,Slices,Blocks"将原始文件最终切分为多个默认大小为4MB的"Block",这部分对应产生的元数据采用redis数据库提供快速存储和广泛共享;然后将接下来的“Block”存储任务交给了底层的对象存储系统去完成。
挂载文件系统
1)由于这个文件系统的「数据」和「元数据」都存储在网络中同一个redis服务中,因此在任何安装了JuiceFS 客户端的计算机上都可以同时挂载该文件系统进行共享读写。
[root@mr01 ~]# juicefs mount -d redis://:[email protected]:6379/1 $HOME/mnt // 查看结果:看到前面通过S3网关上传的两个mp3文件,是不是很好玩?! |
2)再试试用SFTP工具上传文件"hujy-3music.mp3"至以上的挂载目录
// 查看结果:挂载的目录下多了一个"hujy-3music.mps"的文件 |
3)再试试用S3网关查看结果。
4)在MinIO对象存储上查看的结果,发现JuiceFS对"hujy-3music.mp3"用了一个不同的'Slice'处理,并将其切分成了3个'Block'存放到了对象存储系统中。
5)卸载文件系统
[root@mr01 ~]# juicefs umount $HOME/mnt |
共享文件系统
1)在mr01上安装NFS
步骤参考《系列1:第3期》的章节10.4,不再赘述 |
2)创建配置文件/etc/exports
[root@mr01 mnt]# vim /etc/exports /root/mnt/ 192.168.66.0/24(rw,all_squash,fsid=0) |
3)重启
[root@mr01 mnt]# systemctl restart nfs [root@mr01 mnt]# systemctl status nfs |
4)在
打开命令行窗口,执行下面命令查看 nfs 服务提供的共享 C:\Windows\system32>showmount -e 192.168.66.11 导出列表在 192.168.66.11: /root/mnt 192.168.66.0/24 C:\Windows\system32>mount \\192.168.66.11\root\mnt x: x: 现已成功连接到 \\192.168.66.11\root\mnt 命令已成功完成。 |
6)在Linux客户端上挂载
[root@t2 mnt]# showmount -e 192.168.66.11 Export list for 192.168.66.11: /root/mnt 192.168.66.0/24 [root@t2 mnt]# mount -t nfs 192.168.66.11:/root/mnt /mnt/nfs_share/ |