一、简介
MinIO 是一个高性能的分布式对象存储系统。 它是软件定义的,在行业标准硬件上运行,并且 100% 开源,主要许可证是 GNU AGPL v3。
MinIO 的不同之处在于它从一开始就被设计为私有/混合云对象存储的标准。 因为 MinIO 是专门为对象而构建的,所以单层架构可以毫不妥协地实现所有必要的功能。 结果是一个同时具有高性能、可扩展性和轻量级的云原生对象服务器。
虽然 MinIO 在二级存储、灾难恢复和归档等传统对象存储用例方面表现出色,但它在克服与机器学习、分析和云原生应用程序工作负载相关的挑战方面独树一帜。
所有MinIO部署实现了 纠删码(Erasure Coding(纠删码))后端。 你可以使用以下其中一种拓扑来部署MinIO:
-
单节点单硬盘(SNSD 或者 “单节点”)
本地开发和评估,可靠性不高/有限。
-
单节点多硬盘(SNMD 或者 “单节点多硬盘”)
性能、规模和容量要求较低的工作负载驱动级别的可靠性,可配置容忍损失高达一半所有驱动器的能力。对多驱动器拓扑和故障转移行为进行评估。
-
多节点多硬盘 (MNMD or “Distributed”)
企业级高性能对象存储多节点/驱动器级可靠性,可配置容忍性,可承受多达1/2的节点/驱动器损失用于AI/ML、分布式查询、分析和其他数据湖组件的主要存储可扩展到PB+级工作负载-包括存储容量和性能
MinIO 强烈建议在长期开发和生产环境中使用 Linux (RHEL, Ubuntu) 或 Kubernetes (Upstream, OpenShift)。
二、二进制部署
1、内核优化
cat > /etc/sysctl.d/minio.conf <<EOF
# 最大打开文件数/文件描述符的数量
fs.file-max = 4194303
# 尽可能少地使用交换空间
vm.swappiness = 1
# 优先考虑应用内存而非磁盘/交换空间的缓存
vm.vfs_cache_pressure = 50
# 保持的最小空闲内存量
vm.min_free_kbytes = 1000000
# 遵循Mellanox的最佳实践 https://community.mellanox.com/s/article/linux-sysctl-tuning
# Mellanox推荐的以下更改可以改善IPv4流量性能
# 禁用TCP时间戳选项以提高CPU利用率
net.ipv4.tcp_timestamps = 0
# 启用TCP选择性确认选项以提高吞吐量
net.ipv4.tcp_sack = 1
# 增加处理器输入队列的最大长度
net.core.netdev_max_backlog = 250000
# 增加TCP最大和默认缓冲区大小,使用setsockopt()设置
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.optmem_max = 4194304
# 增加内存阈值以防止丢包:
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
# 启用TCP的低延迟模式:
net.ipv4.tcp_low_latency = 1
# 下列变量用于告诉内核多少套接字缓冲区空间应用于TCP窗口大小,多少应用于应用缓冲区。
# 值1意味着套接字缓冲区将被均等地分配给TCP窗口大小和应用。
net.ipv4.tcp_adv_win_scale = 1
# 最大的进入连接数
net.core.somaxconn = 65535
# 最大的排队数据包数
net.core.netdev_max_backlog = 10000
# 完全建立的套接字等待accept的队列长度
net.ipv4.tcp_max_syn_backlog = 4096
# 等待FIN包的时间(秒)
net.ipv4.tcp_fin_timeout = 15
# 禁用icmp发送重定向
net.ipv4.conf.all.send_redirects = 0
# 禁用icmp接受重定向
net.ipv4.conf.all.accept_redirects = 0
# 丢弃具有LSR或SSR的数据包
net.ipv4.conf.all.accept_source_route = 0
# MTU发现,仅在检测到ICMP黑洞时启用
net.ipv4.tcp_mtu_probing = 1
EOF
sysctl -p /etc/sysctl.d/minio.conf
# `Transparent Hugepage Support`: 这是Linux内核的一个特性,旨在通过更有效地使用处理器的内存映射硬件来提高性能。
# 但这可能会导致https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp 所述的非优化应用程序的性能问题。
# 由于大多数Linux发行版默认设置为`enabled=always`,我们建议将其更改为`enabled=madvise`。
# 这将允许为透明大页优化的应用程序获得性能优势,同时防止其他相关的问题。
# 同时,在内核命令行上设置`transparent_hugepage=madvise`(例如,在/etc/default/grub中)以持久设置这个值。
echo "Enabling THP madvise"
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
2、下载MinIO服务器文件
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/
3、创建 systemd 系统启动服务文件
# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://minio.org.cn/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
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
4、创建用户和组
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
5、单节点单硬盘部署
1、创建环境变量文件
# vim /etc/default/minio
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me
MINIO_VOLUMES="/data/minio-data"
MINIO_OPTS="--console-address :9001"
2、创建存储路径
mkdir -p /data/minio-data
chown minio-user:minio-user /data/minio-data
3、启动MinIO服务
systemctl daemon-reload
systemctl start minio.service
systemctl enable minio.service
systemctl status minio.service
6、单节点多硬盘部署
1、创建环境变量文件
注意:minio的密码必须符合规定的复杂度,比如大于8位,否则还是会无法启动minio服务
# vim /etc/default/minio
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me
MINIO_VOLUMES="/data/minio/data-{1...4}"
MINIO_OPTS="--console-address :9001"
2、创建存储路径
mkdir -p /data/minio/{data-1,data-2,data-3,data-4}
chown minio-user:minio-user /data/minio/{data-1,data-2,data-3,data-4}
3、启动MinIO服务
7、多节点多硬盘部署
1、修改hosts文件
# vim /etc/hosts
192.168.1.10 minio-01.example.com
192.168.1.20 minio-02.example.com
192.168.1.30 minio-03.example.com
192.168.1.40 minio-04.example.com
2、创建环境变量文件
# vim /etc/default/minio
MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me
MINIO_VOLUMES="https://minio{1...4}.example.com:9000/data/minio/data-{1...4}"
MINIO_OPTS="--console-address :9001"
3、创建存储路径
mkdir -p /data/minio/{data-1,data-2,data-3,data-4}
chown minio-user:minio-user /data/minio/{data-1,data-2,data-3,data-4}
3、启动MinIO服务
三、docker部署
1、单节点单硬盘
services:
minio:
image: minio/minio:RELEASE.2024-03-03T17-50-39Z
container_name: minio
ports:
- 9000:9000 # api端口
- 9001:9001 # 控制台端口
environment:
- MINIO_ROOT_USER=minio
- MINIO_ROOT_PASSWORD=Minio@123
volumes:
- .data:/data
- .config:/root/.minio/
- /etc/localtime:/etc/localtime:ro #防止时间异常
command: server --console-address ":9001" /data #指定容器中的目录 /data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] # 健康检查,确保服务运行正常
interval: 30s
timeout: 20s
retries: 3
privileged: true
restart: always
2、单节点多硬盘
services:
minio:
image: minio/minio:RELEASE.2024-03-03T17-50-39Z
container_name: minio
ports:
- "9000:9000" # API端口
- "9001:9001" # 控制台端口
environment:
- MINIO_ROOT_USER=minio
- MINIO_ROOT_PASSWORD=Minio@123
volumes:
- /data/minio/1:/data-1
- /data/minio/2:/data-2
- /data/minio/3:/data-3
- /data/minio/4:/data-4
- ./config:/root/.minio/
- /etc/localtime:/etc/localtime:ro # 防止时间异常
command: server --console-address ":9001" /data-1 /data-2 /data-3 /data-4 # 指定容器中的目录 /data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] # 健康检查,确保服务运行正常
interval: 30s
timeout: 20s
retries: 3
privileged: true
restart: always
四、命令行工具mc
1、简介
MinIO客户端 mc
命令行工具提供了一个现代化的替代方案, 支持文件系统和与Amazon S3兼容的云存储服务,适用于UNIX命令如 ls
、 cat
、 cp
、 mirror
和 diff
。
mc 命令行工具是为了与 AWS S3 API 兼容而构建的,并且已经过测试, 以确保在与 MinIO 和 AWS S3 配合使用时,功能和行为符合预期。
MinIO 不对其他 S3 兼容服务提供任何保证,因为它们的 S3 API 实现是 未知的,因此不受支持。尽管 mc 命令 可能 如文档中所 述工作,但任何此类使用都是您自己的风险。
2、安装
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /data/minio/bin/mc
chmod +x /data/minio/bin/mc
ln -s /data/minio/bin/mc /usr/local/bin/mc
3、配置mc
这一步是将 Amazon S3 兼容服务添加到 mc
配置中
bash +o history
mc alias set ALIAS HOSTNAME ACCESS_KEY SECRET_KEY
bash -o history
- 将
ALIAS
替换为要与 S3 服务关联的名称。mc
命令通常需要ALIAS
作为参数, 用于识别要执行哪个 S3 服务。 - 将
HOSTNAME
替换为 S3 服务的 URL 端点或 IP 地址。 - 将
ACCESS_KEY
和SECRET_KEY
替换为 S3 服务上用户的访问密钥和秘密密钥。
例如:
mc alias set myminio http://192.168.1.10:9000 Minio Minio@123456
4、配置主从复制
1、配置主服务节点
mc config host add 节点名称(master) http://地址:端口 用户名 密码
2、配置从服务器节点
mc config host add 节点名称(master) http://地址:端口 用户名 密码
3、新建 minioc.service 文件
# vim /usr/lib/systemd/system/minioc.service
[Unit]
Description=startup minioc mirror master to slave
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mc mirror --remove --overwrite --watch minio_master minio_slave
Restart=on-failure
[Install]
WantedBy=multi-user.target
4、启动服务
systemctl start minioc.service
systemctl enable minioc.service
systemctl status minioc.service
5、故障转移
当 minio_master 节点上的 minio 服务挂掉不可用时,此时启用 minio_slave 节点上的 minio 服务。此时若在 minio_slave 节点的服务上传文件,需要将文件同步到 minio_master 节点上,则需新增 minioc1.service 服务并进行启动。
# vim /usr/lib/systemd/system/minioc1.service
[Unit]
Description=startup minioc mirror slave to master
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mc mirror --remove --overwrite --watch minio_slave minio_master
Restart=on-failure
[Install]
WantedBy=multi-user.target
设置启动
systemctl start minioc1.service
systemctl enable minioc1.service
systemctl status minioc1.service
5、配置prometheus监控
1、生成prometheus配置
# mc admin prometheus generate myminio
scrape_configs:
- job_name: minio-job
bearer_token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3OTkxOTgzMjMsImlzcyI6InByb21ldGhldXMiLCJzdWIiOiJNaW5pbyJ9.sFSa4d9O7xFVBzQSkAjMHv2Q0WGBxXdm7vtZ-D6ay1c7BZjS_mp3XwgJrJHtpwkDdvcza2lhmachV9iBRUVb5g
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['192.168.1.10:9000']
2、修改环境变量文件
# vim /etc/default/minio
export MINIO_PROMETHEUS_URL=http://192.168.1.10:9092 # 新增
export CONSOLE_PROMETHEUS_JOB_ID=minio-job
3、重启MinIO
mc admin service restart myminio
4、配置警告规则
# vim minio-alerting.yml
groups:
- name: minio-alerts
rules:
- alert: MinioClusterDiskOffline
expr: minio_cluster_disk_offline_total > 0
for: 0m
labels:
severity: critical
annotations:
summary: Minio集群磁盘离线 (instance {{ $labels.instance }})
description: "Minio集群中存在磁盘离线情况\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
- alert: MinioNodeDiskOffline
expr: minio_cluster_nodes_offline_total > 0
for: 0m
labels:
severity: critical
annotations:
summary: Minio节点磁盘离线 (instance {{ $labels.instance }})
description: "Minio集群节点上的磁盘处于离线状态\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
- alert: MinioDiskSpaceUsage
expr: disk_storage_available / disk_storage_total * 100 < 10
for: 0m
labels:
severity: warning
annotations:
summary: Minio磁盘空间使用率高 (instance {{ $labels.instance }})
description: "Minio可用磁盘空间低 (< 10%)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
5、配置Grafana 仪表板
13502
15306
五、数据上云
1、开通OSS存储服务
# OSS存储节点
https://oss-cn-heyuan.aliyuncs.com/
# 阿里云ACCESS_KEY,这里是模拟的,请自行申请
ACCESS_KEY=LTAI5tJRzEjkQrtL
# 阿里云SECRET_KEY
SECRET_KEY=Bi4IDskQj3JEhOf
2、创建Minio服务
services:
minio-gateway:
image: minio/minio:RELEASE.2021-06-17T00-10-46Z
network_mode: mynetwork
container_name: minio-gateway
restart: always
ports:
- 9001:9000
volumes:
- /etc/localtime:/etc/localtime
environment:
- MINIO_ACCESS_KEY=LTAI5tJRzEjkQrtL
- MINIO_SECRET_KEY=Bi4IDskQj3JEhOfS
command: gateway s3 https://oss-cn-heyuan.aliyuncs.com/
六、附硬盘挂载脚本
自行修改磁盘盘符名和挂载路径
#!/bin/bash
# 定义函数来简化逻辑卷创建过程
create_lv() {
local disk=$1
pvcreate /dev/$disk
vgcreate "vg${disk##?}" /dev/$disk
lvcreate -n "lv${disk##?}data" -l +100%FREE "vg${disk##?}"
mkfs.xfs /dev/"vg${disk##?}"/"lv${disk##?}data"
echo "Created and formatted LV on /dev/$disk"
}
# 遍历指定的磁盘并调用函数创建逻辑卷
for disk in sdb sdc sdd sde; do
create_lv $disk
done
mkdir -p /data/minio/{data-1,data-2,data-3,data-4}
cat >> /etc/fstab <<'EOF'
LABEL=DISK1 /data/minio/data-1 xfs defaults,noatime 0 2
LABEL=DISK2 /data/minio/data-2 xfs defaults,noatime 0 2
LABEL=DISK3 /data/minio/data-3 xfs defaults,noatime 0 2
LABEL=DISK4 /data/minio/data-4 xfs defaults,noatime 0 2
EOF
mount -a
评论区