Minio单机与集群部署并使用nginx进行负载均衡

集群版部署参考:gegewu_cloud

一、概述

MinIO 是一个开源的对象存储服务器,它兼容Amazon S3(Simple Storage Service)API。它被设计用于构建分布式存储架构,提供高可用性、高性能和可扩展的对象存储解决方案。

下面是MinIO的一些主要特点和功能:

  • 对象存储:MinIO以对象为基本存储单元,可以存储和管理任意大小的文件、数据对象。它提供了标准的对象存储操作,如上传、下载、删除和元数据管理。
  • 分布式架构:MinIO采用分布式架构,可以在多个节点上部署,并将数据分布和复制在不同的节点上。这提供了高可用性和数据冗余,确保数据的持久性和可靠性。
  • 高性能:MinIO通过并行处理和分布式架构实现高性能的数据存取。它利用现代硬件和网络技术,充分利用多核处理器和高带宽网络,以实现快速的数据传输和处理。
  • 水平扩展:MinIO可以水平扩展,通过添加更多的节点来增加存储容量和吞吐量。它支持自动数据分片和负载均衡,确保数据在各个节点上均匀分布和访问的负载均衡。
  • 数据保护:MinIO提供了多种数据保护机制,包括数据冗余、故障转移和数据校验。它可以在不同的节点之间复制数据,以应对节点故障和数据损坏的情况。
  • 安全性:MinIO支持数据加密和访问控制,保护存储在其中的数据的安全性和隐私性。它提供了传输层加密(TLS/SSL)和服务器端加密选项,以及身份验证和访问控制机制。

总的来说,MinIO是一个开源的高性能对象存储服务器,适用于构建分布式存储系统。它具有高可用性、可扩展性和数据保护机制,兼容Amazon S3 API,使其与现有的S3生态系统和工具集成无缝。MinIO在大数据、云计算和容器化环境中广泛应用,为应用程序提供了可靠、高效的对象存储服务。

这里主要侧重使用docker快速部署环境,想了解更多,可以参考我以下几篇文章:

官方文档:https://docs.min.io/
中文文档:http://docs.minio.org.cn/docs/

二、MinIO 与 Ceph 对比

MinIO和Ceph都是流行的开源存储解决方案,它们在对象存储领域有不同的特点和适用场景。下面是MinIO和Ceph的对比:

1)架构设计对比

  • **MinIO**:MinIO采用分布式架构,以水平扩展为基础。它通过多个独立的MinIO节点组成集群,每个节点都是独立的对象存储服务器。MinIO专注于提供简单、轻量级的对象存储服务,适用于小型到中等规模的部署。
  • **Ceph**:Ceph是一个分布式存储系统,由对象存储、块存储和文件系统组成。它使用RADOS(Reliable Autonomic Distributed Object Store)作为底层存储系统,提供高可用性和数据冗余。Ceph适用于大规模的企业级部署,具有复杂的架构和丰富的功能。

2)数据一致性对比

  • MinIOMinIO在默认配置下提供最终一致性,即写入操作返回成功后,数据可能会有一定的时间窗口内的延迟才能完全一致。这适用于许多应用场景,如数据备份、存档等。
  • CephCeph提供强一致性,即写入操作在返回成功后,数据即刻就达到一致性。这对于需要强一致性保证的应用场景非常重要,如数据库和事务处理。

3)部署和管理对比

  • MinIOMinIO 的部署和管理相对简单,可以通过单个二进制文件或容器进行快速安装和配置。它提供了直观的管理界面和易于使用的API,使得管理和监控变得简单。
  • CephCeph 的部署和管理相对复杂,涉及多个组件和配置。它需要更多的时间和专业知识来设置和维护,需要熟悉Ceph的架构和配置。

4)生态系统和兼容性对比

  • MinIO:MinIO与Amazon S3 API兼容,这意味着现有的S3工具和应用程序可以无缝地与MinIO集成。它还有一个活跃的社区,提供了各种客户端库和插件,扩展了其功能和兼容性。
  • CephCeph 具有广泛的生态系统和丰富的功能集。它可以与多个协议和接口(如RADOS、RBD、CephFS)进行集成,提供块存储、文件系统和对象存储的全面解决方案。

综上所述,MinIO适用于简单、轻量级的对象存储需求,注重高性能和易用性。它适合中小规模部署,并且与Amazon S3兼容,易于与现有的S3生态系统集成。

  • Ceph则适用于大规模、复杂的企业级存储需求。它提供强一致性和丰富的功能集,适合需要高可用性、数据冗余和复杂数据操作的场景。Ceph的部署和管理相对复杂,需要更多的配置和管理工作。
  • 选择MinIO还是Ceph取决于具体的需求和场景。如果你需要一个简单、易用、高性能的对象存储解决方案,并与S3兼容,那么MinIO是一个不错的选择。如果你需要一个功能强大、可扩展、支持块存储和文件系统的分布式存储系统,且具备强一致性的要求,那么Ceph是更适合的选择。

