MinIO部署与维护

简介:

MinIO是一个对象存储解决方案,它提供了与Amazon Web Services S3兼容的API,并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云,裸金属基础设施,编排环境,以及边缘基础设施。

特性与优点

  • 高可用性
    MinIO采用分布式架构,数据可在多个节点之间进行冗余备份,以确保数据的高可用性和容错能力。

  • 可扩展性
    MinIO可以轻松地水平扩展,通过添加更多的服务器节点来增加存储容量和吞吐量,以适应不断增长的数据需求。

  • 兼容性
    MinIO兼容Amazon S3 API,这意味着您可以使用现有的S3工具和库来访问和管理MinIO存储。

  • 高性能
    MinIO采用了搞笑的并发读写操作,能够提供快速的数据访问和传输速度。

  • 数据安全
    MinIO支持数据加密、身份验证、访问控制和防止跨站请求伪造(CSRF)等安全特性,保护您的数据免受未经授权的访问。

  • 简单易用
    MinIOn具有简单的部署和使用方法,并提供只管的Web管理界面和命令行工具,使您能够快速上手并管理存储。

  • 易于部署和使用
    MinIO提供了简单易用的命令行工具和API接口,可以方便地进行部署和使用。

  • 轻量级
    MinIO的轻量级架构可以运行再小型服务器或云服务上,非常适合较小的数据规模的存储和管理。

  • 开放源代码
    MinIO是一款开源软件,可以自由使用和修改,同时也有强大的社区支持。

  • 成本低廉
    MinIO可以再普通的硬件设备上运行,不需要昂贵的专用硬件,因此其成本非常低廉。

  • 多云和多区域部署
    MinIO支持多云和多区域部署,可以轻松地搭建一个类似于Amazon S3的对象存储访问。

MinIO的架构

MinIO的架构采用了分布式对象存储的设计思想,将数据分散存储在多个节点上。每个节点都是一个独立的MinIO服务器实例,它们通过网络进行通信和协作。MinIO的架构可以分为以下几个部分:

  • 客户端
    客户端是用户与MinIO进行交互的接口,它提供了多种API和SDK供用户调用。客户端可以向MinIO发送读写请求,并接收MinIO的响应。

  • 网关
    网关是MinIO的入口点,它负责接收客户端的请求,并根据请求的类型和目的将其转发到相应的节点或集群上。网关还负责处理一些公共的请求处理逻辑,如认证、授权和限流等。

  • 节点
    节点是MinIO存储数据的基本单元,它包含了一个或多个磁盘或存储介质。节点通过存储引擎来管理磁盘上的数据,并提供读写接口供其他节点或客户端调用。节点之间通过网络进行通信和协作,共同完成数据的存储和访问。

  • 集群
    集群是由多个节点组成的逻辑单元,它负责处理一定范围内的数据访问请求。集群之间可以通过负载均衡等方式实现流量的分配和调度。当集群中的某个节点出现故障时,集群会自动将其排除在外,并将该节点上的数据重新分布到其他节点上,以保证数据的可靠性和可用性。

纠删码(Erasure Code)

  • 纠删码(Erasure Code)简称EC,是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。

  • 纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。

  • Erasure Code是一种编码技术,它可以将n份原始数据,增加m份校验数据,并能通过n+m份中的任意n份原始数据,还原为原始数据。

  • 即如果有任意小于等于m份的校验数据失效,仍然能通过剩下的数据还原出来。

  • Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。

  • 在同一集群内,MinIO自己会自动生成若干纠删组(Set),用于分布存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。

部署

节点配置

主机名系统IP硬盘数
MinIO-1CentOS7.9192.168.118.1614*5G
MinIO-2CentOS7.9192.168.118.1624*5G
MinIO-3CentOS7.9192.168.118.1634*5G
MinIO-4CentOS7.9192.168.118.1644*5G
NginxCentOS7.9192.168.118.165无额外加盘

2.设置主机名

hostnamectl set-hostname minio-1
hostnamectl set-hostname minio-2
hostnamectl set-hostname minio-3
hostnamectl set-hostname minio-4

3.添加hosts

