Minio基本介绍

1 Minio

MinIO是一个用Golang开发的开源分布式对象存储服务

特性:

  • 兼容亚马逊S3云存储服务接口
  • 非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等
  • 使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和数据损坏

分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。

分布式Minio特性:

  • 数据保护: 采用纠错码erasure code防止多节点或者驱动器异常,采用bit rot来进行数据保护。一个分布式的Minio集群最小需要4块盘(其实是纠错码要求最小4块)来驱动整个集群,当我们启动分布式集群后,纠错码会自动启动

  • 高可用: 多节点组成的分布式minio可保证服务的高可用(一个N节点的分布式Minio,只要有N/2节点在线,你的数据就是安全的。不过你需要至少有N/2+1个节点才能创建新的对象。)

  • 一致性保障: MinIO在所有的IO操作中都严格遵循read-after-write和list-after-write一致性模型

2 Minio启动

2.1 纠错码模式运行Minio

# 使用二进制方式运行有12个驱动器的minio服务
$ minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8 /data9 /data10 /data11 /data12

# 使用docker方式运行有8驱动器的minio服务
$ docker run -p 9000:9000 --name minio \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

以纠错码方式运行服务后,你就可以尝试将任意一半盘毁坏,依然不会影响整个系统的IO。但是如果要求不影响写,处于正常的的驱动器个数必须大于N/2

2.2 分布式MinIO集群运行

想要运行一个分布式的MinIO集群,你只需要将驱动器的位置参数传给minio指令即可,然后需要在全部节点运行相同的命令。

注意事项

  • 所有的节点需要有相同的access key 和 secret key,推荐在启动之前使用MINIO_ACCESS_KEYMINIO_SECRET_KEY变量来共享key
  • MinIO创建一组4, 6, 8, 10, 12, 14 or 16个驱动器的纠错码,因此提供的驱动数量必须是前面数字的倍数
  • MinIO会选择给定驱动中,较大的一个EC集合,比如8个驱动将会使用一个大小为8的EC集,而不是两个大小为4的EC集
  • 每一个对象都会写到一个EC集中,因此对象的分布不可能超过16个驱动
  • MinIO集群中的所有节点应该是同构的(比如:相同的OS,相同的磁盘和相同的网络架构)
  • MinIO分布式模式需要fresh directories(即干净的目录),如果需要可以和其他应用程序共享驱动器(使用子目录的方式)
  • 运行分布式MinIO实例的服务器之间的间隔应该小于15分钟,你可以使用NTP服务来保证服务器时间同步
  • MINIO_DOMAIN环境变量应该被定义成bucket DNS样式的支持(可以给每个bucket设置子域名)
  • Windows上的分布式集群是实验性的,需要谨慎

以1个驱动器的4节点来组成集群:

# tree -L 1 /opt/app/
/opt/app/
├── minio
├── minio.conf

$ cat minio.conf
MINIO_ACCESS_KEY=BGBiao
MINIO_SECRET_KEY=BGBiao
ENDPOINTS="http://10.0.0.148:9000/data/minio http://172.16.62.149:9000/data/minio http://172.16.62.150:9000/data/minio http://172.16.62.151:9000/data/minio"

$ cat /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio
Documentation=https://docs.minio.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/opt/app/minio

[Service]
EnvironmentFile=-/opt/app/minio.conf
ExecStart=/opt/app/minio server $ENDPOINTS

# 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


# 将上述配置同步到4个节点,并启动,minio实例之间会自行发现各个节点
$ systemctl restart minio

3 Minio使用

当使用前面的方式成功运行minio的对象服务后,我们就可以使用以下几种方式进行访问:

  • web: 默认我们可以访问实例的9000端口,通过access key和secret key进行访问实例
  • mc: 使用minio官方提供的兼容s3的客户端
  • aws-cli: 使用aws的客户端命令
  • s3cmd: 使用3s的开源客户端执行
  • minio-go: 使用minio的golang客户端操作集群

注意: 当我们成功运行minio服务后,默认会提供一个简单的web管理页面.

4 参考

开源分布式对象存储-MinIO

往年同期文章