20张图手把手教你搭建并优化后浪云模式下的多节点Minio分布式文件系统
大家好,我是冰河~~
Minio是一个开源的高性能对象存储服务器,适用于构建分布式存储系统。它具有高可用性、可扩展性和数据保护机制,兼容Amazon S3 API,在大数据、云计算和容器化环境中广泛应用,为应用程序提供了可靠、高效的对象存储服务。
一、前言
分布式IM即时通讯系统提供了单聊和群聊的功能,在消息的发送和接收上需要支持文本、表情、图片、文件、语音和视频等等。那在消息的发送过程中,如何存储图片、文件、语音等资源呢?一种非常有效的存储方式,就是将其存储到一款高性能的分布式文件系统中。
对比其他的分布式文件系统后,我们最终选择了Minio来存储消息的图片、文件和语音等资源。主要是考虑到Minio文件系统具备高性能、高可扩展性、安装和操作简单、具备纠删码等特性。具体的特性大家可自行上网了解,这里不再赘述。
二、环境说明
- 服务器版本:CentOS7
- 主机名:binghe102
- IP地址:192.168.106.102
- docker-compose:v2.17.3
- Minio镜像:minio/minio
- Nginx镜像:nginx:1.19.2-alpine
三、安装docker-compose
安装docker-compose环境相对就比较简单,在命令行执行如下命令下载并安装docker-compose。
curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
下载并安装成功后,使用如下命令创建docker-compose软链接。
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
随后查看docker-compose版本,如下所示。
[root@binghe102]# docker-compose version
Docker Compose version v2.17.3
可以看到,安装的docker-compose版本为2.17.3,说明docker-compose安装成功。
四、编写配置文件
这里,安装并启动四个Minio容器,由Nginx统一对外提供访问图片或者文件等资源的地址。所以,除了要编写基于docker-compose安装Minio容器的配置,还需要编写基于docker-compose安装Nginx的配置,另外,也需要对nginx.conf文件进行配置。
1、编写容器配置
无论是Minio文件系统,还是Nginx,都是基于docker-compose安装的。所以,在编写容器配置时,我们将Minio容器和Nginx容器的安装写到同一个配置文件中,并将其命名为:docker-compose-minio.yml。
源码详见:environment/docker-compose-minio.yml。
version: '3.2'
# 所有容器通用的设置和配置
x-minio-common: &minio-common
image: minio/minio
command: server --console-address ":9001" http://minio{1...4}/data
expose:
- "9000"
environment:
MINIO_ROOT_USER: binghe
MINIO_ROOT_PASSWORD: binghe123
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
# 启动4个docker容器运行minio服务器实例
# 使用nginx反向代理9000端口,负载均衡
# 可以通过9001、9002、9003、9004端口访问它们的web console
services:
minio1:
<<: *minio-common
hostname: minio1
ports:
- "9001:9001"
volumes:
- ./data/data1:/data
minio2:
<<: *minio-common
hostname: minio2
ports:
- "9002:9001"
volumes:
- ./data/data2:/data
minio3:
<<: *minio-common
hostname: minio3
ports:
- "9003:9001"
volumes:
- ./data/data3:/data
minio4:
<<: *minio-common
hostname: minio4
ports:
- "9004:9001"
volumes:
- ./data/data4:/data
nginx:
image: nginx:1.19.2-alpine
hostname: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "9000:9000"
depends_on:
- minio1
- minio2
- minio3
- minio4
在上述配置中,会安装并启动四个Minio服务容器,并且Minio容器映射到宿主机的端口分别为:9001~9004。并且,需要注意的是,在上述配置中,将Minio后台管理端的账号配置成了binghe,密码配置成了binghe123。
2、编写nginx.conf配置
启动四个Minio容器后,对外统一由Nginx进行负载均衡访问,并且在编写容器配置文件时,也指定了容器中的nginx.conf文件与宿主机中nginx.conf文件的对应关系,所以,我们也需要在宿主机上配置nginx.conf文件。
源码详见:environment/nginx.conf。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# include /etc/nginx/conf.d/*.conf;
upstream minio {
server minio1:9000;
server minio2:9000;
server minio3:9000;
server minio4:9000;
}
server {
listen 9000;
listen [::]:9000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
}
五、启动容器
1、创建并启动容器
将environment目录上传到服务器,并将服务器命令行切换到environment目录下,并输入如下命令来创建并启动Minio容器和Nginx容器。
docker-compose -f docker-compose-minio.yml up -d
创建并启动容器的过程如下所示。
[root@binghe102 environment]# docker-compose -f docker-compose-minio.yml up -d
[+] Running 17/17
minio2 Pulled 219.5s
minio3 Pulled 219.5s
minio1 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 219.5s
d46336f50433 Pull complete 45.3s
be961ec68663 Pull complete 45.7s
44173c602141 Pull complete 46.1s
a9809a6a679b Pull complete 46.2s
df29d4a76971 Pull complete 46.3s
2b5a8853d302 Pull complete 46.3s
84f01ee8dfc1 Pull complete 210.3s
minio4 Pulled 219.5s
nginx 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 54.9s
df20fa9351a1 Pull complete 5.3s
3db268b1fe8f Pull complete 31.6s
f682f0660e7a Pull complete 31.7s
7eb0e8838bc0 Pull complete 31.7s
e8bf1226cc17 Pull complete 32.1s
[+] Running 6/6
Network environment_default Created 14.3s
Container environment-minio1-1 Started 140.1s
Container environment-minio3-1 Started 140.2s
Container environment-minio2-1 Started 140.1s
Container environment-minio4-1 Started 140.0s
Container environment-nginx-1 Started
2、查看启动状态
启动完成后,在服务器命令行输入 docker ps
命令来查看启动的容器,如图4-1所示。
当看到minio容器STATUS列中标有healthy状态时,说明Minio容器创建并启动成功。
六、配置Minio
1、Minio
打开浏览器,在地址栏中输入http://192.168.106.102:9001,如图4-2所示。
输入账号binghe,密码binghe123登录Minio,如图4-3所示。
登录后的页面如图4-4所示。
可以看到,总共有4个Minio服务实例。
滑动页面右侧的滚动条,在SERVERS选项下,我们可以看到四个具体的服务实例信息,如图4-5所示。
切换到DRIVES选项下,可以看到四个服务实例的DRIVE信息,如图4-6所示。
2、创建分桶
在Minio文件系统中创建一个名称为bh-im的分桶,用来存储分布式IM即时通讯系统消息发送过程中的图片、文件和语音等资源,如图4-7所示。
接下来,在Bucket Name一栏中填写bh-im,如图4-8所示。
点击Create Bucket按钮即可创建分桶。随后,点击Buckets菜单来查看分桶信息,如图4-9所示。
可以看到,名称为bh-im的分桶已经创建成功,点击Manage后,如图4-10所示。
将bh-im分桶中Summary的Access Policy,也就是访问策略,由Private修改成Public,如图4-11所示。
修改完成后,如图4-12所示。
3、优化性能
创建完分桶后,我们来优化下Minio文件系统多节点之间的同步性能,选择Settings菜单-Scanner子菜单,配置Delay multiplier、Max Wait和Cycle的值,如图4-13所示。
可以看到,这里我们将Delay multiplier配置成10,Max Wait和Cycle都配置成了1s,以此来加快Minio多个节点之间的同步效率。
七、测试Minio
选择Buckets-Browse,如图4-14所示。
进入Browse页面后如图4-15所示。
这里,我们点击向上的箭头按钮来上传一张图片,上传完成后如图4-16所示。
接下来,点击图片进入详情,如图4-17所示。
进入图片详情页面后,点击分享按钮,如图4-18所示。
点击分享按钮后,如图4-19所示。
可以看到,在分享页面中,给出了图片的访问链接,这里,我们点击Copy按钮复制图片链接,复制出的图片链接如下所示。
http://172.18.0.4:9000/bh-im/2.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=9X4104YB84KCT5XGQKSW%2F20231224%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231224T073947Z&X-Amz-Expires=604800&X-Amz-Security-Token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiI5WDQxMDRZQjg0S0NUNVhHUUtTVyIsImV4cCI6MTcwMzQwNDY3MCwicGFyZW50IjoiYmluZ2hlIn0.h611ez9SqsGcw-pEeXLp59_IpotFGmx1LeNzgGQdjJdAiYXm4f0EQ-ADgkxlr3UPIbR6-hQxYR__As_oo02BHg&X-Amz-SignedHeaders=host&versinotallow=null&X-Amz-Signature=4d2128b0da332fbbba8dfedea4ede07051c9376365e76bf12e4e658b8020747f
由于我们已经配置了可以基于Nginx统一访问Minio分布式文件系统中的资源,所以,这里,我们将IP地址172.18.0.4
修改成192.168.106.102
,在浏览器地址栏中打开如下链接。
http://192.168.106.102:9000/bh-im/2.jpg
在浏览器地址栏打开修改IP地址后的链接地址,如图4-20所示。
可以看到,浏览器中正常展示了我们上传的图片。
至此,云原生模式下的多节点Minio分布式文件系统环境搭建完毕。
八、写在最后
这些真实场景的项目设计与落地实现,在冰河的知识星球除了分布式IM即时通讯系统外,还有其他5个项目,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。