echo "192.168.118.161 minio-1" >> /etc/hosts
echo "192.168.118.162 minio-2" >> /etc/hosts
echo "192.168.118.163 minio-3" >> /etc/hosts
echo "192.168.118.164 minio-4" >> /etc/hosts

4.ssh免密配置

ssh-keygen
for i in {1..4} ; do ssh-copy-id minio-$i

5.时间同步

ntpdate ntp.aliyun.com

6.格式化磁盘。MinIO强烈建议为存储提供 XFS 格式化的驱动器,MinIO 并不测试也不推荐其他文件系统,如 EXT4、BTRFS 或 ZFS

for i in {sdb,sdc,sdd,sde} ; do mkfs.xfs /dev/$i ; done

7.挂载分区

mkdir /minio{1..4}
mount /dev/sdb /minio1
mount /dev/sdc /minio2
mount /dev/sdd /minio3
mount /dev/sde /minio4

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /minio1 /minio2 /minio3 /minio4

echo  "$(blkid /dev/sdb | awk '{print $2}') /minio1 xfs defaults  0 0"  >>  /etc/fstab
echo  "$(blkid /dev/sdc | awk '{print $2}') /minio2 xfs defaults  0 0"  >>  /etc/fstab
echo  "$(blkid /dev/sdd | awk '{print $2}') /minio3 xfs defaults  0 0"  >>  /etc/fstab
echo  "$(blkid /dev/sde | awk '{print $2}') /minio4 xfs defaults  0 0"  >>  /etc/fstab

8.下载MinIO可执行文件

wget https://dl.min.io/server/minio/release/linux-amd64/minio

9.赋权

chmod +x minio

10.封装服务

mv minio /usr/local/bin/

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

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

StartSec=5
Restart=always

LimitNOFILE=65536

TasksMax=infinity

TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

#记得赋权!
chmod +x /usr/lib/systemd/system/minio.service

11.编辑配置

vi /etc/default/minio

# 这写的是文件磁盘的位置 因为我们是集群节点是161-164 这边是一种池化写法
MINIO_VOLUMES="http://192.168.118.{161...164}:9000/minio{1...4}"
 
# 固定静态端口
MINIO_OPTS="--console-address :9001"
 
# 登录账号
MINIO_ROOT_USER=admin
 
# 登录密码
MINIO_ROOT_PASSWORD=12345678

12.启动服务

systemctl daemon-reload && systemctl start minio

可以登录web界面ip:9001开始使用了~

13.负载均衡

此处的负载均衡也可以拿其中一台节点做,本次实验单独拿了一台机器做nginx

#安装nginx

yum -y install epel-realease
yum -y install nginx
systemctl enable nginx --now
systemctl start nginx

#修改配置
vim /etc/nginx/conf.d/minio.conf

upstream minio_api {
    server 192.168.118.161:9000;
    server 192.168.118.162:9000;
    server 192.168.118.163:9000;
    server 192.168.118.164:9000;
}

upstream minio_console {
    server 192.168.118.161:9001;
    server 192.168.118.162:9001;
    server 192.168.118.163:9001;
    server 192.168.118.164:9001;
}

server{
    listen       9998;
    server_name  192.168.118.165;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;

    location / {
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;

        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_ignore_client_abort on;

        proxy_pass http://minio_api;
    }
}

server{
    listen       9999;
    server_name  192.168.118.165;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;

    location / {
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;

        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_ignore_client_abort on;

        proxy_pass http://minio_console;
    }
}

#重新加载配置

nginx -t
nginx -s reload

访问192.168.118.165:9999

14.MinIO客户端mc

  • MinIO Client mc命令行工具为 UNIX 命令(如ls、cat、cp、mirror和)提供了一种现代替代方案,并diff支持文件系统和兼容 Amazon S3 的云存储服务。

  • mc命令行工具是为与 AWS S3 API 兼容而构建的,并针对预期的功能和行为测试了 MinIO 和 AWS S3。

  • MinIO 不为其他与 S3 兼容的服务提供任何保证,因为它们的 S3 API 实现是未知的,因此不受支持。

下载mc

wget https://dl.min.io/client/mc/release/linux-amd64/mc

赋权

chmod +x mc
mv mc /usr/bin/

添加MinIO存储服务

