简介:
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-1 | CentOS7.9 | 192.168.118.161 | 4*5G |
MinIO-2 | CentOS7.9 | 192.168.118.162 | 4*5G |
MinIO-3 | CentOS7.9 | 192.168.118.163 | 4*5G |
MinIO-4 | CentOS7.9 | 192.168.118.164 | 4*5G |
Nginx | CentOS7.9 | 192.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 logs
或journalctl -u minio
查看日志;使用mc admin heal
命令来监控部署的整体修复状态。