MinIO介绍
MinIO 是一个高性能的对象存储,且原生支持 Kubernetes 部署的解决方案。
分布式 Minio 可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障。
Minio 分布式模式可以搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
MinIO具有以下特点
1、数据保护
分布式 Minio 采用纠删码(erasure code)来防范多个节点宕机和位衰减(bit rot)。
分布式 Minio 至少需要 4 个节点,使用分布式 Minio 就自动引入了纠删码功能。
纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。
纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 Minio 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。 Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复的。Minio 纠删码的设计目标是为了性能和尽可能地使用硬件加速。
位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。
2、高可用
单机 Minio 服务存在单点故障,但如果是一个 N 节点的分布式 Minio ,只要有 N/2 节点在线,你的数据就是安全的。不过至少需要有 N/2+1 个节点来创建新的对象。
例如,一个 8 节点的 Minio 集群,每个节点一块盘,就算 4 个节点宕机,这个集群仍然是可读的,不过你需要 5 个节点才能写数据。
3、限制
分布式 Minio 单租户存在最少 4 个盘最多 16 个盘的限制(受限于纠删码)。这种限制确保了 Minio 的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。
注意,只要遵守分布式 Minio 的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用 2 个节点,每个节点 4 块盘,也可以使用 4 个节点,每个节点两块盘,诸如此类。
4、一致性
Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型。
5、分布式集群
启动一个分布式 Minio 实例,你只需要把硬盘位置作为参数传给 minio server 命令即可,然后,你需要在所有其它节点运行同样的命令。
注意
- 分布式 Minio 所有的节点需要有同样的 access 秘钥和 secret 秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行 minio server 命令之前,先将 access 秘钥和 secret 秘钥 export 成环境变量。
- 分布式 Minio 使用的磁盘必须是干净的,里面没有数据。
- 分布式 Minio 的节点时间差不能超过15分钟,可以使用 NTP 来保证时间一致。
- 在 Windows 下运行分布式 Minio 处于实验阶段,不建议用于生产环境。
参考架构设计:
NTP安装
1、每台机器上安装ntp
# yum install ntp
2、配置NTP Server
选择其中一台做NTP Server,修改/etc/ntp.conf
# cat /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
restrict 10.10.0.0 mask 255.255.0.0 nomodify notrap #添加允许时间同步的网段
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
server 127.127.1.0 minpoll 4 #如果以上时间服务器不可用,实用本机提供的时间
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
3、配置NTP Client
其他机器做NTP Client,修改/etc/ntp.conf,增加NTP Server的IP
# vim /etc/ntp.conf
server 10.10.10.80
4、启动NTP服务
在所有节点启动NTP服务
# systemctl start ntpd.service && systemctl enable ntpd.service
安装golang
从源码安装MinIO需要golang 1.13以上版本
# yum -y install epel-release -y
# yum install golang -y
###设置GO为国内代理###
# go env -w GO111MODULE=on
# go env -w GOPROXY=
安装MinIO
编译MinIO
# git clone
# cd minio
# make
####将编译的二进制文件minio复制到所有节点的/usr/local/bin目录下###
# cp minio /usr/local/bin/
####以下操作在所有节点执行
# mkdir -p /data/node{1,2}
# useradd minio -s /sbin/nologin
# chown -R minio:minio /data/node*
设置MinIO Server为服务
# mkdir /etc/minio
# chown -R minio:minio /data/node*
# cat >/etc/minio/minio.conf<<'EOF'
MINIO_ACCESS_KEY=admin
MINIO_SECRET_KEY=admin123
MINIO_PORT=9000
MINIO_CONF_DIR=/etc/minio/instance1
MINIO_VOLUMES=" \
\
#34;
EOF
# cat >/etc/systemd/system/minio.service<<'EOF'
[Unit]
Description=MinIO Service
Documentation=
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
User=minio
Group=minio
EnvironmentFile=/etc/minio/minio.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_ACCESS_KEY}\" ]; then echo \"Variable MINIO_ACCESS_KEY not set in /etc/default/minio\"; exit 1; fi"
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_SECRET_KEY}\" ]; then echo \"Variable MINIO_SECRET_KEY not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server --config-dir $MINIO_CONF_DIR --address :${MINIO_PORT} $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
EOF
# systemctl daemon-reload
# systemctl start minio
# systemctl enable minio
# systemctl status minio -l
● minio.service - MinIO Service
Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-08-04 14:26:22 CST; 2min 49s ago
Docs:
Main PID: 8939 (minio)
CGroup: /system.slice/minio.service
└─8939 /usr/local/bin/minio server --config-dir /etc/minio/instance1 --address :9000
Aug 04 14:26:27 k8smaster minio[8939]: Status: 8 Online, 0 Offline.
Aug 04 14:26:27 k8smaster minio[8939]: Endpoint:
Aug 04 14:26:27 k8smaster minio[8939]: Browser Access:
Aug 04 14:26:27 k8smaster minio[8939]:
Aug 04 14:26:27 k8smaster minio[8939]: Object API (Amazon S3 compatible):
Aug 04 14:26:27 k8smaster minio[8939]: Go:
Aug 04 14:26:27 k8smaster minio[8939]: Java:
Aug 04 14:26:27 k8smaster minio[8939]: Python:
Aug 04 14:26:27 k8smaster minio[8939]: JavaScript:
Aug 04 14:26:27 k8smaster minio[8939]: .NET:
注:如果你使用普通用户启动minio且使用小于1024的端口,则应在minio.service中添加下面内容
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
WorkingDirectory=/usr/local/
其他系统的minio服务脚本参考 :
安装MinIO Client
编译安装MC
# git clone
# cd mc
###将编译好的mc执行文件复制到/usr/local/bin目录下
# cp mc /usr/local/bin/
###启用mc命令自动补全
# mc --autocompletion
说明:mc的配置文件默认存在在用户HOME目录下的.mc文件夹
MC配置
MinIO Client 添加一个MinIO存储主机
# mc config host add myminio1 admin admin123
说明:myminio1是别名
查看已添加的主机
# mc config host list
gcs
URL :
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v2
Path : dns
local
URL :
AccessKey :
SecretKey :
API :
Path : auto
myminio1
URL :
AccessKey : admin
SecretKey : admin123
API : s3v4
Path : auto
play
URL :
AccessKey : Q3AM3UQ867SPQQA43P2F
SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
API : S3v4
Path : auto
s3
URL :
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v4
Path : dns
查看添加的主机信息
# mc admin info myminio1
● 10.10.10.81:9000
Uptime: 25 minutes
Version: <development>
Network: 3/3 OK
Drives: 2/2 OK
● 10.10.10.82:9000
Uptime: 25 minutes
Version: <development>
Network: 3/3 OK
Drives: 2/2 OK
● 10.10.10.80:9000
Uptime: 31 minutes
Version: <development>
Network: 3/3 OK
Drives: 2/2 OK
6 drives online, 0 drives offline
MinIO Client端通过mc创建一个bucket
# mc mb myminio1/new-bucket-make-by-mc80
查看bucket
# mc ls myminio1
[2020-08-03 16:22:04 CST] 0B new-bucket-make-by-mc80/
或者浏览器查看
设置创建的bucket属性,public为设置为可读写
# mc policy set public myminio1/new-bucket-make-by-mc80
Access permission for `myminio1/new-bucket-make-by-mc80` is set to `public`
可设置的策略有:[none, download, upload, public]
从MinIO Client上传一个文件到新建的bucket
# mc cp /usr/local/src/FSCapture93.zip myminio1/new-bucket-make-by-mc80
...rc/FSCapture93.zip: 5.40 MiB / 5.40 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 34.13 MiB/s 0s
从MinIO Server 下载文件到本地
# mc cp myminio1/bucket1/xiaoai-master.zip /usr/local/src/
.../xiaoai-master.zip: 13.15 MiB / 13.15 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.30 MiB/s 0s
验证
登录另外两个节点
从上面看到我们的集群是正产的
我们停止81上的minio,查看集群是否正常
上传文件正常
再停止82上的minio,minio工作不正常了。
我们有3个节点,每个节点2块磁盘,所以允许最大的故障磁盘为3×2/2 -1,即2块磁盘,即1个节点
集群扩展
MinIO 不支持传统分布式存储的一个标配功能:横向扩容。
MinIO 同样具有横向扩展能力,只是它走了另一条路, 他们巧妙的将一个已经被公认为分布式存储自身的复杂问题,变成了一个部署问题。简单的说,就是如果要扩容,就再增加新的独立的集群,业务方自行决定使用具体哪一个集群。
关于扩展: