分布式 MinIO 可以让你将多块硬盘(甚至在不同的机器上、或不同机房的机器)组成一个对象存储服务(OSS,Object Storage Service)。由于硬盘分布在不同的节点上,分布式 MinIO 避免了单点故障。
在大数据领域,通常的设计理念都是无中心和分布式。MinIO 分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
分布式 MinIO 采用纠删码来防范多个节点宕机和位衰减 bit rot。
分布式 MinIO 至少需要4个硬盘,使用分布式 MinIO 自动引入了纠删码功能。
单机 MinIO 服务存在单点故障,相反,如果是一个有 N 块硬盘的分布式 MinIO,只要有 N/2 硬盘在线,你的数据就是安全的。不过你需要至少有 N/2+1 个硬盘来创建新的对象。
例如:一个 16 节点的 MinIO 集群,每个节点 16 块硬盘,就算 8 台服务器宕机,这个集群仍然是可读的,不过你需要 9 台服务器才能写数据。
注意:只要遵守分布式 MinIO 的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。
MinIO 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write(先写后读) 一致性模型。
在前面章节已经介绍了如 MinIO 单机模式的搭建,MinIO 分布式搭建的流程和单机模式基本一致。MinIO 服务基于命令行传入的参数自动切换成单机模式还是分布式模式。
MinIO 分布式模式只需要把硬盘位置做为参数传给 minio server 命令即可;然后,你需要在所有其它节点运行同样的命令。
注意:
分布式 MinIO 里所有的节点需要有同样的 Access key 和 Secret key,这样这些节点才能建立联接。你需要在执行 minio server 命令之前,先将 Access key 和 Secret key 使用 export 导成环境变量。
分布式 MinIO 使用的磁盘里必须是空磁盘,不能存在任何其他文件或数据。
分布式 MinIO 里的节点时间差不能超过3秒,你可以使用 NTP 来保证时间一致。
Windows下的分布式 MinIO 还处于实验阶段,不建议使用于生产环境。
启动分布式 MinIO 实例,4个节点,每节点1块盘,需要在4个节点上都运行下面的命令。
Linux 和 macOS
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=mypassword export MINIO_PROMETHEUS_AUTH_TYPE="public" export MINIO_DOMAIN=hxstrive.com ./minio server http://192.168.31.201/export1 \ http://192.168.31.202/export2 \ http://192.168.31.203/export3 \ http://192.168.31.204/export4
注意:在 Linux 系统中,如果使用 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 环境变量将得到如下告警信息:
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated. Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
推荐使用 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 替换 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY。
Windows
set MINIO_ACCESS_KEY=root set MINIO_SECRET_KEY=mypassword set MINIO_PROMETHEUS_AUTH_TYPE="public" set MINIO_DOMAIN=hxstrive.com minio.exe server http://192.168.31.201/D:/data ^ http://192.168.31.202/D:/data ^ http://192.168.31.203/D:/data ^ http://192.168.31.204/D:/data
注意,在 minio server 后面指定的服务器地址必须是大于等于4的偶数,否则将抛出如下错误:
ERROR Invalid command line arguments: Incorrect number of endpoints provided [http://192.168.31.11/D:/data http://192.168.31.12/D:/data http://192.168.31.13/D:/data] > Please provide an even number of endpoints greater or equal to 4 HINT: For more information, please refer to https://docs.min.io/docs/minio-erasure-code-quickstart-guide
在 Linux 上面运行上面实例,运行效果如下图:
使用浏览器访问任意一个服务器的 9000 端口,创建桶,删除文件。然后查看结果,如下图:
启动分布式 MinIO 实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令。
GNU/Linux 和 macOS
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=mypassword export MINIO_PROMETHEUS_AUTH_TYPE="public" export MINIO_DOMAIN=hxstrive.com ./minio server http://192.168.31.201/export1 http://192.168.31.201/export2 \ http://192.168.31.201/export3 http://192.168.31.201/export4 \ http://192.168.31.202/export1 http://192.168.31.202/export2 \ http://192.168.31.202/export3 http://192.168.31.202/export4 \ http://192.168.31.203/export1 http://192.168.31.203/export2 \ http://192.168.31.203/export3 http://192.168.31.203/export4 \ http://192.168.31.204/export1 http://192.168.31.204/export2 \ http://192.168.31.204/export3 http://192.168.31.204/export4
Windows
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=mypassword export MINIO_PROMETHEUS_AUTH_TYPE="public" export MINIO_DOMAIN=hxstrive.com minio.exe server http://192.168.31.201/C:/data1 http://192.168.31.201/C:/data2 ^ http://192.168.31.201/C:/data3 http://192.168.31.201/C:/data4 ^ http://192.168.31.202/C:/data1 http://192.168.31.202/C:/data2 ^ http://192.168.31.202/C:/data3 http://192.168.31.202/C:/data4 ^ http://192.168.31.203/C:/data1 http://192.168.31.203/C:/data2 ^ http://192.168.31.203/C:/data3 http://192.168.31.203/C:/data4 ^ http://192.168.31.204/C:/data1 http://192.168.31.204/C:/data2 ^ http://192.168.31.204/C:/data3 http://192.168.31.204/C:/data4
例如我们是通过区的方式启动 MinIO 集群,命令行如下:
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=mypassword export MINIO_PROMETHEUS_AUTH_TYPE="public" export MINIO_DOMAIN=hxstrive.com minio server http://host{1...32}/export{1...32}
MinIO 支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
export MINIO_ROOT_USER=root export MINIO_ROOT_PASSWORD=mypassword export MINIO_PROMETHEUS_AUTH_TYPE="public" export MINIO_DOMAIN=hxstrive.com minio server http://host{1...32}/export{1...32} http://host{33...64}/export{1...32}
现在整个集群就扩展了1024个磁盘,总磁盘变为2048个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。
如上面命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。
说明:您添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余SLA。例如,第一个区有8个磁盘,您可以将集群扩展为16个、32个或1024个磁盘的区域,您只需确保部署的SLA是原始区域的倍数即可。