1. 概述
- 搭建一套Minio集群并提供服务。集群采用6台服务器,每台8块7.2K 2T机械硬盘,EC:4,容量64T。
- 网络受限于千兆网络,每台服务器做了3网卡链路聚合(3G,src-dst-ip),接近机械硬盘写入极限速度。
- 集群代理使用Openresty和Keepalived,配置了双活代理和基于IP或sessionid的hash负载均衡。
- 研发使用可直接看最后一部分 6. S3 API
2. 参考
3. 服务器
- 6台服务器组成Minio集群
- 172.29.2.1 Ubuntu24.04, 8块2T数据盘(7.2K)
- 172.29.2.2 Ubuntu24.04, 8块2T数据盘(7.2K)
- 172.29.2.3 Ubuntu24.04, 8块2T数据盘(7.2K)
- 172.29.2.4 Ubuntu24.04, 8块2T数据盘(7.2K)
- 172.29.2.5 Ubuntu24.04, 8块2T数据盘(7.2K)
- 172.29.2.6 Ubuntu24.04, 8块2T数据盘(7.2K)
- 2台服务器Openresty+Keepalived代理Minio集群
- 172.29.111.2 Centos7.9 Openresty+Keepalived,虚拟IP 172.29.100.101
- 172.29.112.1 Centos7.9 Openresty+Keepalived,虚拟IP 172.29.100.102
- DNS轮询方式解析两个虚拟IP
cluster01.minio.xunku.in. IN A 172.29.100.101
cluster01.minio.xunku.in. IN A 172.29.100.102
4. 网络
- Minio集群6台服务器每台3G带宽
- 3块网卡做端口聚合
- 链路聚合采用src-dst-ip方式(使用的交换机不支持src-dst-port方式)
- 代理服务器每台1G带宽
- 两台DNS轮询,总带宽2G
- 可通过增加代理服务器数量扩容带宽
5. 集群使用
5.1 管理端登录
- 管理端(以下IP均可访问)
- http://172.29.100.101:9001/login
- http://172.29.100.102:9001/login
- http://172.29.111.2:9001/login
- http://172.29.112.1:9001/login
5.2 创建Bucket
- 创建Bucket(每个项目专用,严禁生产与非生产混用)
- 生产使用-prod后缀
- 测试使用-test后缀
- 开发使用dev后缀
5.3 创建Access Key
- 创建Access Key(每个项目专用,严禁生产与非生产混用)
- Access Key和Secret Key务必妥善保存(只在创建时出现一次)
- Statement 只保留S3部分,对应的Resource限定同一项目下的Bucket
- Name、Description、Comments应能准确表述用途
5.4 安装客户端命令行工具(Linux)
- 下载到指定路径下
curl https://dl.minio.org.cn/client/mc/release/linux-amd64/mc --create-dirs -o /public/software/minio/minio-binaries/mc
- 添加可执行权限
chmod +x /public/software/minio/minio-binaries/mc
- 添加到默认搜索路径中
ln -s /public/software/minio/minio-binaries/mc /usr/bin/
5.5 命令行工具测试
- 创建minio别名
别名能简化命令行工具所在主机连接Minio集群,不用每次都输入key
# 在客户端工具所在服务器上创建“别名”,方便后续直接使用
mc alias set tobacco http://cluster01.minio.xunku.in:9000
# 输入Access key和Secret Key
Enter Access Key: tobacco-key
Enter Secret Key:
Added `tobacco` successfully.
- 查看已创建的别名
# 查看
mc alias list | grep -A15 tobacco
tobacco
URL : http://cluster01.minio.xunku.in:9000
AccessKey : tobacco-key
SecretKey : VdWNxe4TpDX78NupHetjJLP5zvQpW0XJybmZdvLS
API : s3v4
Path : auto
Src : /root/.mc/config.json
- 准备大文件(准备测试上传)
du -sh mysql_tobacco_20250701180001.tar.gz
4.4G mysql_tobacco_20250701180001.tar.gz
- 测试上传功能及传输时间
使用time命令查看上传的速度
# time命令统计
mc put 命令上升大文件
time mc put mysql_tobacco_20250701180001.tar.gz tobacco/tobacco-prod
# 以下是传输速度和耗时情况
...0250701180001.tar.gz: 4.38 GiB / 4.38 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 108.95 MiB/s 41s
real 0m41.218s
user 0m53.313s
sys 0m6.779s
- 测试下载功能
mc get tobacco/tobacco-prod/mysql_tobacco_20250701180001.tar.gz .
...0250701180001.tar.gz: 4.38 GiB / 4.38 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 110.55 MiB/s 40s
- 测试删除功能
mc rm tobacco/tobacco-prod/mysql_tobacco_20250701180001.tar.gz tobacco/tobacco-prod/system_install.tar.gz
Removed `tobacco/tobacco-prod/mysql_tobacco_20250701180001.tar.gz`.
Removed `tobacco/tobacco-prod/system_install.tar.gz`.
5.6 集群代理健康检查页
Minio默认提供健康检查页。代理opentresty使用其检查集群服务器状态,并将故障服务器从upstream转发列表中剔除。
http://172.29.100.101:9000/upstream/health/
6. S3 API
6.1. 官方文档-S3 API 兼容性
6.2. 软件开发工具包(S3-Compatible SDK)
6.3. 代理分片上传和负载均衡方案
- openresty代理Minio集群,为保证分片上传时,所有分片上传至同一服务器,启用了一致性hash senssionid的的方式,根据hash结果转发请求至固定后端Minio服务器。具体规则说明如下:
- URL中包含sessionid、sessinId、uploadid、uploadId参数时,openresty会直接使用参数做一致性hash,根据hash结果转发至固定的后端服务器。例如:http://cluster01.minio.xunku.in:9000?sessionid=AbcJUYTJ123
- URL中没有上述参数时,openresty会使用请求的**远程IP(remote_addr)+盐(salt_key)**的方式生产一致性hash,根据hash结果转发至固定的后端服务器。
- 极端情况:当分片上传文件时,转发的后端minio服务器发生故障,openresty自动剔除故障服务器,并重新分配新的后端minio服务器。此时分片上传会因为分片不在同一台服务器上,导致上传失败。
- 强烈建议:在上传URL中带上sessionid、sessinId、uploadid、uploadId参数,减少openresty代理每次根据远程IP计算,同时可以避免因内部调用minio的服务器使用固定IP,导致所有请求转发至同一台后端Minio服务器,造成网络流量不均衡。