七叶笔记 » golang编程 » 高性能对象存储系统MinIO部署

高性能对象存储系统MinIO部署

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 命令即可,然后,你需要在所有其它节点运行同样的命令。

注意

  1. 分布式 Minio 所有的节点需要有同样的 access 秘钥和 secret 秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行 minio server 命令之前,先将 access 秘钥和 secret 秘钥 export 成环境变量。
  2. 分布式 Minio 使用的磁盘必须是干净的,里面没有数据。
  3. 分布式 Minio 的节点时间差不能超过15分钟,可以使用 NTP 来保证时间一致。
  4. 在 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 同样具有横向扩展能力,只是它走了另一条路, 他们巧妙的将一个已经被公认为分布式存储自身的复杂问题,变成了一个部署问题。简单的说,就是如果要扩容,就再增加新的独立的集群,业务方自行决定使用具体哪一个集群。

关于扩展:

相关文章