Minio【Windows版本】

Minio【Windows版本】

一.基本配置流程

1.运行服务端

minio.exe server F:/Data

2.修改access_key和secret_key

F:MinioData.minio.sysconfigconfig.json都设置成admincom

3.重新运行服务端

4.登陆客户端创建bucket

5.添加服务端host到客户端管理

mc.exe config host add minio http://127.0.0.1:9000

6.设置链接永久有效

mc.exe policy set public minio/刚刚的bucket名字

7.访问minio,创建bucket并且上传文件

http://127.0.0.1:9000

创建一个名为myself的bucket

二.纠删码

1.相关概念

1)Minio纠删码快速入门 Slack

Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。

2)什么是纠删码erasure code?

纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很NB,感兴趣的同学请翻墙google。

3)为什么纠删码有用?

纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。

4)什么是位衰减bit rot保护?

位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

2.部署以及测试

1)在12个节点上部署的集群

minio.exe server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8 /data9 /data10 /data11 /data12

2)在服务器中上传一个Minio.txt文件

abcdefghijklmnopqrstuvwxyz

3)然后在12个节点中都会生成一个名为Minio.txt的文件夹,文件夹里都有两个文件,分别是part.1和xl.json

其中data11中的part.1里内容如下,有乱码和部分原始数据。

璜F榑姙艠08^?=>X"芔鍫?拱胿蘤ghij

而另一个json文件中的内容如下,对比了12个节点xl.json文件的差别,发现只有index和checksum中的hash值不同。因此这个json文件是存储校验和的。保护数据免受无声数据损坏

{
    "version":"1.0.1",
    "format":"xl",
    "stat":{
        "size":26,
        "modTime":"2020-05-08T03:28:03.751735Z"
     },
    "erasure{
        "algorithm":"klauspost/reedsolomon/vandermonde",
        "data":6,
        "parity":6,
        "blockSize":10485760,
        "index":10,
        "distribution":[4,5,6,7,8,9,10,11,12,1,2,3],
        "checksum":[{"name":"part.1","algorithm":"highwayhash256S"}]},
        "minio":{"release":"RELEASE.2020-04-04T05-39-31Z"},
        "meta":{"content-type":"text/plain","etag":"2896208f6a333df00ac068f87dc0dfb0-1"},
        "parts":[{"number":1,"size":26,"actualSize":26}]
}

4)模拟数据丢失的情况

删除节点data1里的part.1,Minio.exe仍可以访问,可以下载

删除节点data2里的part.1,Minio.exe仍可以访问,可以下载

删除节点data6里的part.1,Minio.exe仍可以访问,可以下载

删除节点data7里的part.1,Minio.exe拒绝访问,不可以下载

5)模拟存储校验和丢失的情况

删除节点data1里的xl.json,Minio.exe仍可以访问,可以下载

删除节点data2里的xl.json,Minio.exe仍可以访问,可以下载

删除节点data6里的xl.json,Minio.exe仍可以访问,可以下载

删除节点data7里的xl.json,Minio.exe拒绝访问,下载下来是一个空压缩包

单机Minio服务存在单点故障,相反,如果是一个N节点的分布式Minio,只要有N/2节点在线,你的数据就是安全的。不过你需要至少有N/2+1个节点来创建新的对象。
例如,一个8节点的Minio集群,每个节点一块盘,就算4个节点宕机,这个集群仍然是可读的,不过你需要5个节点才能写数据。

三.部署

1.创建一个spring-boot项目

2.导入依赖

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>3.0.10</version>
</dependency>

3.创建一个运行在https://play.min.io的免费托管的MinIO服务

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import org.xmlpull.v1.XmlPullParserException;

import io.minio.MinioClient;
import io.minio.errors.MinioException;

public class FileUploader {
  public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
    try {
      // 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
      MinioClient minioClient = new MinioClient("https://127.0.0.1",9000,"admincom", "admincom");

      // 检查存储桶是否已经存在
      boolean isExist = minioClient.bucketExists("myself");
      if(isExist) {
        System.out.println("Bucket already exists.");
      } else {
        // 创建一个名为yourself的存储桶,用于存储照片的zip文件。
        minioClient.makeBucket("yourself");
      }

      // 使用putObject上传一个文件到存储桶中。
      minioClient.putObject("myself","1.png", "E:\\Desktop\\1.png");
      System.out.println("E:\\Desktop\\1.png is successfully uploaded as 1.png to `myself` bucket.");
    } catch(MinioException e) {
      System.out.println("Error occurred: " + e);
    }
  }
}
Minio

我来吐槽

*

*