mc config host add minio http://192.168.118.161:9000 minioadmin minioadmin #以明文方式,若要以密文方式,删除后面的Access Key和Secret Key,回车后手动输入即可

获取"minio"的服务器信息

mc admin info minio

MinIO默认的校验块是4,也就是4块磁盘。按本次实验为案例,纠删码模式为16:4,校验块为4,数据块为12。

公式 1-M/(K+M),M为校验块的数量,K为数据块的数量,就能算出有效存储为75%, 允许故障盘数是4块盘,无论是校验盘还是数据盘

在MinIO中,纠删码集合通常被称为Erasure Code Set,它是由多个磁盘组成的一个逻辑存储单元,用于实现数据的分布和冗余。MinIO的纠删码集合大小有最大限制,不能超过16个磁盘。如果服务器需要使用的磁盘大于16个磁盘,可以创建多个纠删码集合解决此问题,纠删码集合可以理解为存储池。

常用命令

#mc自动补全(需退出shell重新连接生效)
mc --autocompletion

#添加minio存储服务
mc config host add $storage_Name $api_url $Access Key $Secret Key

#移除已添加的minio存储服务
mc config host remove $storage_Name

#查看已添加的minio存储服务
mc admin info $storage_Name

#列出桶
mc ls $storage_Name

#列出桶内数据
mc ls $storage_Name/$bucket_Name

#创建桶
mc mb $storage_Name/$bucket_Name 例 mc mb minio/newbucket

#删除桶
mc rb $storage_Name/$bucket/Name

#查看桶大小
mc du $storage_Name/$bucket/Name

#移动桶数据,recursive为递归
mc mv --recursive $源桶/test $目的桶/test

#复制桶数据
mc cp --recursive $源桶/test $目的桶/test

#删除桶数据
mc rm $storage_Name/$bucket_Name/$object

#全量迁移,重名文件不顾该,桶不存在会自动创建
mc mirror $源桶 $目的桶

#只迁移某个桶,以test为例,目的桶需要提前创建,重盖重名文件加参数--overwrite
mc mirror $源桶/test $目的桶/test

#重启存储服务
mc admin service restart $storage_Name

#平衡池数据
mc admin rebalance start $storage_Name

#查看平衡状态
mc admin rebalance status $storage_Name

对等扩容

#官方推荐使用添加节点的方式,而不推荐使用添加硬盘的方式

#要求增加的节点数和磁盘数最好是原集群的等数或倍数

#扩容后不会对所有节点进行完全的数据平衡,而是将原来的节点和扩容的节点视作两个区域

#当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内通过哈希算法确定对应的纠删组进行最终存放

#基于安全性考虑,集群最大节点数一般不超过32个,这是由于MinIO集群通过分布式锁保证强一致性,若集群节点数过大,维护强一致性将带来性能问题

#扩容需要重启MinIO服务

#本次扩容4台同配置服务器,只要求架构及硬盘规格一致

#拷贝minio.service和minio配置文件、mc客户端至扩容机器

#每个节点的配置必须对齐,minio配置每个节点都一致,如下

修改minio配置

vi /etc/default/minio

# 这写的是文件磁盘的位置 因为我们是集群节点是161-164 这边是一种池化写法
#多个池用空格分开,其他的配置不需要改
MINIO_VOLUMES="http://192.168.118.{161...164}:9000/minio{1...4} http://192.168.118.{165...168}:9000/minio{1...4}"
 
# 固定静态端口
MINIO_OPTS="--console-address :9001"
 
# 登录账号
MINIO_ROOT_USER=admin
 
# 登录密码
MINIO_ROOT_PASSWORD=12345678

执行systemctl stop minio停止minio服务

执行ss -anp | grep -E "9000|9001"查看minio端口是否存在,如果不存在就下一步,如果端口还存活,就等待端口关闭后执行下一步

执行systemctl start minio启动minio服务,每台节点的minio服务要统一启动,不要依次启动

执行mc admin info $storage_Name查看是否有新池

截图为3节点4硬盘环境

缩容

#节点缩容

MinIO没有移除节点的方式,最简单的方式就是把移除节点的数据迁移走,然后所有节点的minio配置中删除移除节点的相关配置,所有节点(除移除节点)重启minio服务

