linux下的分布式Minio部署实践

打印 上一主题 下一主题

主题 825|帖子 825|积分 2475

Linux下的分布式Minio部署实践

分布式Minio部署可以将多块硬盘(位于雷同机器大概差异机器)组成一个对象存储服务,避免单机环境下硬盘容量不敷、单点故障等问题。
1. 简介

在当前的云盘算和大数据时代,IT系统通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助搭建一个高可靠、高可用、弹性扩展的对象存储服务。
分布式部署,minio拓扑为Multi-Node Multi-Drive (MNMD), 即多个节点,每个节点有多个磁盘。可用于如下场景:


  • 企业级的高性能对象存储。
  • 多节点/多硬盘级别的可靠性,可配置容忍最多 1/2 节点或硬盘的损失。
  • 用于AI/ML、分布式查询、分析以及其他数据湖组件的重要存储。
  • 可扩展到 PB 级别的工作负载,具备存储容量和性能的双重扩展能力。
2. minio的数据掩护机制

2.1 Erasure Code(纠删码)

Minio 使用 Erasure Code 提供数据的冗余:


  • 分布式 Minio 采用Erasure Code来防范多个节点宕机和位衰减。
  • 分布式 Minio 至少必要 4 个节点(4台服务器),使用分布式 Minio 就会主动启用纠删码功能。
  • Erasure Code 是一种规复丢失和破坏数据的数学算法, Minio 采用 Reed-Solomon Code 将对象拆分成 N/2 数据 和 N/2 奇偶校验块。MinIO 在 N / 2 个数据盘 和 N / 2 个奇偶校验盘上分片对象。这就意味着假如是12块盘, 一个对象会被分成6个数据块、6个奇偶校验块, 可以丢失恣意6块盘的环境下(不管其是存放的数据块照旧奇偶校验块), 仍可以从剩下的盘中的数据进行读取和规复。
  • Minio 纠删码是作用在对象级别,可以一次规复一个对象,而RAID 是作用在卷级别,数据规复时间很长。Minio 对每个对象单独编码,存储服务一经部署,通常环境下是不必要更换硬盘大概修复。



  • DataDrives : 纠删码中的数据盘,用来存储 Object 原始数据。
  • ParityDrives: 纠删码中的校验盘,用来存储 Object 盘算出来的校验数据。
  • Minio 纠删码的默认配置为 1 : 1, 即数据盘 ( DataDrives )和 校验盘 ( ParityDrives ) 个数雷同, 使用minio分布式部署最终真正可用的存储空间,只有全部磁盘总空间的一半巨细。
  • 一个 ErasureCode 组/ Sets 中有多个 Drive(DataDrives + ParityDrives), Minio 会先将一块 Block 按照 Drives 数目, 分别为多个小块, 这些小块在 Minio 中叫做 Shards。比如一个 Block 是 10MB, 而 Set 里有 16 个 Drive(8 DataDrives + 8 ParityDrives), 此时 Minio 会将 Block 按照 10 MB / 8 DataDrives 的方式,将数据分别到 8 个 Data Shards,并额外再创建 8 个 空 Shards,用来存储编码后的冗余数据。
  • 接着 Minio 就会对 Data Shards 进行纠删码编码, 并将编码后的冗余数据存储到前面创建的 8 个空 Shards 中, 也就是 parity shards 中。

2.2 数据掩护

分布式 MinIO 使用 Erasure Code 提供针对 多个节点/驱动器 故障 和 Bit Rot 掩护。


  • 由于分布式 MinIO 所需的 最小磁盘为 4(与擦除编码所需的最小磁盘雷同), 因此在您启动分布式 MinIO 时,擦除代码会主动启动。
  • 因此 只要 m / 2 个服务器 或 m * n / 2 个或更多磁盘在线, 具有 m个服务器 和 n个磁盘 的分布式 MinIO 设置将使您的数据安全。 ( M 表现 服务器总数, N 表现 数据库盘 总数 )
  • Erasure Code 是用来包管 Object 的每个 Block 的数据精确和可规复的, 而 Bitrot 技术是用来检验磁盘数据的精确性的。
  • Erasure Code 技术比力复杂, 但是 Bitrot 技术就比力简朴了。本质就是在写数据之前, 先盘算好数据的 hash, 然后将 hash 先写入磁盘, 再写入必要存储的数据。如许读取数据时,就可以通过重新盘算 hash,和原始写入的 hash进行划一性比力,来判断数据是否有破坏。
  • 上传文件时,Minio 不是直接上传到 object 在磁盘的最终存储目录的,而是先写到一个临时目录,等全部数据都写到临时目录后,Minio 才会进行 rename 操作,将 object 数据存储到最终存储目录。
3. 部署分布式Minio

3.1 环境准备

机器准备

hostnameos配置ipdiskminioserver1centos7.98C32G192.168.1.10vdb,vdc,vdd,vdeminioserver2centos7.98C32G192.168.1.11vdb,vdc,vdd,vdeminioserver3centos7.98C32G192.168.1.12vdb,vdc,vdd,vdeminioserver4centos7.98C32G192.168.1.13vdb,vdc,vdd,vde

  • 各节点按照上表信息完成基础配置。
  • 各节点配置ntp服务,确保时间同步。
  • 各节点关闭防火墙大概放行9000和9001端口:
  1. firewall-cmd --permanent --zone=public --add-port=9000-9001/tcp
  2. firewall-cmd --reload
复制代码
磁盘和挂载点准备

本文以4节点的分布式Minio为例,每个节点4块盘为例。将4块盘分别挂载到4个节点上,并在每个节点上创建目录。

  • 格式化磁盘并配置挂载点
  1. ]# cat disk-mount.sh
  2. #!/bin/bash
  3. mkfs.xfs /dev/vdb -L DISK1
  4. mkfs.xfs /dev/vdc -L DISK2
  5. mkfs.xfs /dev/vdd -L DISK3
  6. mkfs.xfs /dev/vde -L DISK4
  7. mkdir -p /data/minio/data0{1..4}
  8. cat >> /etc/fstab <<-EOF
  9. LABEL=DISK1      /data/minio/data01         xfs     defaults,noatime  0       2
  10. LABEL=DISK2      /data/minio/data02         xfs     defaults,noatime  0       2
  11. LABEL=DISK3      /data/minio/data03         xfs     defaults,noatime  0       2
  12. LABEL=DISK4      /data/minio/data04         xfs     defaults,noatime  0       2
  13. EOF
  14. mount -a
复制代码
在4个节点依次执行上述脚本sh disk-mount.sh,确保硬盘挂载到相应目录:
  1. ]# lsblk -f
  2. NAME   FSTYPE  LABEL    UUID                                 MOUNTPOINT
  3. sr0    iso9660 config-2 2024-09-18-14-22-17-00               
  4. vda                                                         
  5. └─vda1 xfs              a8486478-6076-4541-bfc7-8d945834d5a0 /
  6. vdb    xfs     DISK1    c4f4442a-f805-4404-ab5b-2e27b46a2b75 /data/minio/data01
  7. vdc    xfs     DISK2    dba519e6-7a01-4eaf-a3cc-3d2b2a23a39a /data/minio/data02
  8. vdd    xfs     DISK3    369b7795-510f-4f50-b314-7fc3b533a36b /data/minio/data03
  9. vde    xfs     DISK4    360ccb99-029a-496d-9f2c-22d58cb51206 /data/minio/data04
复制代码
  注意:
  确保用于minio的数据盘是干净无数据的。
  

  • 禁用XFS Retry On Error
MinIO 强烈发起通过 max_retries 配置禁用以下错误类别的重试行为:


  • EIO 错误:读写时发生的输入/输堕落误
  • ENOSPC 错误:装备上空间不敷
  • 默认:全部其他错误
