一、前言

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服务

minio

2.2 前期准备

minio分布式部署最少要求4个存储,资源限制,我采用了两台服务器双盘存储。

服务器:172.-.-.252,172.-.-.126

1、创建存储空间:

  1. # 172.*.*.252
  2. mkdir data
  3. cd data
  4. mkdir export1
  5. mkdir export2
  6. # 172.*.*.126
  7. mkdir data
  8. cd data
  9. mkdir export3
  10. mkdir export4

这样两台服务器的附件对象存储位置就设置好了。

2、 服务处理:分别上传下载好的服务到 /usr/local/minio/bin,并添加执行权限

  1. cd /usr/local/minio/bin
  2. # 添加执行权限
  3. chmod +x minio

2.3 服务启动

分别在两台服务器上启动服务。当第一台服务器启动时,日志会打印寻找另一台服务器的日志,此时只要启动第二台服务器后,两个节点相互找到后就启动成功啦。

  1. cd /usr/local/minio/bin
  2. # 设置用户名密码,两台服务器需要一致
  3. export MINIO_ACCESS_KEY=admin
  4. export MINIO_SECRET_KEY=admin123
  5. # 直接启动
  6. ./minio server http://172.*.*.252/data/export1 http://172.*.*.252/data/export2 http://172.*.*.126/data/export3 http://172.*.*.126/data/export4
  7. # 后台启动
  8. nohup ./minio server http://172.*.*.252/data/export1 http://172.*.*.252/data/export2 http://172.*.*.126/data/export3 http://172.*.*.126/data/export4 &

image.png

2.4 服务验证

服务端验证:

  1. ps -ef|grep minio

image.png
客户端验证:
浏览器查看:http://172.-.-.252:9000/,直接在浏览器上上传下载进行测试
image.png

2.5 存储形式

文件对象上传到 MinIO ,会在对应的数据存储磁盘中,以 Bucket 名称为目录,文件名称为下一级目录,文件名称下是 part.1 和 xl.json,前者是编码数据块及检验块,后者是元数据文件。如有4个磁盘,当文件上传后,会有2个编码数据块,2个检验块,分别存储在4个磁盘中。如下图,bg-01.jpg 是上传的文件对象:

image.png

2.6 nginx 负载均衡

前面单独对每个节点进行访问显然不合理,通过使用 nginx 代理,进行负载均衡则很有必要。简单的配置如下:

  1. upstream http_minio {
  2. server 172.-.-.252:9000;
  3. server 172.-.-.126:9000;
  4. }
  5. server{
  6. listen 8991;
  7. server_name localhost;
  8. ignore_invalid_headers off;
  9. client_max_body_size 0;
  10. proxy_buffering off;
  11. location / {
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-Host $host:$server_port;
  14. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  15. proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
  16. proxy_set_header Host $http_host;
  17. proxy_connect_timeout 300;
  18. proxy_http_version 1.1;
  19. chunked_transfer_encoding off;
  20. proxy_ignore_client_abort on;
  21. proxy_pass http://http_minio;
  22. }
  23. }

其中主要是 upstream 及 proxy_pass 的配置。如此,即可使用http://${MINIO_HOST}:8888 进行访问。


三、单机部署

与集群部署不同点:

  1. 启动脚本 nohup ./minio server /data/minio/ &
  2. 单机服务器不同于集群部署,需要最4个存储,单存储就可以

5a5b62c0602cb2c6d452046c06ad447e.jpg