无论选择MinIO还是Ceph,都需要仔细评估其与特定应用和环境的兼容性、性能需求、管理复杂性和可扩展性,以确保选择的解决方案能够满足实际需求并提供可靠的存储服务

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/7/image_b2fb09978ee530f5ab2104827399da13.png

docker-compose部署(本教程使用最新镜像)

镜像可选

1
2
3
4
minio/minio
minio/minio:RELEASE.2021-06-17T00-10-46Z # 此镜像测试不可用
registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest
registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-RELEASE.2022-08-02T23-59-16Z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
minio:
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest
restart: always
privileged: true
hostname: "minio"
ports:
- 9000:9000 # api 端口
- 9001:9001 # 控制台端口
environment:
MINIO_ACCESS_KEY: admin #管理后台用户名
MINIO_SECRET_KEY: admin123 #管理后台密码,最小8个字符
volumes:
- ./minio/data:/data #映射当前目录下的data目录至容器内/data目录
- ./minio/config:/root/.minio/ #映射配置目录
command: server --console-address ':9001' /data #指定容器中的目录 /data

控制台创建密钥后 s3连接工具远程连接测试

  • api地址端口:9000(专门用于例如s3工具代码等连接)
  • 控制台端口:9001 (不要混淆 )
  • 创建ak/sk填入 登录即可

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/9/image_c10039e5dafefbca1a39bd41f3a4446f.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/9/image_4e2f319e335ef3c6984eb2e115d2955b.png

备注:单机版没有数据冗余 数据只存放于挂载的唯一卷./minio/data中 文章首页教程 里面均为至少两磁盘冗余

三. 集群部署并使用nginx进行负载均衡

1. 简介

分布式 Minio 可以让你将多块硬盘或者多台服务器组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障。MinioMinio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

#2. Minio分布式部署的优势

#2.1 数据保护

  • 分布式 Minio 采用纠删码来防范多个节点宕机和位衰减。
  • 分布式 Minio 至少需要 4 个节点(4台服务器),使用分布式 Minio 就 自动引入了纠删码功能。
  • 纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。
  • 纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 Minio 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。 Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio 纠删码的设计目标是为了性能和尽可能的使用硬件加速。
  • 位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

#2.2 高可用

  • 单机 Minio 服务存在单点故障,相反,如果是一个 N 节点的分布式 Minio ,只要有 N/2 节点在线,你的数据就是安全的。不过你需要至少有 N/2+1 个节点来创建新的对象。
  • 例如,一个 8 节点的 Minio 集群,每个节点一块盘,就算 4 个节点宕机,这个集群仍然是可读的,不过你需要 5 个节点才能写数据。

#2.3 限制

  • 分布式 Minio 单租户存在最少 4 个盘最多 16 个盘的限制(受限于纠删码)。这种限制确保了 Minio 的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。
  • 注意,只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用 2 个节点,每个节点 4 块盘,也可以使用 4 个节点,每个节点两块盘,诸如此类。

#2.4 一致性

  • Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型。

2.5 搭建

本次搭建使用两节点(故障一个节点便只能读不能写)

节点IP备注
minio110.0.0.10
minio210.0.0.11

写入host配置文件:

1
2
3
4
echo "
10.0.0.10 minio1
10.0.0.11 minio2
" >> /etc/hosts

docker-compose配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: "3.7"
services:
minio:
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:minio-latest
restart: always
hostname: minio1 # 每个节点修改成不同的名字
container_name: minio1 # 每个节点修改成不同的名字
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: 123456789
MINIO_PROMETHEUS_AUTH_TYPE: public
MINIO_PROMETHEUS_JOB_ID: minio-job
TZ: Asia/Shanghai
extra_hosts:
- "minio1:10.0.0.10"
- "minio2:10.0.0.11"
# - "minio03:192.168.1.103"
# - "minio04:192.168.1.104"
ports:
- 9000:9000
- 9001:9001
volumes:
- /data:/data
command: server --address ":9000" --console-address ":9001" http://minio{1...2}/data
network_mode: "host"

备注: 只需要将hostname与container_name编写为对应节点 在不同节点分别启动docker-compose.yml文件即可

二个节点依次启动✌ : docker-compose up -d