#迁移数据,可加参数--overwrite覆盖写入
mc mirror $源桶 $目的桶

#也可以迁移至本地文件夹
mc mirror $源桶 $本地文件夹

#将本地文件夹中的备份数据迁移到新的MinIO服务器
mc mirror $本地文件夹 $源桶

#修改配置,删除要移除的节点
MINIO_VOLUMES="http://192.168.118.{161...164}:9000/minio{1...4} http://192.168.118.{165...168}:9000/minio{1...4}"

#重启MinIO
systemctl restart minio

#移除池

mc客户端提供了退役池的方式

#查看集群内所有存储池
mc admin decommission status $storage_Name

┌─────┬─────────────────────────────────────────────────┬───────────────────────┬────────┐
│ ID  │ Pools                                           │ Drives Usage          │ Status │
│ 1st │ http://192.168.86.{128...130}:9000/minio{1...4} │ 54.0% (total: 40 GiB) │ Active │
│ 2nd │ http://192.168.86.{131...133}:9000/minio{1...4} │ 46.5% (total: 40 GiB) │ Active │
└─────┴─────────────────────────────────────────────────┴───────────────────────┴────────┘

#2nd这个池是扩容进来的,现在进行退役操作
mc admin decommission start $storage_Name http://192.168.86.{131...133}:9000/minio{1...4}

#使用命令查看进度
mc admin decommission status $storage_Name
或者查看详细
mc admin decommission status $storage_Name http://192.168.86.{131...133}:9000/minio{1...4}

┌─────┬─────────────────────────────────────────────────┬───────────────────────┬──────────┐
│ ID  │ Pools                                           │ Drives Usage          │ Status   │
│ 1st │ http://192.168.86.{128...130}:9000/minio{1...4} │ 62.0% (total: 40 GiB) │ Active   │
│ 2nd │ http://192.168.86.{131...133}:9000/minio{1...4} │ 45.7% (total: 40 GiB) │ Draining │
└─────┴─────────────────────────────────────────────────┴───────────────────────┴──────────┘

#退役会把退役池的数据迁移至可用池

#可用池的可用空间大小必须大于退役池的已用空间大小,否则状态会Failed

#如果已经出现Failed,再次执行mc admin decommission start $storage_Name http://192.168.86.{131...133}:9000/minio{1...4}即可继续退役(迁移)

#当返回如下消息,即可开始删除pool操作
Decommission of pool http://192.168.86.{131...133}:9000/minio{1...4} is complete, you may now remove it from server command line

删除minio中的池配置,重启minio即可
MINIO_VOLUMES="http://192.168.118.{161...164}:9000/minio{1...4} http://192.168.118.{165...168}:9000/minio{1...4}" #删除退役池

#重启minio
systemctl restart minio

故障处理

#硬盘故障处理

MinIO支持使用新的硬盘替换故障硬盘(热替换)。 MinIO可以检测并修复这些硬盘,无需重启任何节点或部署级别。 MinIO修复仅发生在更换的硬盘上,并且在大多数情况下对部署性能的影响最小或可以忽略不计。

#卸载故障硬盘
umount /dev/sdb

替换故障硬盘,满足以下要求:

  • XFS格式并且为空
  • 相同类型驱动器(HDD、SSD、NVMe)
  • 等于或更高的性能
  • 等于或更大的容量

替换更大的硬盘不会增加minio的容量,只会以节点的最小硬盘为基准

#替换完后格式化新硬盘
mkfs.xfs -L /dev/sdb

更新fstab的UUID

在重新挂载驱动器后,使用mc admin logs命令或者对于使用 systemd管理的安装,使用journalctl -u minio命令来监控服务器日志输出。输出应包括标识每个已格式化和 清空驱动器的消息。

使用mc admin heal命令来监控部署上的整体修复状态。 MinIO会积极修复替换的驱动器,以确保从降级状态快速恢复。

#节点故障处理

如果替换的新节点IP与原故障节点IP不同,需修改/etc/hosts域名解析

拷贝minio与mc至新节点,配置必须对齐;照旧部署,使用mc admin logsjournalctl -u minio查看日志;使用mc admin heal命令来监控部署的整体修复状态。

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值