默认的 max_retries 设置通常会让文件系统在错误发生时无限期地重试,而不是流传错误。MinIO 可以精确处置处罚 XFS 错误,因此重试行为只会引入不须要的延迟或性能下降。
以下脚本会遍历指定挂载路径下的全部硬盘,并将 XFS 的 max_retries 设置为 0,或设置为“在发生错误时立即失败”,以符合推荐的错误类别。该脚本会忽略未挂载的硬盘(无论是手动挂载照旧通过 /etc/fstab)。请根据您的 MinIO 硬盘修改 /data/minio/data 行以匹配使用的模式。
  1. #!/bin/bash
  2. for i in $(df -h | grep /data/minio/data | awk '{ print $1 }'); do
  3.       mountPath="$(df -h | grep $i | awk '{ print $6 }')"
  4.       deviceName="$(basename $i)"
  5.       echo "Modifying xfs max_retries and retry_timeout_seconds for drive $i mounted at $mountPath"
  6.       echo 0 > /sys/fs/xfs/$deviceName/error/metadata/EIO/max_retries
  7.       echo 0 > /sys/fs/xfs/$deviceName/error/metadata/ENOSPC/max_retries
  8.       echo 0 > /sys/fs/xfs/$deviceName/error/metadata/default/max_retries
  9. done
  10. exit 0
复制代码
将上述脚本保存为 /opt/minio/xfs-retry-settings.sh,添加执行权限:chmod +x /opt/minio/xfs-retry-settings.sh。并在全部 MinIO 节点上运行此脚本,以禁用 XFS 的错误重试功能。
因为 Linux 操作系统通常在重启不会保留这些更改,可以使用带有 @reboot 时间参数的 cron 作业,在节点重启时运行上述脚本,以确保全部硬盘禁用错误重试功能。使用 crontab -e 创建以下任务,并根据每个节点的实际环境修改脚本路径:
  1. @reboot /opt/minio/xfs-retry-settings.sh
复制代码
  分析
  官方发起使用当地存储范例(DAS),同时文件系统使用xfs,磁盘使用的存储介质和容量发起划一。
关于minio部署的硬件要求可以参考:https://min.io/docs/minio/linux/operations/checklists.html
  minio软件准备

在每个节点上安装minio:
  1. # 在节点的/opt目录下载安装minio软件
  2. mkdir -p /opt/minio
  3. mv minio /opt/minio/
  4. cd /opt/minio/
  5. wget https://dl.min.io/server/minio/release/linux-amd64/minio
  6. chmod +x minio
复制代码
3.2 启动分布式Minio

以下两种方式任选一种,用于配置启动分布式Minio服务:
通事后台运行下令启动

在4个节点下依次创建并配置开机主动运行如下脚本:
  1. # minio文件和运行脚本
  2. ]# pwd
  3. /opt/minio
  4. ]# ls
  5. minio minio-cluster-start.sh
  6. # 配置脚本开机运行
  7. ]# chmod +x minio-cluster-start.sh
  8. ]# echo "/opt/minio/minio-cluster-start.sh" >> /etc/rc.d/rc.local
  9. ]# chmod +x /etc/rc.d/rc.local
复制代码
其中minio-cluster-start.sh脚本内容如下:
  1. #!/bin/bash
  2. export MINIO_ROOT_USER=admin
  3. export MINIO_ROOT_PASSWORD=minioadmin
  4. nohup /opt/minio/minio server --address :9000 --console-address :9001 \
  5. http://192.168.1.10/data/minio/data01 http://192.168.1.10/data/minio/data02 http://192.168.1.10/data/minio/data03 http://192.168.1.10/data/minio/data04 \
  6. http://192.168.1.11/data/minio/data01 http://192.168.1.11/data/minio/data02 http://192.168.1.11/data/minio/data03 http://192.168.1.11/data/minio/data04 \
  7. http://192.168.1.12/data/minio/data01 http://192.168.1.12/data/minio/data02 http://192.168.1.12/data/minio/data03 http://192.168.1.12/data/minio/data04 \
  8. http://192.168.1.13/data/minio/data01 http://192.168.1.13/data/minio/data02 http://192.168.1.13/data/minio/data03 http://192.168.1.13/data/minio/data04 \
  9. > /var/log/minio.log 2>&1 &
复制代码
配置系统服务管理

也可以将minio配置为系统服务,实现systemctl统一管理。
  1. # minio文件和运行脚本
  2. ]# pwd
  3. /opt/minio
  4. ]# ls
  5. minio run.sh
  6. ]# chmod +x run.sh