成功后日志显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
minio2  | MinIO Object Storage Server
minio2 | Copyright: 2015-2024 MinIO, Inc.
minio2 | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio2 | Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64)
minio2 |
minio2 | API: http://10.0.0.11:9001 http://172.17.0.1:9001 http://172.19.0.1:9001 http://172.20.0.1:9001 http://127.0.0.1:9001
minio2 | WebUI: http://10.0.0.11:50001 http://172.17.0.1:50001 http://172.19.0.1:50001 http://172.20.0.1:50001 http://127.0.0.1:50001
minio2 |
minio2 | Docs: https://min.io/docs/minio/linux/index.html
minio2 | Status: 2 Online, 0 Offline.
minio2 | http://minio1:9001/minio/storage/data/v57%!(EXTRA time.Duration=14.132179253s)
minio2 | Exiting on signal: TERMINATED
minio2 |
minio2 | You are running an older version of MinIO released 4 months before the latest release
minio2 | Update: Run `mc admin update ALIAS`
minio2 |
minio2 |
minio2 | Waiting for all MinIO sub-systems to be initialize...
minio2 | Automatically configured API requests per node based on available memory on the system: 98
minio2 | All MinIO sub-systems initialized successfully in 5.916121ms
minio2 | MinIO Object Storage Server
minio2 | Copyright: 2015-2024 MinIO, Inc.
minio2 | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio2 | Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64)
minio2 |
minio2 | API: http://10.0.0.11:9001 http://172.17.0.1:9001 http://172.19.0.1:9001 http://172.20.0.1:9001 http://127.0.0.1:9001
minio2 | WebUI: http://10.0.0.11:50001 http://172.17.0.1:50001 http://172.19.0.1:50001 http://172.20.0.1:50001 http://127.0.0.1:50001
minio2 |
minio2 | Docs: https://min.io/docs/minio/linux/index.html
minio2 | Status: 2 Online, 0 Offline.

效果:

1.使用命令行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@k8s1:/opt/minio# docker exec -it minio2 bash
bash-5.1# mc config host add minio http://localhost:9000
Enter Access Key: admin
Enter Secret Key:
Added `minio` successfully.
bash-5.1# mc admin info minio
● minio1:9000
Uptime: 42 minutes
Version: 2024-04-18T19:09:19Z
Network: 2/2 OK
Drives: 1/1 OK
Pool: 1

● minio2:9000
Uptime: 44 minutes
Version: 2024-04-18T19:09:19Z
Network: 2/2 OK
Drives: 1/1 OK
Pool: 1

Pools:
1st, Erasure sets: 1, Drives per erasure set: 2

165 MiB Used, 1 Bucket, 6 Objects
2 drives online, 0 drives offline

2.访问地址:

http://10.0.0.10:9001

http://10.0.0.11:9001

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/9/image_80d4c317adbea538710314fdc23fc7ec.png

2.6 使用nginx进行负载均衡

拓补图:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/9/image_79c6f4e1380df8c0bc41081b9f00d653.png

在节点1部署nginx参考 使用脚本编译部署nginx部署

部署完成后遇到nginx转发访问端口访问存储桶一直loading…问题 参考:【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket 大致信息如下

问题原因

按F12查看了一下,查看桶发起的是 websocket 请求。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/9/image_43ea567b825c0da4a7070cfbafc90dce.png

解决方案:

nginx配置 上加上websocket支持

1
2
3
4
5
6
7
# 添加了websocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Nginx负载minio集群完整配置文件如下(在配置文件最后大括号内}加入负载均衡配置即可):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include 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 logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

upstream minio_cluster {
server 10.0.0.10:9001;
server 10.0.0.11:9001;
}

upstream minio_api {
server 10.0.0.10:9000;
server 10.0.0.11:9000;
}

server {
listen 8088;
server_name 10.0.0.10 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 100m;

# To disable buffering
proxy_buffering off;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_connect_timeout 300;

proxy_set_header Connection "";
chunked_transfer_encoding off;

# 添加了websocket支持
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://minio_cluster;
}
}

server {
listen 8089;
server_name 10.0.0.10 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 100m;

# To disable buffering
proxy_buffering off;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_connect_timeout 300;

proxy_set_header Connection "";
chunked_transfer_encoding off;

# 添加了websocket支持
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://minio_api;
}
}

}

systemctl restart nginx 生效🌹

此时在浏览器访问部署nginx的服务器:http://10.0.0.10:8088 输入yaml文件中定义的账户密码 即可实现负载均衡到不同的服务器

最后: 验证负载均衡是否成功(成功)

步骤:

本文参考:

【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程 - 大数据老司机 - 博客园 (cnblogs.com)

基于 docker-compose 部署 Minio 分布式集群-腾讯云开发者社区-腾讯云 (tencent.com)

【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程 - 大数据老司机 - 博客园 (cnblogs.com)

使用nginx对集群模式的minio做负载均衡_minio负载均衡

【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket