linux下的分布式Minio部署实践

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 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。

linux下的分布式Minio部署实践_第1张图片

  • 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 中。

linux下的分布式Minio部署实践_第2张图片

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 环境准备

机器准备
hostname os 配置 ip disk
minioserver1 centos7.9 8C32G 192.168.1.10 vdb,vdc,vdd,vde
minioserver2 centos7.9 8C32G 192.168.1.11 vdb,vdc,vdd,vde
minioserver3 centos7.9 8C32G 192.168.1.12 vdb,vdc,vdd,vde
minioserver4 centos7.9 8C32G 192.168.1.13 vdb,vdc,vdd,vde
  1. 各节点按照上表信息完成基础配置。
  2. 各节点配置ntp服务,确保时间同步。
  3. 各节点关闭防火墙或者放行9000和9001端口:
firewall-cmd --permanent --zone=public --add-port=9000-9001/tcp
firewall-cmd --reload
磁盘和挂载点准备

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

  1. 格式化磁盘并配置挂载点
]# cat disk-mount.sh
#!/bin/bash
mkfs.xfs /dev/vdb -L DISK1
mkfs.xfs /dev/vdc -L DISK2
mkfs.xfs /dev/vdd -L DISK3
mkfs.xfs /dev/vde -L DISK4


mkdir -p /data/minio/data0{
   1..4}

cat >> /etc/fstab <<-EOF
LABEL=DISK1      /data/minio/data01         xfs     defaults,noatime  0       2
LABEL=DISK2      /data/minio/data02         xfs     defaults,noatime  0       2
LABEL=DISK3      /data/minio/data03         xfs     defaults,noatime  0       2
LABEL=DISK4      /data/minio/data04         xfs     defaults,noatime  0       2
EOF

mount -a

在4个节点依次执行上述脚本sh disk-mount.sh,确保硬盘挂载到相应目录:

]# lsblk -f
NAME   FSTYPE  LABEL    UUID                                 MOUNTPOINT

你可能感兴趣的:(linux下的分布式Minio部署实践)