一、基础环境
本文档采用二进制进行MinIO分布式集群搭建,根据官方建议要求,生产环境至少四块硬盘,这样的话可以做到,挂掉一块硬盘集群依然可以读写,挂掉两块硬盘集群依然可读。在分布式模式下,MinIO将自动引用纠错码功能。
二、分布式模式搭建
1、准备机器资源
每台主机分配两块硬盘,一块作为系统盘,另一块作为Minio数据盘。分布式模式下,每个节点之间时间差不能超过3秒,你可以使用NTP服务来保证时间一致。
主机地址 | MINIO数据盘挂载路径 | 操作系统 |
---|---|---|
192.168.88.11 | /data/minio_data | CentOS 7.9 |
192.168.88.12 | /data/minio_data | CentOS 7.9 |
192.168.88.13 | /data/minio_data | CentOS 7.9 |
192.168.88.14 | /data/minio_data | CentOS 7.9 |
2、创建挂载路径
在每个节点上创建相同位置的挂载目录,把磁盘挂载到目录上,以便于管理。需要注意的是磁盘里必须是干净的,里面没有数据。
mkdir -p /data/minio_data
mount /dev/minio/data /data/mini_data
记得修改/etc/fstab
,开机自动挂载。
3、上传MinIO可执行文件
所有节点使用统一的目录存放MinIO可执行文件和启动脚本。
mkdir -p /opt/minio
首先需要去下载MINIO:https://dl.minio.io/server/minio/release/linux-amd64/minio。
将MinIO可执行文件上传到/opt/minio
。
4、创建启动脚本
相同的目录创建启动脚本start.sh
,脚本文件内容如下:
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio
/opt/minio/minio server \
http://192.168.88.11/data/minio_data \
http://192.168.88.12/data/minio_data \
http://192.168.88.13/data/minio_data \
http://192.168.88.14/data/minio_data
如果你是按照我说的,每个节点磁盘挂载在相同的目录,可以使用简洁的写法:
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio
/opt/minio/minio server \
http://192.168.88.{11...14}/data/minio_data
分布式MINIO里所有的节点需要有同样的ACCESS_KEY和SECRET_KEY,这样这些节点才能建立联接。为了实现这个,你需要在执行
minio server
命令之前,先将ACCESS_KEY和SECRET_KEY引入环境变量。另外别忘了需要赋予
minio
和start.sh
这两个文件可执行权限。chmod +x minio start.sh
5、编写Unit文件将Minio注册为服务
为了方便管理MinIO,创建服务文件/etc/systemd/system/minio.service
将MinIO注册为服务。
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/start.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
脚本编写完成后,执行下面的命令载入服务。
systemctl daemon-reload
6、启动集群
在所有节点上启动MinIO服务,并且配置为开机自动启动。
systemctl start minio.service
systemctl enable minio.service
7、访问集群
使用浏览器输入地址:http://任意节点IP:9000
,用户名和密码为前面设置的MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
,创建Bucket并上传文件测试。
常见的错误是Server not initialized, please try again
,说明集群没有搭建成功,很大可能是因为磁盘不干净,具体的就需要你去根据日志排错了。
8、使用Nginx做负载均衡
在每个节点上配置Nginx,对外统一入口,还可以配合KeepAlived做高可用,不在本文讨论范畴内,自行了解。
upstream minio{
server 192.168.88.11:9000;
server 192.168.88.12:9000;
server 192.168.88.13:9000;
server 192.168.88.14:9000;
}
server {
listen 9000;
server_name minio;
location / {
proxy_pass http://minio;
proxy_set_header Host $http_host;
client_max_body_size 20480m;
}
}
三、MinIO联邦模式的部署
正式的生产环境中,需要提前考虑扩容的问题。常见的扩容方式有两种:水平扩容和垂直扩容。水平扩容是指通过增加节点数量来扩展系统性能;而垂直扩容则指提升各节点自身的性能,例如添加磁盘。但是Minio官方并不支持这样的做法。MinIO主要支持两种水平方式的扩容:对等扩容和联邦扩容。
对等扩容需要新增与现有集群相同数量的节点和硬盘,局限性很大,并且MinIO建议的集群最大节点数量不能超过32个,这也是为了集群性能和稳定性考虑。
所以,比较好的选择就是采用联邦扩容的方式。通过引入etcd,将多个MinIO集群在逻辑上组成一个联邦,对外以一个整体提供服务。联邦扩容相比较对等扩容,有如下的优点:
- 组成联邦的各个集群不要求节点数和磁盘数的对等
- 联邦可以通过加入新的集群实现无限扩容
- 组成联邦的集群中,如果有部分集群出现故障,并不会影响其他集群的正常工作
如果要说联邦扩容的缺点,那就是需要引入etcd,配置较为复杂。但这算MinIO的缺点么?不,这是我们运维的缺点!手动Doge。
下面将介绍联邦扩容的配置方法,我在这里建议,在第一次搭建MinIO集群的时候,即使只有一个集群,也要引入etcd,方便以后扩容。
1、资源分配
我们假定正式环境中,先创建了一个MinIO集群,并且引入etcd。而后又有了扩容的需求,需要向联邦中添加新一个的集群。
etcd集群
etcd是一个开源的分布式键值对存储服务,在联邦中用于记录bucket的IP地址,联邦内的各个集群的数据存储以及一致性维护仍然由各个集群自行管理,联邦只是对外提供一个整体逻辑视图。通过连接到联邦中任一集群的任一节点,可以查询并访问联邦内所有集群的全部数据。
当一个应用访问MinIO的时候,联邦通过etcd定位到bucket实际所在的集群,在进行数据访问,联邦对外屏蔽了bucket的IP查找和定位过程,在逻辑上形成统一的整体提供服务。你可以理解为etcd实现了类似路由寻址的功能。
为了避免单点故障,etcd集群建议配置为三个节点。
Name | IP |
---|---|
etcd1 | 192.168.88.100 |
etcd2 | 192.168.88.101 |
etcd3 | 192.168.88.102 |
MinIO集群1
首次创建的集群为4个节点,4块硬盘。
Host | Address | Disk |
---|---|---|
minio1 | 192.168.88.11 | /data/minio_data |
minio2 | 192.168.88.12 | /data/minio_data |
minio3 | 192.168.88.13 | /data/minio_data |
minio4 | 192.168.88.14 | /data/minio_data |
MinIO集群2
第二次创建的,用于扩容的集群为2个节点,4块硬盘。
Host | Address | Disk |
---|---|---|
minio1 | 192.168.88.20 | /data/minio_data{1...2} |
minio2 | 192.168.88.21 | /data/minio_data{1...2} |
2、etcd集群部署
CentOS可直接使用Yum进行安装,这里也以此为例。没有网络的环境下,也可以下载etcd发行版或者RPM包进行手动安装。
yum install -y etcd
修改配置文件/etc/etcd/etcd.conf
,以etcd1为例。
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="etcd1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.100:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.100:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.100:2380,etcd2=http://192.168.101:2380,etcd3=http://192.168.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_DATA_DIR=数据存放位置
ETCD_LISTEN_PEER_URLS=监听的etcd节点URL,最好是指填写本集群内的所有节点,0.0.0.0表示监听全部地址
ETCD_LISTEN_CLIENT_URLS=监听的客户端URLs,最好填写MinIO集群的地址,只允许MinIO访问,但是考虑到未来扩容,这里监听全部
ETCD_NAME=etcd节点的名称,需要唯一ETCD_INITIAL_ADVERTISE_PEER_URLS=广播节点URL
ETCD_ADVERTISE_CLIENT_URLS=广播客户端URL
ETCD_INITIAL_CLUSTER=集群内所有节点
ETCD_INITIAL_CLUSTER_TOKEN=令牌,每个节点需要相同
ETCD_INITIAL_CLUSTER_STATE=集群状态
所有的节点都进行上述配置。参数ETCD_INITIAL_CLUSTER
填写的节点信息,必须与各节点上配置的ETCD_NAME
参数以及ETCD_INITIAL_ADVERTISE_PEER_URLS
参数进行对应。
配置完成后,在各节点启动etcd。
systemctl start etcd
systemctl enable etcd
在任意一个节点上,输入如下命令查看集群状态。
etcdctl member list
应该能看到有三个节点,说明集群运行正常。
3、使用联邦模式配置MinIO集群1
MinIO单个集群的部署按照之前的步骤自行部署,这里不再赘述。唯一不同的是启动MinIO集群的脚本需要添加如下配置。所以我想聪明的你一定能想到,可以只接修改之前的集群来支持联邦模式,只不过这样需要重启整个集群,这在生产环境中是非常不方便的。所以还是建议,在一开始就配置好。
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=test@minio
export MINIO_ETCD_ENDPOINTS="http://192.168.88.100:2379,http://192.168.88.101:2379,http://192.168.88.102:2379"
export MINIO_PUBLIC_IPS=192.168.88.11,192.168.88.12,192.168.88.13,192.168.88.14
export MINIO_DOMAIN=cluster1.minio.com
/opt/minio/minio server http://192.168.88.{11...14}/data/minio_data
注意:MINIO_ETCD_ENDPOINTS
参数需与搭建的ETCD集群所有节点IP相对应;MINIO_PUBLIC_IPS
参数则为该集群的所有节点IP;MINIO_DOMAIN
参数必须进行配置,即使你并不通过域名访问存储桶,否则联邦无法生效,只有MINIO_DOMAIN
参数值相同的集群,才会组成联盟。
4、将MinIO集群2加入联邦
集群2中的各个节点进行同样的配置,启动后,进行如下测试。
- 首先连接至集群1中的任一节点,创建Bucket,名称自定义,上传一个对象。
- 连接至任一etcd节点,通过
ETCDCTL_API=3 etcdctl get --from-key ''
命令查看etcd中是否已经写入刚刚创建的Bucket的相关记录 - 最后连接至集群2中的任一节点,查看能否访问到刚刚在集群1中创建的Bucket以及上传的对象。
如果一切正常,说明联邦模式创建成功。
5、后续的扩容
后续若需进行扩容,只需要将新创建的集群,加入现有的etcd服务,这些集群将自动加入联邦,从而实现集群的无限扩展。
最后我还是建议优先考虑联邦扩容,并且首次进行单个集群部署时就引入etcd联邦模式,这样后续进行联邦扩容时能简化很多流程。
除非你真的确定,比如原集群节点数和磁盘数较少、系统数据量增长较慢、后续扩容操作不频繁、服务可中断的情况下,可考虑对等扩容
6、其他
为了安全,生产可能需要关闭自带的浏览器,在配置文件添加参数。
MINIO_BROWSER=off
2022-02-23 经常有人加我好友,问我说按照我的步骤没法成功,可能因为版本更新了吧,大家可以去官网看看文档,照着文档部署试试看。也许ETCD已经被弃用了。
参考资料
[1] MinIO官网:https://min.io/
[2] MinIO中文官网:http://www.minio.org.cn/
[3] MinIO白皮书:http://www.cloudbin.cn/?p=2917
[4] ETCD官网:https://etcd.io/