复制代码
其中run.sh脚本内容如下:
  1. #!/bin/bash
  2. export MINIO_ROOT_USER=admin
  3. export MINIO_ROOT_PASSWORD=minioadmin
  4. /opt/minio/minio server --address :9000 --console-address :9001 \
  5. http://192.168.1.10/data/minio/data01 http://192.168.1.10/data/minio/data02 http://192.168.1.10/data/minio/data03 http://192.168.1.10/data/minio/data04 \
  6. http://192.168.1.11/data/minio/data01 http://192.168.1.11/data/minio/data02 http://192.168.1.11/data/minio/data03 http://192.168.1.11/data/minio/data04 \
  7. http://192.168.1.12/data/minio/data01 http://192.168.1.12/data/minio/data02 http://192.168.1.12/data/minio/data03 http://192.168.1.12/data/minio/data04 \
  8. http://192.168.1.13/data/minio/data01 http://192.168.1.13/data/minio/data02 http://192.168.1.13/data/minio/data03 http://192.168.1.13/data/minio/data04
复制代码
在3个节点上创建minio.service文件:
  1. # minio.service文件内容
  2. ]# cat > /usr/lib/systemd/system/minio.service <<-EOF
  3. [Unit]
  4. Description=Minio service
  5. Documentation=https://docs.minio.io/
  6. [Service]
  7. WorkingDirectory=/opt/minio/
  8. ExecStart=/opt/minio/run.sh
  9. Restart=on-failure
  10. RestartSec=5
  11. [Install]
  12. WantedBy=multi-user.targe
  13. EOF
  14. # 配置minio服务启动
  15. ]# systemctl daemon-reload
  16. ]# systemctl enable minio && systemctl start minio
复制代码
3.3 访问minio console

此时通过恣意节点的ip和端口(9001)访问minio console,默认用户名和暗码为admin/minioadmin。
4. 配置nginx代理minio集群

通过nginx反向代理4台minio节点,统一访问入口并做负载均衡。这里使用两台机器搭建高可用的nginx集群。
hostnameip操作系统软件版本nginx1192.168.1.2centos7.9keepalived-1.3.5-19.el7.x86_64; nginx-1.20.1-10.el7.x86_64nginx2192.168.1.9centos7.9keepalived-1.3.5-19.el7.x86_64; nginx-1.20.1-10.el7.x86_64   分析
  Minio官方发起的LB方案为nginx和Haproxy,本文使用nginx做为LB。
  4.1 安装keepalived和nginx

  1. ]# yum -y install keepalived nginx
复制代码
配置keepalived

主节点keepalived配置。编辑 /etc/keepalived/keepalived.conf,配置如下:
  1. global_defs {
  2.    router_id nginx1
  3. }
  4. vrrp_script chk_nginx {
  5.     script "/etc/keepalived/check_nginx.sh"  # 指定检查脚本路径
  6.     interval 2                               # 每2秒检查一次
  7.     weight -10                               # 如果Nginx挂掉,优先级减10。确保降低优先级后低于slave节点优先级
  8.     fall 10
  9.     rise 2
  10. }
  11. vrrp_instance VI_1 {
  12.     state MASTER                 # 主节点为 MASTER,备节点为 BACKUP
  13.     interface eth0               # 绑定的网卡接口
  14.     virtual_router_id 51         # VRID 相同,表示同一个虚拟路由器
  15.     priority 100                 # 优先级,主节点要比备节点高
  16.     advert_int 1                 # 检测时间间隔
  17.     authentication {
  18.         auth_type PASS           # 认证方式
  19.         auth_pass 1111           # 认证密码
  20.     }
  21.         unicast_src_ip 192.168.1.2          #配置单播的源地址,即本机地址
  22.     unicast_peer {            # 默认为组播模式,此处配置单播
  23.         192.168.1.9             # 备节点的IP地址,如果由多个备节点,可以配置多个,每行一个
  24.     }
  25.     virtual_ipaddress {
  26.         192.168.1.14            # 虚拟IP地址 (VIP)
  27.     }
  28.     track_script {
  29.         chk_nginx    # 跟踪Nginx检查脚本
  30.     }
  31. }
