目 录CONTENT

文章目录

Minio 主从部署和同步配置

简中仙
2025-02-27 / 0 评论 / 0 点赞 / 22 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文如有错误或者侵权的地方,欢迎您批评指正!

一、简介

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命令如 lscatcpmirrordiff

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_KEYSECRET_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
0

评论区