MinIO 分布式部署 多节点多硬盘(生产)

参考文档

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数据的数据盘迁移到新的位置,无论是人为还是操作系统行为。

注意:云实例存储配置

在云环境中,实例依赖于外部存储。如果远程文件挂载返回errorfailure,那么该实例可能会启动失败(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 and list-after-write 一致性模型需要本地文件系统。
如果底层存储卷是NFS或类似的网络存储,MinIO无法提供一致性保证。
对于需要使用网络存储的部署,请使用NFSv4以获得最佳效果。

5. 时间同步

yum install chrony -y
systemctl enable chronyd --now

二、考虑因素

1. 同类型节点配置

MinIO强烈建议为所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在所有节点上保持一致。

如果节点具有不一样硬件或软件配置,则部署可能表现出不可预测的性能。

期望低成本存储的工作负载应该部署独立的的warmcold 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部署在集群中丢失多个驱动器或节点的情况下自动动态重建对象。与RAIDreplication等相似技术相比,纠删码以更少的开销提供对象级修复。分布式部署隐式开启并依赖纠删码实现核心功能。

纠删码将对象划分为数据块和校验块,其中校验块支持重构丢失或损坏的数据块。校验块的数量决定数据冗余度。更高级别的校验,允许以总可用存储为代价,提供对数据丢失更高的容忍。

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

四、反向代理

https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html#integrations-nginx-proxy

报错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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容