一、前言
1.1 项目场景
附件微服务多节点分布式部署实现
1.2 问题描述
分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。
而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。好在这些问题已经有相关中间件给我们解决了。
Minio就是这样的一个中间件,同类型的还有FastDfs等。但是FastDfs部署较为复杂,所以我采用的Minio。
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
冗余
冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如Hadoop 的文件系统(3个副本),Redis 的集群,MySQL 的主备模式等。校验
校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如 TCP协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID 技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。
二、集群部署(无容器)
2.1 下载minio服务
2.2 前期准备
minio分布式部署最少要求4个存储,资源限制,我采用了两台服务器双盘存储。
服务器:172.-.-.252,172.-.-.126
1、创建存储空间:
# 172.*.*.252mkdir datacd datamkdir export1mkdir export2# 172.*.*.126mkdir datacd datamkdir export3mkdir export4
这样两台服务器的附件对象存储位置就设置好了。
2、 服务处理:分别上传下载好的服务到 /usr/local/minio/bin,并添加执行权限
cd /usr/local/minio/bin# 添加执行权限chmod +x minio
2.3 服务启动
分别在两台服务器上启动服务。当第一台服务器启动时,日志会打印寻找另一台服务器的日志,此时只要启动第二台服务器后,两个节点相互找到后就启动成功啦。
cd /usr/local/minio/bin# 设置用户名密码,两台服务器需要一致export MINIO_ACCESS_KEY=adminexport MINIO_SECRET_KEY=admin123# 直接启动./minio server http://172.*.*.252/data/export1 http://172.*.*.252/data/export2 http://172.*.*.126/data/export3 http://172.*.*.126/data/export4# 后台启动nohup ./minio server http://172.*.*.252/data/export1 http://172.*.*.252/data/export2 http://172.*.*.126/data/export3 http://172.*.*.126/data/export4 &

2.4 服务验证
服务端验证:
ps -ef|grep minio

客户端验证:
浏览器查看:http://172.-.-.252:9000/,直接在浏览器上上传下载进行测试
2.5 存储形式
文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目录,文件名称下是 part.1 和 xl.json,前者是编码数据块及检验块,后者是元数据文件。如有4个磁盘,当文件上传后,会有2个编码数据块,2个检验块,分别存储在4个磁盘中。如下图,bg-01.jpg 是上传的文件对象:

2.6 nginx 负载均衡
前面单独对每个节点进行访问显然不合理,通过使用 nginx 代理,进行负载均衡则很有必要。简单的配置如下:
upstream http_minio {server 172.-.-.252:9000;server 172.-.-.126:9000;}server{listen 8991;server_name localhost;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_set_header Host $http_host;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 进行访问。
三、单机部署
与集群部署不同点:
- 启动脚本 nohup ./minio server /data/minio/ &
- 单机服务器不同于集群部署,需要最4个存储,单存储就可以

