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_KEY
和MINIO_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管理页面.