Minio基本介绍及如何搭建Minio集群

2022-06-14 12:00:14
目录
一、Minio介绍1.1 Minio简介1.2 部署方式:1.3 Minio官网二、Minio集群2.1 Minio集群原理2.2 术语解释2.3 纠删码2.4 Minio集群搭建三、Nginx反向代理与负载均衡3.1 安装nginx3.2 创建SSL证书3.3 配置Nginx四、minio页面展示

一、Minio介绍

1.1>

MinIO 是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现,,客户端与存储服务器之间采用http/https通信协议。

1.2>
    单机部署分布式部署

    1.3>

    1、首页

    https://min.io/

    2、下载

    https://min.io/download

    3、中文文档

    http://docs.minio.org.cn/docs/

    二、Minio集群

    2.1>

    MinIO分布式集群是指在多个服务器节点均部署MinIO服务,并将其组建为分布式存储集群,对外提供标准S3接口以进行统一访问。

    MinIO集群采用去中心化无共享架构,各节点间为对等关系,连接至任一节点均可实现对集群的访问。在我们的方案中还选择了Nginx的轮询实现各个节点的负载均衡。

    数据对象在MinIO集群中进行存储时,先进行纠删分片,后打散存储在各硬盘上。具体为:

      MinIO自动在集群内生成若干纠删组,每个纠删组包含一组硬盘,其数量通常为4至16块;对数据对象进行分片,默认策略是得到相同数量的数据分片和校验分片;而后通过哈希算法计算出该数据对象对应的纠删组,并将数据和校验分片存储至纠删组内的硬盘上。

      假设某MinIO集群内纠删组包含4块硬盘,某数据对象名为MyObject,其隶属存储桶名为MyBucket,哈希计算得到对应的纠删组为Disk 14。那么在Disk 14的数据路径下,都会生成MyBucket/MyObject子路径,子路径中包含2个文件,分别为存储元数据信息的xl.meta和MyObject对象在该盘上的第一个分片part.1。其中,xl表示MinIO中数据对象的默认存储格式。

      2.2>

      1、S3

      Simple Storage Service,简单存储服务,这个概念是Amazon在2006年推出的,对象存储就是从那个时候诞生的。S3提供了一个简单Web服务接口,可用于随时在Web上的任何位置存储和检索任何数量的数据。

      2、Object

      存储到 Minio 的基本对象,如文件、字节流,Anything...

      3、Bucket

      用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。

      4、Drive

      部署 Minio 时设置的磁盘,Minio 中所有的对象数据都会存储在 Drive 里。

      5、Set

      一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的 Drive 分布在不同位置。一个对象存储在一个 Set 上。

      2.3>

      纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(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 奇偶校验块。

      在同一集群内,MinIO 自己会自动生成若干纠删组(Set),用于分布存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。

      2.4>

      有两台服务器:

        192.168.3.17192.168.3.18

        1、在每台服务器上创建minio目录

        mkdir -p /home/minio/{run,data1,data2} && mkdir -p /etc/minio

        2、下载或者上传下载好的minio二进制文件

        官网下载地址:

        https://dl.min.io/server/minio/release/linux-amd64/minio

        3、集群启动文件配置

        Minio默认9000端口,在配置文件中加入–address “127.0.0.1:9029” 可更改端口

        注意 :

          MINIO_ACCESS_KEY:用户名,长度最小是5个字符MINIO_SECRET_KEY:密码,密码不能设置过于简单,不然minio会启动失败,长度最小是8个字符–config-dir:指定集群配置文件目录
          vim /home/minio/run/minio-run.sh
          

          集群节点192.168.3.17内容为

          #!/bin/bash
          export MINIO_ACCESS_KEY=admin
          export MINIO_SECRET_KEY=admin123
          /home/minio/run/minio server --config-dir /etc/minio 
          --address "192.168.3.17:9000" 
          http://192.168.3.17/home/minio/data1 http://192.168.3.17/home/minio/data2 
          http://192.168.3.18/home/minio/data1 http://192.168.3.18/home/minio/data2 
          

          集群节点192.168.3.18内容为

          #!/bin/bash
          export MINIO_ACCESS_KEY=admin
          export MINIO_SECRET_KEY=admin123
          /home/minio/run/minio server --config-dir /etc/minio 
          --address "192.168.3.18:9000" 
          http://192.168.3.17/home/minio/data1 http://192.168.3.17/home/minio/data2 
          http://192.168.3.18/home/minio/data1 http://192.168.3.18/home/minio/data2 
          

          4、创建Minio.server,将minio加入系统服务

          vim /usr/lib/systemd/system/minio.service
          
          [Unit]
          Description=Minio service
          Documentation=https://docs.minio.io/
          
          [Service]
          WorkingDirectory=/home/minio/run/
          ExecStart=/home/minio/run/minio-run.sh
          
          Restart=on-failure
          RestartSec=5
          
          [Install]
          WantedBy=multi-user.target
          
          

          修改配置文件后需要重加载配置

          systemctl daemon-reload
          

          5、权限修改

          chmod +x /usr/lib/systemd/system/minio.service && chmod +x /home/minio/run/minio && chmod +x /home/minio/run/minio-run.sh
          

          6、启动集群

          systemctl start minio
          systemctl enable minio
          

          查看集群状态

          systemctl status minio.service -l
          

          三、Nginx反向代理与负载均衡

          3.1>
          apt-get install nginx
          

          nginx文件安装完成之后的文件位置:

            /usr/sbin/nginx:主程序/etc/nginx:存放配置文件/usr/share/nginx:存放静态文件/var/log/nginx:存放日志

            为了保证安全性,将采用https形式访问minio,下面展示再服务器本地生成ssl证书,并且集成到nginx中。

            3.2>

            1、创建证书目录

            [root@localhost ~]# cd /etc/nginx/
            [root@localhost nginx]# mkdir ssl
            [root@localhost nginx]# cd ssl/

            2、生成一个RSA密钥

            [root@localhost ssl]#  openssl genrsa -des3 -out nginx.key 1024  #实际使用中看服务器性能,如果足够好也可以使用4096位秘钥
            Generating RSA private key, 1024 bit long modulus
            .......++++++
            ...++++++
            e is 65537 (0x10001)
            Enter pass phrase for nginx.key: 123456                #输入密码,自定义
            Verifying - Enter pass phrase for nginx.key: 123456    #确认密码
            

            3、生成一个证书请求

            [root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr
            Enter pass phrase for nginx.key:                             #输入刚刚创建的秘密码
            You are about to be asked to enter information that will be incorporated
            into your certificate request.
            What you are about to enter is what is called a Distinguished Name or a DN.
            There are quite a few fields but you can leave some blank
            For some fields there will be a default value,
            If you enter '.', the field will be left blank.
            -----
            Country Name (2 letter code) [XX]:CN                      #国家名称
            State or Province Name (full name) []:JiangSu            #省
            Locality Name (eg, city) [Default City]:NanJing          #市
            Organization Name (eg, company) [Default Company Ltd]:Dwing     #公司
            Organizational Unit Name (eg, section) []:Tech     #部门
            Common Name (eg, your name or your server's hostname) []:*.generalstorage.com       #注意,此处应当填写你要部署的域名,如果是单个则直接添加即可,如果不确定,使用*,表示可以对所有generalstorage.com的子域名做认证
            Email Address []:admin@generalstorage.com    #以域名结尾即可
            
            Please enter the following 'extra' attributes
            to be sent with your certificate request 
            A challenge password []:        #是否设置密码,可以不写直接回车  
            An optional company name []:    #其他公司名称 可不写
            

            4、创建不需要输入密码的RSA证书,否则每次reload、restart都需要输入密码

            [root@localhost ssl]# openssl rsa -in nginx.key -out nginx_nopass.key
            Enter pass phrase for nginx.key:        #之前RSA秘钥创建时的密码
            writing RSA key
            

            5、签发证书(由于是测试自己签发,实际应该将自己生成的csr文件提交给SSL认证机构认证)

            [root@localhost ssl]# openssl x509 -req -days 3650 -in nginx.csr  -signkey nginx.key -out nginx.crt    
            Signature ok
            subject=/C=CN/ST=JiangSu/L=NanJing/O=Dwing/OU=Tech/CN=*.generalstorage.com/emailAddress=admin@generalstorage.com
            Getting Private key
            Enter pass phrase for nginx.key:          #RSA创建时的密码
            

            3.3>
            server {
            	listen      80 default_server;
            	listen      [::]:80 default_server;
            	server_name test.generalstorage.com;
            	include 	/etc/nginx/default.d/*.conf;
            	return      301 https://$server_name$request_uri;    #在80监听端口 配置跳转
            }
            server {
            	listen       443 ssl http2 default_server;
            	listen       [::]:443 ssl http2 default_server;
            	server_name test.generalstorage.com;
            	client_max_body_size 20M;
            	charset utf-8;
            	ssl_certificate "/etc/nginx/ssl/nginx.crt";   #
                ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
                ssl_session_cache shared:SSL:1m;
                ssl_session_timeout  10m;
                ssl_ciphers HIGH:!aNULL:!MD5;
            	ssl_prefer_server_ciphers on;
            	location /{
            		proxy_set_header  Host       $host;
                    proxy_set_header  X-Real-IP    $remote_addr;
                    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://minio_server;
            	}
            }
            
              ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。ssl_session_timeout 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。ssl_protocols指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。ssl_ciphers选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

              启动服务

              [root@localhost nginx]# nginx -t
              nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
              nginx: configuration file /etc/nginx/nginx.conf test is successful
              [root@localhost nginx]# systemctl restart nginx
              

              本地hosts绑定域名

              192.168.3.17 test.generalstorage.com
              

              四、minio页面展示

              浏览器中输入:https://test.generalstorage.com/

              输入账号/密码:admin/admin123

              以上为个人经验,希望能给大家一个参考,也希望大家多多支持易采站长站。