一、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分布式集群架构
MinIO集群采用去中心化无共享架构,各节点间为对等关系,连接至任一节点均可实现对集群的访问。在我们的方案中还选择了Nginx的轮询实现各个节点的负载均衡。
数据对象在MinIO集群中进行存储时,先进行纠删分片,后打散存储在各硬盘上。具体为:
MinIO自动在集群内生成若干纠删组,每个纠删组包含一组硬盘,其数量通常为4至16块;对数据对象进行分片,默认策略是**相同数量的数据分片和校验分片;而后通过哈希算法计算出该数据对象对应的纠删组,并将数据和校验分片存储至纠删组内的硬盘上。
假设某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.17192.168.3.181、在每台服务器上创建minio目录mkdir -p /home/minio/{run,data1,data2} && mkdir -p /etc/minio2、下载或者上传下载好的minio二进制文件
官网下载地址:
https://dl.min.io/server/minio/release/linux-amd64/minio3、集群启动文件配置
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.shRestart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
修改配置文件后需要重加载配置
systemctl daemon-reload5、权限修改chmod +x /usr/lib/systemd/system/minio.service && chmod +x /home/minio/run/minio && chmod +x /home/minio/run/minio-run.sh6、启动集群systemctl start miniosystemctl enable minio
查看集群状态
systemctl status minio.service -l三、Nginx反向代理与负载均衡3.1 安装nginxapt-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 key5、签发证书(由于是测试自己签发,实际应该将自己生成的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 配置Nginxserver { 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 succes**ul[root@localhost nginx]# systemctl restart nginx本地hosts绑定域名192.168.3.17 test.generalstorage.com四、minio页面展示
浏览器中输入:https://test.generalstorage.com/
输入账号/密码:admin/admin123