精华内容
下载资源
问答
  • Minio 文件服务(1)—— Minio部署使用及存储机制分析 Minio 文件服务(2)—— Minio用Nginx做负载均衡 本文参考Minio官方文档,使用细节里面说的很详细,本文主要讲解文档中较少涉及的Minio存储机制。以及我在...

    Minio 文件服务(1)—— Minio部署使用及存储机制分析
    Minio 文件服务(2)—— Minio用Nginx做负载均衡

    本文参考Minio官方文档,使用细节里面说的很详细,本文主要讲解文档中较少涉及的Minio存储机制。以及我在使用中部署和使用Java SDK访问的过程。

    简介

    Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
    Minio是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

    存储机制

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

    纠删码

    纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。

    Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。因此下面主要讲解RS类纠删码。

    RS code编码数据恢复原理:

    RS编码以word为编码和解码单位,大的数据块拆分到字长为w(取值一般为8或者16位)的word,然后对word进行编解码。 数据块的编码原理与word编码原理相同,后文中以word为例说明,变量Di, Ci将代表一个word。
    把输入数据视为向量D=(D1,D2,…, Dn), 编码后数据视为向量(D1, D2,…, Dn, C1, C2,…, Cm),RS编码可视为如下(图1)所示矩阵运算。
    图1最左边是编码矩阵(或称为生成矩阵、分布矩阵,Distribution Matrix),编码矩阵需要满足任意n*n子矩阵可逆。为方便数据存储,编码矩阵上部是单位阵(n行n列),下部是m行n列矩阵。下部矩阵可以选择范德蒙德矩阵或柯西矩阵。

    RS最多能容忍m个数据块被删除。 数据恢复的过程如下:
    (1)假设D1、D4、C2丢失,从编码矩阵中删掉丢失的数据块/编码块对应的行。(图2、3)
    (2)由于B’ 是可逆的,记B’的逆矩阵为 (B’^-1),则B’ * (B’^-1) = I 单位矩阵。两边左乘B’ 逆矩阵。 (图4、5)
    (3)得到如下原始数据D的计算公式 。

    (4)对D重新编码,可得到丢失的编码码

    实践

    Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),仍可以从剩下的盘中的数据进行恢复。

    以下是我在4个节点上部署的集群,部署代码如下面多节点部署所示。

    1、我在minio服务中上传了一个hello.txt文件,内容为:hello,how are you?\n 共20个字符。
    2、然后在对应的bucket里会生成一个名为hello.txt的文件夹,文件夹里有2个文件,查看4个节点的part.1文件,会发现其中2个文件均分存放了原始数据hello,how are you?\n ,另外2个文件是乱码,但是根据上述分析应该存的就是奇偶校验块,充当编码矩阵的作用。因此part.1文件是存储就删码的。
    (数据块和奇偶校验块所存储的节点位置不是固定不变的)

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

    模拟数据丢失的情况

    新建一个happy.txt文件,上传至文件服务,在服务器的4个节点上可以看见该文件生成了一个part.1和xl.json文件。
    第一步删除005号服务器上的数据块,下载该文件,可读;
    第二步删除004号服务器上的数据块,下载该文件,可读;
    第二步删除003号服务器上的数据块,下载该文件,不可读,得到空白文件;因为丢失的硬盘数量大于N/2,不可恢复健康数据。

    模拟checksum丢失的情况

    新建一个sing.txt文件,上传至文件服务,在服务器的4个节点上可以看见该文件生成了一个part.1和xl.json文件。
    第一步删除005号服务器上的校验块,下载该文件,可读;
    第二步删除004号服务器上的校验块,下载该文件,可读;
    第二步删除003号服务器上的校验块,下载该文件,不可读,页面报异常,返回页面后该文件已不存在。
    再看服务器中但存储,文件名变为.CORRUPTED后缀。文件被损坏。

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

    部署

    单节点

    (容器部署)

    docker pull minio/minio
     
    #在Docker中运行Minio单点模式
    docker run -p 9000:9000 -e MINIO_ACCESS_KEY=sunseaiot -e MINIO_SECRET_KEY=sunseaiot minio/minio server /data
     
    #要创建具有永久存储的Minio容器,您需要将本地持久目录从主机操作系统映射到虚拟配置~/.minio 并导出/data目录
    #建立外挂文件夹 /Users/hbl/dockersp/volume/minio/
    docker run -p 9000:9000 -e MINIO_ACCESS_KEY=sunseaiot -e MINIO_SECRET_KEY=sunseaiot -v /Users/hbl/dockersp/volume/minio/data:/data -v /Users/hbl/dockersp/volume/minio/config:/root/.minio minio/minio server /data
    

    多节点

    分布式搭建的流程和单节点基本一样,Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式。

    分布式Minio单租户存在最少4个盘最多16个盘的限制(受限于纠删码)。这种限制确保了Minio的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。

    纠删码 (多块硬盘 / 服务)

    项目参数
    最大驱动器数量16
    最小驱动器数量4
    读仲裁N / 2
    写仲裁N / 2+1

    (多节点部署如果要使用容器需要用docker swarm 和K8s,文档中有介绍,本文重点不在此因此我直接在4个服务器上安装了Minio,直接运行即可。Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式,启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。)

    部署4主机,每机单块磁盘(drive)

    export MINIO_ACCESS_KEY=123456
    export MINIO_SECRET_KEY=123456
    ./minio server http://192.168.8.110/export1 \
                   http://192.168.8.111/export2 \
                   http://192.168.8.112/export3 \
                   http://192.168.8.113/export4
    

    部署4主机,每机2块磁盘(drives)

    export MINIO_ACCESS_KEY=123456
    export MINIO_SECRET_KEY=123456
    ./minio server http://192.168.8.110/export1 http://192.168.1.110/export2 \
                   http://192.168.8.111/export1 http://192.168.1.111/export2 \          
                   http://192.168.8.112/export1 http://192.168.1.112/export2 \
                   http://192.168.8.113/export1 http://192.168.1.113/export2
    

    后台运行

    由于不是用docker部署的,所以需要将进程加入后台运行。使用nohup指令。

    export MINIO_ACCESS_KEY=SunseaIoT2018!
    export MINIO_SECRET_KEY=SunseaIoT2018!
    nohup ./minio server http://192.168.8.110/minio1 \
                   http://192.168.8.111/minio2 \
                   http://192.168.8.112/minio3 \
                   http://192.168.8.113/minio4 >  out.file  2>&1  & 
    

    使用

    部署好Minio服务后可以通过浏览器访问。输入设置好的用户名和密码即可进行操作。

    Java SDK访问Minio服务

    package com.minio.client;
    
    import io.minio.MinioClient;
    import io.minio.errors.MinioException;
    import lombok.extern.slf4j.Slf4j;
    import org.xmlpull.v1.XmlPullParserException;
    
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    @Slf4j
    public class FileUploader {
        public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
            try {
                MinioClient minioClient = new MinioClient("https://minio.sunseaiot.com", "sunseaiot", "sunseaiot",true);
    
                // 检查存储桶是否已经存在
                if(minioClient.bucketExists("ota")) {
                    log.info("Bucket already exists.");
                } else {
                    // 创建一个名为ota的存储桶
                    minioClient.makeBucket("ota");
                    log.info("create a new bucket.");
                }
    
                //获取下载文件的url,直接点击该url即可在浏览器中下载文件
                String url = minioClient.presignedGetObject("ota","hello.txt");
                log.info(url);
    
                //获取上传文件的url,这个url可以用Postman工具测试,在body里放入需要上传的文件即可
                String url2 = minioClient.presignedPutObject("ota","ubuntu.tar");
                log.info(url2);
    
                // 下载文件到本地
                minioClient.getObject("ota","hello.txt", "/Users/hbl/hello2.txt");
                log.info("get");
    
                // 使用putObject上传一个本地文件到存储桶中。
                minioClient.putObject("ota","tenant2/hello.txt", "/Users/hbl/hello.txt");
                log.info("/Users/hbl/hello.txt is successfully uploaded as hello.txt to `task1` bucket.");
            } catch(MinioException e) {
                log.error("Error occurred: " + e);
            }
        }
    }
    
    展开全文
  • Minio部署

    2021-08-19 15:59:35
    Minio部署 Centos7直接部署 下载安装包 wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio 配置环境变量 export MINIO_ROOT_USER=jihouze export MINIO_ROOT_PASSWORD=jihozue@123 ...

    Minio集群部署、单机部署

    MinIO 是一个基于Apache Licensev2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

    本文记录了Minio集群部署、单机部署流程。

    Centos7集群部署

    环境说明

    主机硬盘
    192.168.154.25/fs
    192.168.154.25/fs2
    192.168.154.26/fs
    192.168.154.26/fs2

    下载安装包

    在每台服务器都要执行。

    mkdir -p /opt/minio
    cd /opt/minio
    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    

    配置用户名和密码

    在每台服务器都要执行。

    export MINIO_ROOT_USER=test123
    export MINIO_ROOT_PASSWORD=test@123
    

    配置ssh免密登录

    在192.168.154.25服务器执行:

    ssh-keygen -t rsa
    
    连续三次回车
    
    ssh-copy-id 192.168.154.26
    

    在192.168.154.26服务器执行:

    ssh-keygen -t rsa
    
    连续三次回车
     
    ssh-copy-id 192.168.154.25
    

    启动集群

    在每台服务器都要执行。在一台服务器上执行后立即查看日志cat /opt/minio/minio.log会报错connect: connection refused (*rest.NetworkError),待全部服务器执行完毕后报错会消失。

    nohup /opt/minio/minio server http://192.168.154.25/fs http://192.168.154.25/fs2 http://192.168.154.26/fs http://192.168.154.26/fs2 --console-address ":9001" >> /opt/minio/minio.log 2>&1 &
    

    控制台访问

    在浏览器输入以下任意地址均可访问:

    http://192.168.154.25:9001
    http://192.168.154.26:9001
    

    可以用配置的用户名和密码登录。
     

    Centos7单机部署

    下载安装包

    在每台服务器都要执行。

    mkdir -p /opt/minio
    cd /opt/minio
    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    

    创建数据存储路径

    mkdir -p /data/miniodata
    

    启动服务

    nohup /opt/minio/minio server /data/miniodata --console-address ":9001" >> /opt/minio/minio.log 2>&1 &
    

     

    Docker单机部署

    Windows

    docker run -p 9000:9000 -p 9001:9001 --name minio -v D:\Minio:/data -e "MINIO_ROOT_USER=test123" -e "MINIO_ROOT_PASSWORD=jihouze@123" minio/minio server /data --console-address ":9001"
    

    Centos

    docker run -p 9000:9000 -p 9001:9001 --name minio -v /data/miniodata:/data -e "MINIO_ROOT_USER=test123" -e "MINIO_ROOT_PASSWORD=test@123" minio/minio server /data --console-address ":9001"
    
    展开全文
  • MinIO部署快速入门

    千次阅读 2019-08-08 21:13:26
    MinIO部署快速入门 MinIO是一个云原生的应用程序,旨在在多租户环境中以可持续的方式进行扩展。编排(orchestration)平台为MinIO的扩展提供了非常好的支撑。以下是各种编排平台的MinIO部署文档: Orchestration...

    MinIO部署快速入门   

     

    MinIO是一个云原生的应用程序,旨在在多租户环境中以可持续的方式进行扩展。编排(orchestration)平台为MinIO的扩展提供了非常好的支撑。以下是各种编排平台的MinIO部署文档:

    Orchestration平台
    Docker Swarm
    Docker Compose
    Kubernetes
    DC/OS

     

    为什么说MinIO是云原生的(cloud-native)?

    云原生这个词代表的是一些思想的集合,比如微服务部署,可伸缩,而不是说把一个单体应用改造成容器部署。一个云原生的应用在设计时就考虑了移植性和可伸缩性,而且可以通过简单的复制即可实现水平扩展。现在兴起的编排平台,像Swarm、Kubernetes以及DC/OS,让大规模集群的复制和管理变得前所未有的简单,哪里不会点哪里。

    容器提供了隔离的应用执行环境,编排平台通过容器管理以及复制功能提供了无缝的扩展。MinIO继承了这些,针对每个租户提供了存储环境的隔离。

    MinIO是建立在云原生的基础上,有纠删码、分布式和共享存储这些特性。MinIO专注于并且只专注于存储,而且做的还不错。它可以通过编排平台复制一个MinIO实例就实现了水平扩展。

    在一个云原生环境中,伸缩性不是应用的一个功能而是编排平台的功能。

    现在的应用、数据库,key-store这些,很多都已经部署在容器中,并且通过编排平台进行管理。MinIO提供了一个健壮的、可伸缩、AWS S3兼容的对象存储,这是MinIO的立身之本,凭此在云原生应用中占据一席之地。

     

    展开全文
  • MINIO部署手册.docx

    2021-08-16 16:37:37
    MINIO单机及分布式集群部署及测试
  • minio部署与使用

    2021-07-23 14:31:31
    一、部署minio容器 拉取镜像 docker pull minio/minio 编写启动容器脚本(/data/minio) sudo vim mino.sh docker run -d \ -p 80:9000 \ --name=minio \ --restart=on-failure:3 \ -e "MINIO_ACCESS_KEY...

    一、部署minio容器

    拉取镜像

    docker pull minio/minio

    编写启动容器脚本(/data/minio)

    sudo vim mino.sh

    docker run -d \
    -p 80:9000 \
    --name=minio \
    --restart=on-failure:3 \
    -e "MINIO_ACCESS_KEY=admin" \
    -e "MINIO_SECRET_KEY=password" \
    -v /etc/localtime:/etc/localtime
    -v /data/minio/data:/data \
    -v /data/minio/config:/root/.minio \
    minio/minio server /data

    启动后访问:http://127.0.0.1:9000

    二、配置minio角色和策略等 (这一步操作的目的是为了服务端生成临时密钥获取的角色策略权限)

    编辑策略 (/data/minio)

    sudo vim ploy.json

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
              "s3:ListAllMyBuckets",
              "s3:ListBucket",
              "s3:GetBucketLocation",
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObject"
          ],
          "Resource": [
            "arn:aws:s3:::*"
          ]
        }
      ]
    }

    使用管理命令工具配置

    #拉镜像
    docker pull minio/mc
    
    ##启动sudo vim minio-mc.sh
    docker run -it --entrypoint=/bin/sh -v /etc/localtime:/etc/localtime -v /data/minio/ploy.json:/home/ploy.json --net=host  minio/mc=/bin/sh -v /etc/localtime:/etc/localtime minio/mc

    注意:启动之后会进入容器进行操作

    配置设置

    mc config host add minio 地址 账号 密码 --api s3v4

    设置新的别名

    mc alias set minio 地址 账号 密码 

     创建策略

    mc admin policy add minio /home/ploy.json

    创建用户

    mc admin user add minio 账号 密码

    角色添加策略

    mc admin policy set minio 策略名称 user=创建的用户

    mc相关命令

    mc admin console minio//打印日志
    
    mc policy set public minio/yz-payment //设置访问权限
    
    mc config  host list //获取节点list
    
    mc admin --json info minio //获取minio节点信息
    
    mc admin config get minio //获取节点配置信息

    三、服务端生成临时密钥代码

    ## node.js版

    /**
       * @summary获取awsminio临时token
       */
      async getMinioToken(){
    
        const { config, logger, ctx } = this;
        const sts = new AWS.STS({
          accessKeyId: 'admin',
          secretAccessKey: 'password',
          endpoint:'http://127.0.0.1:9000',
          region:'us-east-1'
        });
        console.log("sts=====>",sts)
    
        const policy = {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [                
                    "s3:ListAllMyBuckets",
                    "s3:ListBucket",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:DeleteObject"
                ],
                  "Resource": ["arn:aws:s3:::*"]
              }
          ]
        }
    
        const params = {
          ExternalId: "123ABC", 
          Policy: JSON.stringify(policy), 
          RoleArn: "arn:aws:iam::123456789012:role/demo",   //
          RoleSessionName: "testAssumeRoleSession", 
          TransitiveTagKeys: [
             "Project", 
             "Cost-Center"
          ]
         };
    
        sts.assumeRole(params, function (err, data) {
          if (err) console.log(err, err.stack); // an error occurred
          else     console.log(data);           // successful response
        });
      }

    四、minio出现跨域问题

    目前解决方案是配置nginx请求头

    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS,PUT';
    add_header 'Access-Control-Allow-Headers' 'Date, Etag, Server, Connection, Accept-Ranges, Content-Range, Content-Encoding, Content-Length, Content-Type, Content-Disposition, Last-Modified, Content-Language, Cache-Control, Retry-After, X-Amz-Bucket-Region, Expires, X-Amz*, X-Amz*, *';

    五、参考链接

    mino官方文档

    minio安装以及使用

    aws sts临时授权方案

    minio的sts尝试及注意事项

    minio多用户权限管理

    亚马逊aws-sdk包文档

    minio临时密钥php方式实现

    展开全文
  • minio服务部署

    2021-07-14 17:52:56
    chmod +x minio ./minio server /data 集群启动 minio server --address:19000 ...
  • Linux系统Minio部署并后台运行

    千次阅读 2021-01-11 14:06:06
    Linux系统Minio部署并后台运行一、下载minio二、为minio添加执行权限三、启动命令1.后台启动2.前台启动五、验证是否启动六、登录 一、下载minio wget https://dl.minio.io/server/minio/release/linux-amd64/minio ...
  • Ubuntu16.04minio部署

    2021-09-02 09:44:31
    docker run -p 9000:9000 --name minio -di --restart=always -e "MINIO_ACCESS_KEY=miniominio" -e "MINIO_SECRET_KEY=miniominio" -v /minio/data:/data -v /minio/config:/root/.minio minio/minio server /data.
  • docker minio 部署使用

    千次阅读 2020-01-09 16:07:56
    MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有19K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 ...
  • Minio部署后出现的问题解决

    千次阅读 2020-11-20 11:19:29
    Minio部署后出现的问题解决 Minio在linux下的集群部署这里就不做过多阐述了,如有需要可以私聊我,整理有一整套完整部署文档。 这里说明之前部署完成后,有一台服务器整个还原后,重新部署该服务器,出现的一个问题...
  • Minio文件服务器部署

    2021-01-28 09:23:41
    一、安装Minio 1.Linux系统中可以打开的文件数量 #查看系统级别的能够打开的文件句柄的数量 cat /proc/sys/fs/file-max #vim /etc/sysctl.conf #使修改配置立即生效 2.Linux进程打开文件最大数量,重启后生效...
  • MinIO部署,以及扩容

    千次阅读 热门讨论 2020-08-27 16:45:47
    单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。 例如,一个16节点的Minio集群,每个节点16块硬盘,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,301
精华内容 920
关键字:

minio部署服务