复制代码
备节点keepalived配置。编辑 /etc/keepalived/keepalived.conf,配置如下:
  1. global_defs {
  2.    router_id nginx2
  3. }
  4. vrrp_instance VI_1 {
  5.     state BACKUP    # 备节点为 BACKUP
  6.     interface eth0
  7.     virtual_router_id 51    # VRID 相同
  8.     priority 99    # 优先级,备节点要比主节点低
  9.     advert_int 1
  10.     authentication {
  11.         auth_type PASS
  12.         auth_pass 1111       # 认证密码相同
  13.     }
  14.         unicast_src_ip 192.168.1.9          #配置单播的源地址,即本机地址
  15.     unicast_peer {            # 默认为组播模式,此处配置单播
  16.         192.168.1.2             # 备节点的IP地址,如果由多个备节点,可以配置多个,每行一个
  17.     }
  18.     virtual_ipaddress {
  19.         192.168.1.14    # 虚拟IP地址 (VIP)
  20.     }
  21.     track_script {
  22.         chk_nginx    # 跟踪Nginx检查脚本
  23.     }
  24. }
复制代码
配置康健检查脚本:
在每台nginx节点上创建一个检查脚本,例如/etc/keepalived/check_nginx.sh,内容如下:
  1. #!/bin/bash
  2. if ! pidof nginx > /dev/null; then
  3.     exit 1  # Nginx 没有运行,返回非 0 值表示失败
  4. fi
  5. exit 0  # Nginx 运行正常
复制代码
该脚本通过pidof下令检查Nginx历程是否正常运行,假如nginx历程不存在则返回状态码非0,如许Keepalived可以根据返回状态做出决定。
添加脚本的执行权限:
  1. ]# sudo chmod +x /etc/keepalived/check_nginx.sh
复制代码
配置nginx

通过使用 nginx 代理,在主节点和备节点上分别配置nginx,编辑 /etc/nginx/nginx.conf,配置如下:
  1. upstream minio-server {
  2.         least_conn;
  3.         server 192.168.1.10:9001 weight=25 max_fails=2 fail_timeout=30s;
  4.         server 192.168.1.11:9001 weight=25 max_fails=2 fail_timeout=30s;
  5.         server 192.168.1.12:9001 weight=25 max_fails=2 fail_timeout=30s;
  6.         server 192.168.1.13:9001 weight=25 max_fails=2 fail_timeout=30s;
  7.     }   
  8. server{
  9.     listen       80;
  10.     listen  [::]:80;
  11.     server_name  localhost;
  12.     location / {
  13.         proxy_set_header Host $http_host;
  14.         proxy_set_header X-Real-IP $remote_addr;
  15.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  16.         proxy_set_header X-Forwarded-Proto $scheme;
  17.         client_body_buffer_size 10M;
  18.         client_max_body_size 10G;
  19.         proxy_buffers 1024 4k;
  20.         proxy_connect_timeout 300;
  21.         proxy_next_upstream error timeout http_404;
  22.         proxy_http_version 1.1;
  23.         proxy_set_header Upgrade $http_upgrade;
  24.         proxy_set_header Connection "upgrade";
  25.         proxy_pass http://minio-server; # This uses the upstream directive definition to load balance
  26.     }
  27. }
复制代码
其中重要是 upstream 及 proxy_pass 的配置,配置到nginx.conf中的http块中。
启动配置服务

  1. # keepalived服务
  2. ]# systemctl start keepalived
  3. ]# systemctl enable keepalived
  4. # nginx服务
  5. ]# systemctl start nginx
  6. ]# systemctl enable nginx
复制代码
4.2 验证

访问 http://${VIP}:80 即可访问minio console。
4.3 FAQ


  • **问题详情:**配置nginx代理后,通过nginx访问minio。在欣赏桶中的列表的时间,始终在loading,无法加载桶内的文件列表。通过欣赏器F12调试界面检察有很多的WebSocket connection的错误。
办理方式:
在nginx配置中,确保添加如下参数:
  1.     location / {
  2.             ...
  3.                 proxy_set_header Upgrade $http_upgrade;
  4.         proxy_set_header Connection "upgrade";
  5.         ...
  6.         }
复制代码
5. 参考资料


  • https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html
  • https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
  • https://min.io/docs/minio/linux/operations/checklists/hardware.html#minio-hardware-checklist-memory
  • Minio Cluster 详解 )

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表