写点什么

什么是 Minio?如何搭建 Minio 集群?

作者:wljslmz
  • 2022 年 6 月 13 日
  • 本文字数:4620 字

    阅读完需:约 15 分钟

什么是Minio?如何搭建Minio集群?

一、Minio 介绍

1.1 Minio 简介

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

1.2 部署方式:

  • 单机部署

  • 分布式部署

1.3 Minio 官网

1、首页


https://min.io
复制代码



2、下载


https://min.io/download
复制代码



3、中文文档


http://docs.minio.org.cn/docs/
复制代码


二、Minio 集群

2.1 Minio 集群原理

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



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


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


  1. MinIO 自动在集群内生成若干纠删组,每个纠删组包含一组硬盘,其数量通常为 4 至 16 块;

  2. 对数据对象进行分片,默认策略是得到相同数量的数据分片和校验分片;

  3. 而后通过哈希算法计算出该数据对象对应的纠删组,并将数据和校验分片存储至纠删组内的硬盘上。



假设某 MinIO 集群内纠删组包含 4 块硬盘,某数据对象名为 MyObject,其隶属存储桶名为 MyBucket,哈希计算得到对应的纠删组为 Disk 1~4。那么在 Disk 1~4 的数据路径下,都会生成 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 Minio 集群搭建

有两台服务器:


  • 192.168.3.17

  • 192.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/bashexport MINIO_ACCESS_KEY=adminexport 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/bashexport MINIO_ACCESS_KEY=adminexport 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 serviceDocumentation=https://docs.minio.io/
[Service]WorkingDirectory=/home/minio/run/ExecStart=/home/minio/run/minio-run.sh
Restart=on-failureRestartSec=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 miniosystemctl enable minio
复制代码


查看集群状态


systemctl status minio.service -l
复制代码

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

3.1 安装 nginx

apt-get install nginx
复制代码


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


  • /usr/sbin/nginx:主程序

  • /etc/nginx:存放配置文件

  • /usr/share/nginx:存放静态文件

  • /var/log/nginx:存放日志


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

3.2 创建 SSL 证书

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.csrEnter pass phrase for nginx.key:                             #输入刚刚创建的秘密码You are about to be asked to enter information that will be incorporatedinto 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 blankFor 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' attributesto 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.keyEnter 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 oksubject=/C=CN/ST=JiangSu/L=NanJing/O=Dwing/OU=Tech/CN=*.generalstorage.com/emailAddress=admin@generalstorage.comGetting Private keyEnter pass phrase for nginx.key:          #RSA创建时的密码
复制代码

3.3 配置 Nginx

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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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



用户头像

wljslmz

关注

极致主义者,追求技术的路上,勇往直前! 2021.05.24 加入

订阅号:网络技术联盟站 个站:https://www.wljslmz.cn

评论

发布
暂无评论
什么是Minio?如何搭建Minio集群?_存储_wljslmz_InfoQ写作社区