参考文档
Deploy MinIO: Multi-Node Multi-Drive
一、准备
1. 安装文件
# MinIO Server
wget http://private_ip/hfs/install/minio//minio
chmod +x minio
sudo mv minio /usr/local/bin/
# MinIO Client
wget http://private_ip/hfs/install/minio//mc
chmod +x mc
sudo mv mc /usr/local/bin/
2. 网络、防火墙、负载均衡
端口
负载均衡使用 Least Connections 算法,可以使用Nginx。
3. 有顺序的主机名
比如:
minio-01.example.com
minio-02.example.com
minio-03.example.com
minio-04.example.com
就可以使用 minio-0{1...4}.example.com
表示了。
如果没有DNS,就在 /etc/hosts 文件里面添加。
4. 按顺序挂载的JBOD
本地存储
以XFS
格式化存储。
确保所有的节点使用同类型 (NVMe, SSD, or HDD) 、同大小(e.g. N TB)的存储进行部署。MinIO 不对混合存储类型优化,并且限制以最小的存储空间使用。比如,如果部署15个 10TB 盘、1 个 1TB 盘, MinIO 将限制每个驱动器只能使用 1TB 容量。
在 /etc/fstab
进行挂载
mkfs.xfs /dev/vdb -L DISK1
mkfs.xfs /dev/vdc -L DISK2
mkfs.xfs /dev/vdd -L DISK3
mkfs.xfs /dev/vde -L DISK4
$ nano /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2
LABEL=DISK3 /mnt/disk3 xfs defaults,noatime 0 2
LABEL=DISK4 /mnt/disk4 xfs defaults,noatime 0 2
然后,可以通过 /mnt/disk{1...4}
的方式进行访问,同样使用 /mnt/disk{1...4}/minio
访问子目录。
MinIO不支持将包含MinIO数据的数据盘迁移到新的位置,无论是人为还是操作系统行为。
注意:
云实例存储配置
在云环境中,实例依赖于外部存储。如果远程文件挂载返回error或failure,那么该实例可能会启动失败(boot failure)。例如,挂载使用 persistent EBS volumes 的 AWS ECS 实例,如果一个或多个 EBS volumes 挂载失败,则AWS ECS实例可能无法使用/etc/fstab
进行引导。
可以设置nofail
,以在启动时静音驱动器错误(silence error reporting),这可以允许出现一个或多个挂载问题时不影响实例启动。
不可以在挂载本地磁盘的系统上配置nofail
,因为静音驱动器错误(silence error reporting)会阻止MinIO和操作系统正常响应错误。
注意:
NFS卷破坏一致性保证
MinIO严格的read-after-write
andlist-after-write
一致性模型需要本地文件系统。
如果底层存储卷是NFS或类似的网络存储,MinIO无法提供一致性保证。
对于需要使用网络存储的部署,请使用NFSv4
以获得最佳效果。
5. 时间同步
yum install chrony -y
systemctl enable chronyd --now
二、考虑因素
1. 同类型节点配置
MinIO强烈建议为所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在所有节点上保持一致。
如果节点具有不一样硬件或软件配置,则部署可能表现出不可预测的性能。
期望低成本存储的工作负载应该部署独立的的warm
或cold
MinIO集群,并将数据分层存储,参考 对象转换 Tiering 。
2. 纠删码校验 (Erasure Coding Parity)
Consider using the MinIO Erasure Code Calculator for guidance in selecting the appropriate erasure code parity level for your cluster.
MinIO纠删码是一种数据冗余和高可用性功能,允许MinIO部署在集群中丢失多个驱动器或节点的情况下自动动态重建对象。与RAID
或replication
等相似技术相比,纠删码以更少的开销提供对象级修复。分布式部署隐式开启并依赖纠删码实现核心功能。
纠删码将对象划分为数据块和校验块,其中校验块支持重构丢失或损坏
的数据块。校验块的数量决定数据冗余度。更高级别的校验,允许以总可用存储为代价,提供对数据丢失更高的容忍。
MinIO默认为EC:4
,或每个erasure set 4个校验块。您可以通过设置MinIO Storage Class environment variable自定义校验级别。MinIO Erasure Code Calculator 可以为纠删码校验级别的设计提供指导。
3. 容量规划
假设每年产生10TB的数据。MinIO部署应至少提供:10TB + 10TB + 10TB = 30TB
。这样,正常运行2年以上后才需要扩展服务器池。
扩展服务器池参考 server pool expansion 。
MinIO建议添加缓冲存储,以考虑存储数据的潜在增长(例如,总可用存储容量为40TB)。根据经验,为了满足容量需求,更倾向于增大初始容量,而不是频繁的即时扩展。
由于MinIO纠删码需要一些空间存储校验块,因此总的原始存储空间会超过计划的可用容量。MinIOErasure Code Calculator 可以指导容量规划设计。
4. 操作系统建议
https://min.io/docs/minio/linux/operations/installation.html#minio-installation-platform-support
5. 既存数据
在分布式环境中启动新的MinIO服务器时,存储设备不得存在数据。
一旦启动了MinIO服务器,所有与数据的交互都必须通过S3 API完成。使用MinIO客户端、MinIO控制台或其中一个MinIO软件开发工具包来处理存储桶和对象。
直接在后台磁盘上修改文件,会导致数据崩溃or数据丢失。
三、部署
1. 创建环境变量文件 /etc/default/minio
# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)
MINIO_VOLUMES="http://minio-0{1...4}.example.com:9000/mnt/disk{1...4}/minio"
# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.
MINIO_OPTS="--console-address :9001"
# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.
MINIO_ROOT_USER=admin
# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.
MINIO_ROOT_PASSWORD=password
# Set to the URL of the load balancer for the MinIO deployment
# This value *must* match across all MinIO servers. If you do
# not have a load balancer, set this value to to any *one* of the
# MinIO hosts in the deployment as a temporary measure.
MINIO_SERVER_URL="http://minios3.example.com"
MINIO_BROWSER_REDIRECT_URL="http://minioconsole.example.com"
也可以直接使用IP,范例如下:
MINIO_VOLUMES="http://192.168.192.16{3...6}:9000/minio{1...4}"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
# 负载均衡地址 如果没有负载均衡就不要放开这个配置
#MINIO_SERVER_URL="http://192.168.192.163:9000"
变量名 | 功用 | 说明 |
---|---|---|
MINIO_SERVER_URL | S3-API |
反向代理 api映射域名 |
MINIO_BROWSER_REDIRECT_URL | Console |
反向代理 控制台域名,浏览器访问地址,不能与api用相同域名 |
MINIO_BROWSER | 设置为 off ,禁止浏览器登录 |
可以把配置文件放在固定的地方,用curl获取。
curl http://private_ip/hfs/install/minio/minio_env -o /etc/default/minio
2. 创建 /usr/lib/systemd/system/minio.service
,启用 systemd
管理
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
可以把配置文件放在固定的地方,用curl获取。
curl http://private_ip/hfs/install/minio/minio.service -o /usr/lib/systemd/system/minio.service
添加用户,配置权限
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4
3. 添加 TLS/SSL 证书
MinIO 只要在${HOME}/.minio/certs
目录检测到合法的x.509证书(.crt、.key),就会自动开启 Transport Layer Security (TLS) 1.2+ 。
对于 systemd
管理的系统,使用 minio-user
作为运行用户,那么 $HOME 目录就是 /home/minio-user
。
- 将证书放置到
/home/minio-user/.minio/certs
目录 - 如果是自签名证书,还要将CA证书放置到
/home/minio-user/.minio/certs/CAs
4. 启动服务
sudo systemctl start minio.service
sudo systemctl enable minio.service
四、反向代理
报错1:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
解决方案1:
Enabling preserve host will allow your code to work
报错2:
ERR_TOO_MANY_REDIRECTS
解决方案2:
nginx servername 配置文件写错了,尴尬不尴尬 ...
https://github.com/minio/minio/pull/6909
设置 MINIO_BROWSER=off 以 disable the embedded MinIO Console. 这个直接关闭console服务了,9001端口都没了。
报错3:
Post "http://minios3.example.com/": dial tcp: lookup minios3.example.com on 183.60.83.19:53: no such host
解决方案3:
在 /etc/hosts 文件,添加对minios3.example.com的解析。
性能测试
https://blog.minio.org.cn/selecting-hardware-for-minio-deployment