高可用分布式对象存储,MinIO 轻松实现。java
上一篇文章介绍了使用对象存储工具 MinIO 搭建一个优雅、简单、功能完备的静态资源服务,可见其操做简单,功能完备。但因为是单节点部署,不免会出现单点故障,没法作到服务的高可用。MinIO 已经提供了分布式部署的解决方案,实现高可靠、高可用的资源存储,一样的操做简单,功能完备。本文将对 MinIO 的分布式部署进行描述,主要分如下几个方面:nginx
分布式存储的可靠性spring
MinIO 的分布式的存储机制shell
分布式部署实践json
分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,通常对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。springboot
冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,便可使用备分内容进行恢复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但须要的设备就越多,成本就越高。可靠性是容许丢失其中一份数据。当前已有不少分布式系统是采用此种方式实现,如 Hadoop 的文件系统(3个副本),Redis 的集群,MySQL 的主备模式等。服务器
校验法即经过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个做用,一个校验,经过对数据进行校验和( checksum )进行计算,能够检查数据是否完整,有无损坏或更改,在数据传输和保存时常常用到,如 TCP 协议;二是恢复还原,经过对数据结合校验码,经过数学计算,还原丢失或损坏的数据,能够在保证数据可靠的前提下,下降冗余,如单机硬盘存储中的 RAID 技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。网络
在部署分布式 MinIO 前,须要对下面的概念进行了解:负载均衡
MinIO 使用纠删码机制来保证高可靠性,使用 highwayhash 来处理数据损坏( Bit Rot Protection )。关于纠删码,简单来讲就是能够经过数学计算,把丢失的数据进行还原,它能够将n份原始数据,增长m份数据,并能经过n+m份中的任意n份数据,还原为原始数据。即若是有任意小于等于m份的数据失效,仍然能经过剩下的数据还原出来。举个最简单例子就是有两个数据(d1, d2),用一个校验和y(d1 + d2 = y
)便可保证即便丢失其中一个,依然能够还原数据。如丢失 d1 ,则使用 y - d2 = d1
还原,同理,d2 丢失或者y丢失,都可经过计算得出。分布式
EC 的具体应用实现中, RS(Reed-Solomen)是 EC 的一种更简单快捷的实现,能够经过矩阵运算,还原数据。MinIO 将对象拆分红N/2数据和N/2 校验块 。具体的数学矩阵运算及证实,能够参考文章《Erasure-Code-擦除码-1-原理篇》及《EC纠删码原理》。
文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目录,文件名称下是 part.1 和 xl.json,前者是编码数据块及检验块,后者是元数据文件。若有4个磁盘,当文件上传后,会有2个编码数据块,2个检验块,分别存储在4个磁盘中。以下图,bg-01.jpg
是上传的文件对象:
在启动 MinIO 时,若传入参数是多个目录,则会以纠删码的形式运行,即具有高可靠性意义。即在一个服务器(单节点)上对,多个磁盘上运行 MinIO。
运行命令也很简单,参数传入多个目录便可:
MINIO_ACCESS_KEY=${ACCESS_KEY} MINIO_SECRET_KEY=${SECRET_KEY} nohup ${MINIO_HOME}/minio server --address "${MINIO_HOST}:${MINIO_PORT}" /opt/min-data1 /opt/min-data2 /opt/min-data3 /opt/min-data4 > ${MINIO_LOGFILE} 2>&1 &
注意替换命令中的变动,运行后输出信息以下:
可见 MinIO 会建立一个1个 set,set 中有4个 drive ,其中它会提示一个警告,提示一个节点的 set 中存在多于2个的drive,若是节点挂掉,则数据都不可用了,这与 EC 码的规则一致。
为了防止单点故障,分布式存储天然是须要多节点部署,以达到高可靠和高可用的能力。MinIO 对于多节点的部署,也是在启动时经过指定有 Host 和端口的目录地址,便可实现。下面在单台机器上,经过不一样的端口模拟在4台机器节点上运行,存储目录依然是 min-data14,而对应的端口是90019004。脚本以下:
RUNNING_USER=root MINIO_HOME=/opt/minio MINIO_HOST=192.168.222.10 #accesskey and secretkey ACCESS_KEY=minio SECRET_KEY=minio123 for i in {01..04}; do START_CMD="MINIO_ACCESS_KEY=${ACCESS_KEY} MINIO_SECRET_KEY=${SECRET_KEY} nohup ${MINIO_HOME}/minio server --address "${MINIO_HOST}:90${i}" http://${MINIO_HOST}:9001/opt/min-data1 http://${MINIO_HOST}:9002/opt/min-data2 http://${MINIO_HOST}:9003/opt/min-data3 http://${MINIO_HOST}:9004/opt/min-data4 > ${MINIO_HOME}/minio-90${i}.log 2>&1 &" su - ${RUNNING_USER} -c "${START_CMD}" done
本示例中,minio 的启动命令运行了4次,至关于在四台机器节点上都分别运行一个minio实例,从而模拟四个节点。运行结果以下:
查看进程ps -ef |grep minio
:
运行起来后,使用 http://${MINIO_HOST}:9001
到http://${MINIO_HOST}:9004
都可以访问到 MinIO 的使用界面。
前面单独对每一个节点进行访问显然不合理,经过使用 nginx 代理,进行负载均衡则颇有必要。简单的配置以下:
upstream http_minio { server 192.168.222.10:9001; server 192.168.222.10:9002; server 192.168.222.10:9003; server 192.168.222.10:9004; } server{ listen 8888; server_name 192.168.222.10; ignore_invalid_headers off; client_max_body_size 0; proxy_buffering off; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; proxy_connect_timeout 300; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_ignore_client_abort on; proxy_pass http://http_minio; } }
其中主要是 upstream 及 proxy_pass 的配置。如此,便可使用http://${MINIO_HOST}:8888
进行访问。
对于分布式存储,高可靠必是首要考虑的因素,MinIO 已经提供了分布式部署的解决方案,实现高可靠、高可用的资源存储。本文对可靠性的实现方法进行描述,探讨了 MinIO 的存储机制,并经过脚本模拟实践 MinIO 的分布式部署,但愿对你们有帮助。
https://min.io/
https://docs.min.io/
https://mp.weixin.qq.com/s/MzA4ODg0NDkzOA==&mid=2247487119&idx=1&sn=6e09abb32392e015911be3a1d7f066e5&source=41
https://www.jianshu.com/p/3e81b87d5b0b
https://tonybai.com/2020/03/16/build-high-performance-object-storage-with-minio-part1-prototype
个人公众号(搜索Mason技术记录
),获取更多技术记录: