天天看点

5.分布式存储(MinIO集群+JuiceFS)

目 录​

​​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 文件系统由三个部分组成:​

  1. JuiceFS 客户端:协调对象存储和元数据存储引擎,以及 POSIX、Hadoop、Kubernetes CSI Driver、S3 Gateway 等文件系统接口的实现;​
  2. 数据存储:存储数据本身,支持本地磁盘、公有云或私有云对象存储、HDFS 等介质;​
  3. 元数据引擎:存储数据对应的元数据(metadata)包含文件名、文件大小、权限组、创建修改时间和目录结构,支持 Redis、MySQL、TiKV 等多种引擎;​

PS:本文将后面两个部分统称为"后端系统"。​

5.分布式存储(MinIO集群+JuiceFS)

JuiceFS的S3网关架构​

JuiceFS 会将文件分块存储到底层的对象存储中,不能直接使用底层对象存储的接口和界面来直接访问文件,而S3 网关提供了类似底层对象存储的访问能力,架构图如下:​

5.分布式存储(MinIO集群+JuiceFS)

系统架构​

本期将直接利用第1期在虚拟机CS01上完成的“单节点MinIO集群”环境,或者基于它克隆出虚拟机MR01(方法请参考第2期3.1章节),然后再增加redis容器运行实例,即可完成整个后端系统的部署。JuiceFS客户端根据实际需要,在宿主机、虚拟机(CS01、CS02...)、甚至在其中的容器实例中都是可安装和部署的,条件是只要网络可到达后端系统即可,本实验中的“JuiceFS客户端1/2”分别安装在宿主机windows平台 CS01虚拟机Linux平台上的。整个系统的网络拓扑如下图所示:​

5.分布式存储(MinIO集群+JuiceFS)

软件安装​

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​

5.分布式存储(MinIO集群+JuiceFS)

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"]​

// 结果如下:​

5.分布式存储(MinIO集群+JuiceFS)
// 保存后退出。​

4)启动整个后台系统(包括了Minio集群和redis)​

// 拉取镜像​

[root@mr01 ~]# docker-compose pull​

// 创建运行​

[root@mr01 ~]# docker-compose up​

5.分布式存储(MinIO集群+JuiceFS)
// 以上输出结果,表示Minio集群和redis都已创建完成和启动成功。​

5)验证Redis的安装结果​

// 另开启一个终端,进入redis容器控制台​

[root@mr01 ~]# docker exec -it redis redis-cli​

5.分布式存储(MinIO集群+JuiceFS)
按以上的测试结果,表示redis安装成功!然后退出​
5.分布式存储(MinIO集群+JuiceFS)

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​

5.分布式存储(MinIO集群+JuiceFS)

3)安装​

[root@mr01 juicefs]# install juicefs /usr/local/bin/​

4)验证​

// 回到home目录​

[root@mr01 juicefs]# cd ​

// 执行命令​

[root@mr01 ~]# juicefs​

5.分布式存储(MinIO集群+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'变量中。​
5.分布式存储(MinIO集群+JuiceFS)
5.分布式存储(MinIO集群+JuiceFS)

4)验证​

// 打开命令行终端后,执行命令'juicefs'​
5.分布式存储(MinIO集群+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系统下)​

5.分布式存储(MinIO集群+JuiceFS)
// 结果2 (在windows系统下)​
5.分布式存储(MinIO集群+JuiceFS)

使用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系统下)​

5.分布式存储(MinIO集群+JuiceFS)
// 结果2(在Windows系统下)​
5.分布式存储(MinIO集群+JuiceFS)

4)访问S3网关​

在JuiceFS客户端(也是S3网关)上,通过浏览器打开"http://localhost:9080",输入用户名/密码(admin/12345678),如下图所示:​

5.分布式存储(MinIO集群+JuiceFS)

5)上传文件​

登录进入后,并上传一个文件(如:'hujy-music.mp3',大小为3.2MB),如下图所示:​

5.分布式存储(MinIO集群+JuiceFS)

6)查看对象存储:登录到MinIO管理控制台(​​http://192.168.66.11:9001/​​),查看"buck1/myjfs/"中的对象存储情况,如下图所示:​

5.分布式存储(MinIO集群+JuiceFS)

简析:前面上传的文件是3.2MiB,因为小于4MiB,所以没有分片,只有1个文件。​

7)重新上传一个大文件(如:'hujy-2music.mp3',大小为6.48MB),结果如下:​

  • 使用S3网关查看:​
  • 5.分布式存储(MinIO集群+JuiceFS)
  • 使用MinIO对象存储查看:​
5.分布式存储(MinIO集群+JuiceFS)

简析:第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​
5.分布式存储(MinIO集群+JuiceFS)
// 查看结果:看到前面通过S3网关上传的两个mp3文件,是不是很好玩?!​
5.分布式存储(MinIO集群+JuiceFS)

2)再试试用SFTP工具上传文件"hujy-3music.mp3"至以上的挂载目录​

5.分布式存储(MinIO集群+JuiceFS)
// 查看结果:挂载的目录下多了一个"hujy-3music.mps"的文件​
5.分布式存储(MinIO集群+JuiceFS)

3)再试试用S3网关查看结果。​

5.分布式存储(MinIO集群+JuiceFS)

4)在MinIO对象存储上查看的结果,发现JuiceFS对"hujy-3music.mp3"用了一个不同的'Slice'处理,并将其切分成了3个'Block'存放到了对象存储系统中。​

5.分布式存储(MinIO集群+JuiceFS)

5)卸载文件系统​

[root@mr01 ~]# juicefs umount $HOME/mnt​
5.分布式存储(MinIO集群+JuiceFS)

共享文件系统​

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)​

5.分布式存储(MinIO集群+JuiceFS)

3)重启​

[root@mr01 mnt]# systemctl restart nfs​

[root@mr01 mnt]# systemctl status nfs​

5.分布式存储(MinIO集群+JuiceFS)

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​

命令已成功完成。​

5.分布式存储(MinIO集群+JuiceFS)

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/​

5.分布式存储(MinIO集群+JuiceFS)