单机版的 Minio 虽然有纠删码的部署方式,可以防止磁盘损坏导致文件丢失,但是单机毕竟性能有限。集群版 Minio 必须使用纠删码的部署方式,至少使用 4 块硬盘进行部署。最简单的部署方式是使用 2 个 docker 容器,每个容器使用 2 个磁盘或目录。本篇博客使用 docker-compose 在单台虚拟机上模拟部署伪集群,使用 4 个 docker 容器,每个容器中使用一个目录作为磁盘。
如果在不同的机器上部署真正的 Minio 集群,需要注意以下几点:
- 集群中每个 Minio 节点必须具有相同的账号和密码,通过 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 进行初始化
- 集群中每个 Minio 节点之间的时间,相差不能超过 3 秒,可以使用 NTP 服务器保持时间一致。
- 集群中每个 Minio 节点中挂载的磁盘最好是没有任何数据的磁盘。
集群版 Minio 部署
首先创建好目录 /app/minio-cluster,在里面创建目录和文件,具体结构如下:
编写 docker-compose.yml 文件内容如下:
version: "3.5"
services:
minio1:
image: minio/minio
container_name: minio1
privileged: true
restart: always
environment:
# web管理后台用户名
MINIO_ROOT_USER: jobs
# web管理后台密码
MINIO_ROOT_PASSWORD: jobs@123
networks:
- minio_net
volumes:
# 文件存储目录映射
- /app/minio-cluster/data1:/data
# 运行 minio 服务启动命令,/data 参数是 docker 容器内部的数据目录
# 由于 web 管理后台是动态端口,因此必须指定为固定的端口
command: server --console-address ":9001" http://minio{1...4}:9000/data
minio2:
image: minio/minio
container_name: minio2
privileged: true
restart: always
environment:
MINIO_ROOT_USER: jobs
MINIO_ROOT_PASSWORD: jobs@123
networks:
- minio_net
volumes:
- /app/minio-cluster/data2:/data
command: server --console-address ":9001" http://minio{1...4}:9000/data
minio3:
image: minio/minio
container_name: minio3
privileged: true
restart: always
environment:
MINIO_ROOT_USER: jobs
MINIO_ROOT_PASSWORD: jobs@123
networks:
- minio_net
volumes:
- /app/minio-cluster/data3:/data
command: server --console-address ":9001" http://minio{1...4}:9000/data
minio4:
image: minio/minio
container_name: minio4
privileged: true
restart: always
environment:
MINIO_ROOT_USER: jobs
MINIO_ROOT_PASSWORD: jobs@123
networks:
- minio_net
volumes:
- /app/minio-cluster/data4:/data
command: server --console-address ":9001" http://minio{1...4}:9000/data
nginx:
image: nginx
container_name: nginx
privileged: true
restart: always
volumes:
- /app/minio-cluster/nginx.conf:/etc/nginx/nginx.conf
ports:
# 转发 api 端口
- 9000:9000
# 转发 web 管理界面端口
- 9001:9001
networks:
- minio_net
depends_on:
- minio1
- minio2
- minio3
- minio4
# 网络配置
networks:
minio_net:
driver: bridge
我们启动 4 个 docker 容器,每个 Minio 容器都是使用 9000 作为 api 端口,9001 作为 Web 管理界面端口。
由于我们需要使用 nginx 对 api 端口和 Web 管理界面端口进行负载均衡对外提供,因此 4 个容器就不再对外暴露端口。
有关 nginx 的配置文件,内容如下:
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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-api {
server minio1:9000;
server minio2:9000;
server minio3:9000;
server minio4:9000;
}
upstream minio-web {
server minio1:9001;
server minio2:9001;
server minio3:9001;
server minio4:9001;
}
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
# 转发客户浏览器的 ip 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://minio-api;
}
}
server {
listen 9001;
listen [::]:9001;
server_name localhost;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
# 转发客户浏览器的 ip 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://minio-web;
}
}
}
最后在 docker-compose.yml 文件所在目录下,运行 docker-compose up -d
启动服务即可。
然后我们访问 http://192.168.136.128:9001
输入账号 jobs 密码 jobs@123 进入首页展示如下:
发现有 4 个服务节点,如下所示:
这说明 Minio 集群已经部署成功。剩下的操作就是创建 Bucket 以及上传文件,程序代码与上篇博客的代码一致。
只不过代码中配置的 api 接口地址 http://192.168.136.128:9000
是 nginx 提供的负载均衡地址。
有关 Minio 的 Web 管理界面操作和程序代码细节,请参考上一篇博客单机版 Minio 的部署和使用,这里不再赘述。
这里把上篇博客的源代码下载地址提供出来:https://files.cnblogs.com/files/blogs/699532/springboot_minio.zip