【Minio】搭建minio集群

对象存储

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 的纠删码配置需显式指定 KM,但实际部署中:

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 节点恢复数据,性能部分下降。

如何确认集群的纠删码配置?

  1. 查看集群节点数和配置
minio server --config-dir /path/to/config /data1 /data2 /data3 /data4  # 启动时指定节点
  • 若启动时未显式配置 KM,默认按 K=N/2, M=N/2 计算(但 N=4 时可能为 K=3, M=1,需以实际日志为准)。
  1. 通过 MinIO 控制台查看:登录 MinIO 网页端(默认端口 9001),进入 状态 > 服务器,查看节点状态和冗余配置。

宕机后的处理建议

  1. 紧急恢复(适用于 K=3, M=1 配置)
  • 尽快修复或替换故障服务器,MinIO 会自动同步数据,恢复集群完整冗余。
  1. 避免二次故障
  • 在单节点宕机期间,严禁其他节点故障(否则若故障节点数 > M,数据将永久丢失)。
  1. 监控告警
  • 配置 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的接口无缝衔接,都是同一套接口标准,无感切换!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值