Please enable Javascript to view the contents

MinIO 基础设施选型与优化

 ·  ☕ 3 分钟

1. 硬件

1.1 CPU

  • 支持 AVX/AVX-512,用于纠删码计算、SIMD 操作
  • 支持 AES-NI,用于加密对象
单机存储总量推荐的 vCPU 数
最多 1 TB8
最多 10 TB16
最多 100 TB32
最多 1 PB64
大于 1 PB128

1.2 内存

尽可能大一点能提高并发,增加 Page Cache 命中率。

磁盘数量32 GiB64 GiB 内存128 GiB 内存256 GiB 内存512 GiB 内存
4 个磁盘1,0742,1494,2978,59517,190
8 个磁盘8401,6803,3616,72213,443
16 个磁盘5851,1702,3414,6819,362

1.3 硬盘

  • 推荐采用多机多盘,单机硬盘数量在 4、8、16,2 的幂次
  • 直接提供裸盘,不要使用 RAID
  • 磁盘的规格尽可能一致,不要有慢盘,否则会有严重木桶效应

1.4 网络

以顺序读取 HDD 200 MB/s,NVMe 3000 MB/s 为例,计算可支持的硬盘数量:

网络带宽吞吐上限HDD 数量 (200MB/s)NVMe 数量 (3000MB/s)
1 GbE125 MB/s0.60.04
10 GbE1.25 GB/s60.4
25 GbE3.125 GB/s151
50 GbE6.25 GB/s312
100 GbE12.5 GB/s624

如果是多机部署,还需要考虑机器之间的数据传输,需要按照机器数量适当增加网卡。

隔离存储网络和业务网络也是推荐的做法,需要多增加网络设备。

2. 内核配置

2.1 网络优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cat << 'EOF' | sudo tee /etc/sysctl.d/99-minio-network.conf
# 增加核心缓冲区最大值 (64 MiB)
net.core.rmem_max=67108864
net.core.wmem_max=67108864

# 增加 TCP 缓冲区范围
net.ipv4.tcp_rmem=4096 131072 67108864
net.ipv4.tcp_wmem=4096 131072 67108864

# 启用 TCP 窗口缩放 (必须开启,否则无法超过 64KB)
net.ipv4.tcp_window_scaling=1

# 提高并发连接建立能力
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535

# 优化高带宽网络下的丢包处理
net.core.netdev_max_backlog=250000

# 开启 TCP 快速开启 (TFO),减少握手延迟
net.ipv4.tcp_fastopen=3

# 禁用空闲后的慢启动(保持高吞吐状态)
net.ipv4.tcp_slow_start_after_idle=0
EOF
sysctl -p /etc/sysctl.d/99-minio-network.conf

2.2 禁用交换分区

1
2
3
4
cat << 'EOF' | sudo tee /etc/sysctl.d/99-minio-vm.conf
vm.swappiness=10
EOF
sysctl -p /etc/sysctl.d/99-minio-vm.conf

3. 系统配置

3.1 设置 TSC 时间同步

TSC 时间同步比系统时间同步更准确,更稳定。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cat >/etc/systemd/system/clocksource-tsc.service <<'EOF'
[Unit]
Description=Set clocksource to tsc
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource'

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable clocksource-tsc.service
systemctl start clocksource-tsc.service

4. 文件系统

1
mkfs.xfs -f /dev/nvme1n1
1
mount -o noatime,nodiratime,logbufs=8,logbsize=256k,max_retries=0 /dev/nvme1n1 /mnt/data1
  • 使用 xfs 格式,更适合大文件、高并发
  • logbufs=8 提高元数据并发写入能力
  • logbsize=256k 增加日志缓冲区大小
  • noatime 禁用文件访问时间
  • nodiratime 禁用目录访问时间
  • max_retries=0 禁用重试,避免与 MinIO 的自动重试冲突

5. 纠删码的选择

M (Data Blocks - 数据块),K (Parity Blocks - 校验块)

基本原理:

  • 系统的瓶颈在磁盘 IO
  • 数据位越多,冗余越小,速度越快
  • 校验位越多,容忍的坏盘越多
  • minio 会将每个块(M+K)均匀的分布在每个节点
  • 最少 M 位正常才能读成功,最少 M+1 位正常才能写成功

如果你能绘制出数据位分布图,应该很容易做出选择。

6. 文件大小选择

blockSizeV2 在源码 https://github.com/minio/minio/blob/7aac2a2c5b7c882e68c1ce017d8256be2feea27f/cmd/object-api-common.go#L37 处。固定为 1M,旧版本为 10M,表示的是数据的处理窗口大小,主要影响的是 CPU、MEM、小文件的处理速度。

数据文件的大小是另外一件事。在 EC 10:6 配置下,minio 写入 1GB 文件的逻辑是将 1GB文件切分为 10个数据块,然后计算 6个校验块,选择尽量分散的纠删集存储每一个块。每个块存储时,是一个 Part 的数据文件和一个 Meta 的元数据文件。

需要注意的是:

  • 如果数据块只有 KB 级别,minio 会将数据,直接写入到 Meta 文件进行存储
  • 大文件传输时,采用流式分块,minio 会按照分块的大小单独存储

因此,为了获得更大的吞吐,我们需要:

  • 流式上传时,使用更大的分块,或者 –disable-multipart 禁用分块
  • 存储的文件不要太小,临界点 HDD 在 1GB 左右,具体得自己测试

7. 监控面板

minio 内置了四个维度的监控指标,分别是集群、节点、存储桶、资源。执行以下命令,可以生成对应的采集配置。

  • 集群
1
mc admin prometheus generate local
  • 节点
1
mc admin prometheus generate local node
  • 存储桶
1
mc admin prometheus generate local bucket
  • 资源
1
mc admin prometheus generate local resource
  • Grafana 监控面板

https://github.com/minio/minio/tree/master/docs/metrics/prometheus/grafana


微信公众号
作者
微信公众号