对象存储
minio作为现在热度较高的对象存储引擎,具有高扩展、高吞吐和高可用的特性。对象存储将各类型文件都视为对象,赋予统一的属性。
Minio官网
- 下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio #x86版本
wget https://dl.min.io/server/minio/release/linux-arm64/minio #arm版本
- 官方nginx集群配置
upstream minio_s3 {
least_conn;
server minio-01.internal-domain.com:9000;
server minio-02.internal-domain.com:9000;
server minio-03.internal-domain.com:9000;
server minio-04.internal-domain.com:9000;
}
upstream minio_console {
least_conn;
server minio-01.internal-domain.com:9001;
server minio-02.internal-domain.com:9001;
server minio-03.internal-domain.com:9001;
server minio-04.internal-domain.com:9001;
}
server {
listen 80;
listen [::]:80;
server_name minio.example.net;
# 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;
# Disable buffering
proxy_buffering off;
proxy_request_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 https://minio_s3; # This uses the upstream directive definition to load balance
}
location /minio/ui/ {
rewrite ^/minio/ui/(.*) /$1 break;
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_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websockets in MinIO versions released after January 2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Some environments may encounter CORS errors (Kubernetes + Nginx Ingress)
# Uncomment the following line to set the Origin request to an empty string
# proxy_set_header Origin '';
chunked_transfer_encoding off;
proxy_pass https://minio_console; # This uses the upstream directive definition to load balance
}
}
- Set the MINIO_BROWSER_REDIRECT_URL to the proxy host FQDN of the MinIO Console (https://example.net/minio/ui)
一、使用背景
基于minio做网络云盘的开发,考虑到可扩展,高吞吐和容灾恢复的需求。
二、本地部署测试
1) 测试平台
VMware起4台centos 7.9的虚拟机
192.168.123.100
192.168.123.105
192.168.123.106
192.168.123.107
2) 注意事项
(1)最新版minio集群化部署时,只支持非系统硬盘部署,即需要挂载独立的硬盘
挂载硬盘fdisk -l fdisk /dev/sdb mkfs.xfs /dev/sdb1 #使用minio推荐的XFS文件系统 mkdir /data mount /dev/sdb1 /data df -h vim /etc/fstab # 添加 /dev/sdb1 /data xfs defaults 0 0 用于开机自动挂载
(2)最少需要4台服务器或者硬盘来搭建集群
已4台为例,minio的集群存储策略为将文件平均切割为2份,并对2份进行纠错码加密生成2份对应文件,分别存储至4台服务器上,即2台原文件和2台校验文件。
MinIO 集群的冗余机制:纠删码(Erasure Coding)
MinIO 默认使用 纠删码技术 实现数据冗余和高可用性。纠删码通过将数据分割成多个块,并生成冗余块,使得在部分节点故障时仍能恢复数据。对于一个由 N 台服务器组成的集群,MinIO 的纠删码规则通常为:
-
最小集群规模:至少 4 台服务器(单节点模式除外)。
-
数据分布:将数据分成 K 个数据块 和 M 个冗余块,总节点数为 N = K + M。
-
当故障节点数 ≤ M 时,数据可通过剩余节点恢复,业务不受影响。
-
当故障节点数 > M 时,数据无法恢复,集群可能失效。
-
四节点集群的常见配置:K=4, M=0 或 K=3, M=1?
MinIO 的纠删码配置需显式指定 K 和 M,但实际部署中:
1. 默认配置(K=4, M=0):无冗余(危险!)
-
若集群以 纯分布式模式(无冗余) 部署(未启用纠删码冗余),即
K=4, M=0:-
每台服务器存储完整数据的 1/4(类似 RAID 0)。
-
任意一台服务器宕机,数据将丢失 1/4,集群无法正常工作,所有数据不可用。
-
-
适用场景:仅用于测试或非关键数据,生产环境严禁使用。
2. 标准纠删码配置(K=3, M=1):允许 1 节点故障
-
若集群配置为
K=3, M=1(即 3 个数据块 + 1 个冗余块,总节点数 4):-
允许最多 1 台服务器宕机(因为冗余块数
M=1)。 -
当 1 台服务器宕机时:
-
剩余 3 台服务器(3 个数据块 + 0 个冗余块?需注意:MinIO 的纠删码逻辑是利用 K+M 节点中的任意 K 个节点恢复数据)。
-
实际上,MinIO 会通过剩余的 3 个数据块和 1 个冗余块中的 任意 3 个有效块 恢复数据(数学上,K=3 时,至少需要 3 个有效块)。
-
结论:当 1 台服务器宕机时,剩余 3 台服务器包含完整的 K=3 个数据块,集群可正常读写数据,但性能可能略有下降(需通过冗余计算恢复数据)。
-
-
-
适用场景:生产环境推荐配置,满足基本高可用性。
关键结论:一台服务器宕机后的集群状态
| 集群配置 | 单节点宕机后状态 |
|---|---|
| 无冗余(K=4, M=0) | 不可用,数据丢失 25%,无法恢复。 |
| 有冗余(K=3, M=1) | 可用,可通过剩余 3 节点恢复数据,性能部分下降。 |
如何确认集群的纠删码配置?
- 查看集群节点数和配置:
minio server --config-dir /path/to/config /data1 /data2 /data3 /data4 # 启动时指定节点
- 若启动时未显式配置
K和M,默认按K=N/2, M=N/2计算(但 N=4 时可能为 K=3, M=1,需以实际日志为准)。
- 通过 MinIO 控制台查看:登录 MinIO 网页端(默认端口 9001),进入 状态 > 服务器,查看节点状态和冗余配置。
宕机后的处理建议
- 紧急恢复(适用于 K=3, M=1 配置):
- 尽快修复或替换故障服务器,MinIO 会自动同步数据,恢复集群完整冗余。
- 避免二次故障:
- 在单节点宕机期间,严禁其他节点故障(否则若故障节点数 > M,数据将永久丢失)。
- 监控告警:
- 配置 Prometheus + Grafana 或 MinIO 自带的告警功能,实时监控节点状态。
总结
-
若集群启用了纠删码冗余(如 K=3, M=1):单台服务器宕机后,MinIO 仍可正常使用,但需尽快恢复故障节点以避免风险。
-
若集群未启用冗余(K=4, M=0):单台服务器宕机将导致数据丢失,集群不可用,生产环境需绝对避免此配置。
建议:生产环境中,MinIO 集群至少配置为 K=N-1, M=1(如 4 节点集群用 K=3, M=1),以确保单节点故障时的可用性和数据完整性。
(3)实际集群部署
注意官方给出的nginx负载均衡配置中,需要配置 MINIO_BROWSER_REDIRECT_URL来修改minio_console的页面前缀,这样nginx便可以使用同一个端口来代理minio_s3和minio_console,也可以使用我如下的配置:
upstream minio_s3 { least_conn; server minio1.com:9001; server minio2.com:9001; server minio3.com:9001; server minio4.com:9001; } upstream minio_console { least_conn; server minio1.com:9727; server minio2.com:9727; server minio3.com:9727; server minio4.com:9727; } server { listen 9000; listen [::]:9000; server_name 192.168.123.100; # 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; # Disable buffering proxy_buffering off; proxy_request_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_s3; # This uses the upstream directive definition to load balance } } server { listen 10727; listen [::]:10727; server_name 192.168.123.100; # 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; # Disable buffering proxy_buffering off; proxy_request_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_set_header X-NginX-Proxy true; # This is necessary to pass the correct IP to be hashed real_ip_header X-Real-IP; proxy_connect_timeout 300; # To support websockets in MinIO versions released after January 2023 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Some environments may encounter CORS errors (Kubernetes + Nginx Ingress) # Uncomment the following line to set the Origin request to an empty string # proxy_set_header Origin ''; chunked_transfer_encoding off; proxy_pass http://minio_console; # This uses the upstream directive definition to load balance } }以上端口号均可以自己改,喜欢啥改啥。
启动命令如下:nohup sudo MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password123 ./minio server --address :9001 --console-address :9727 http://minio{1...4}.com/data/minio 2>&1 &
三、JAVA开发
1.引入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.4</version>
</dependency>
特别注意可能出现的版本冲突,我就遇到了okhttp版本依赖冲突问题,需要指定版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version>
</dependency>
</dependencies>
</dependencyManagement>
2.创建密钥

3.添加配置
minio:
endpoint: http://192.168.123.100:9000
access-key: nlVeBLds9xxxxxxxx
secret-key: x8Vn8SkbnDLWWImquVbtxxxxxxxxxxxxxx
bucketName: cloud-drive
4.复用性
如果使用Amazon S3的云存储,代码无需做任何修改,minio可于S3的接口无缝衔接,都是同一套接口标准,无感切换!


4767

被折叠的 条评论
为什么被折叠?



