分布式文件存储系统MinIO
Minio是对象存储服务,非常适合存储大容量非结构化的数据,如照片,视频,日志文件、备份数据等。
- Bucket:“桶”,用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端而言,就相当于一个存放文件的顶层文件夹。
- Object:存储到Minio的基本对象,如文件,字节流,Anything等
- Drive:即存储数据的磁盘,在minio启动时,以参数的方式传入。Minio中所有的对象数据都会存储到drive里。
- Set:即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同的位置。一个对象存储在一个Set上。
一、环境搭建
1.1 MinIo在centos7上搭建
在CentOS 7上搭建MinIO可以通过以下步骤完成。这里将使用MinIO的二进制分发版进行安装。
1.1.1 下载MinIO二进制文件:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 安装路径 /home/minio
1.1.2 授予执行权限:
chmod +x minio
1.1.3 创建MinIO数据存储目录:
mkdir -p /data/minio
1.1.4 运行MinIO服务器:
./minio server --address '192.168.88.164:9000' --console-address '192.168.88.164:9001' /data/minio
1.2 minio纠删码
纠删码(Erasure Code)简称EC,是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。
- 纠删码是一种恢复丢失和损坏数据的数学算法,目前,纠删码技术在分布式存储系统中的应用主要有三类,阵列纠删码(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),用于分布存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。
每个对象在上传上去之后在每个盘符都有
/home/minio/minio server --address ":9000" --console-address ":9001" http://192.168.88.161/home/minio/data1 http://192.168.88.161/home/minio/data2 http://192.168.88.161/home/minio/data3 http://192.168.88.161/home/minio/data4 http://192.168.88.162/home/minio/data1 http://192.168.88.162/home/minio/data2 http://192.168.88.162/home/minio/data3 http://192.168.88.162/home/minio/data4 > /home/minio/minio.log 2>&1 &
1.3 分布式MINIO部署
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样
命令。
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minioserver命令之前,先将access秘钥和secret秘钥export成环境变量。新版本使用MINIO_ROOT_USER&MINIO_ROOT PASSWORD。
- 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
- 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP来保证时间一致。
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
节点 | 目录 |
---|---|
192.168.88.161 | /home/minio/data1 |
192.168.88.161 | /home/minio/data2 |
192.168.88.161 | /home/minio/data3 |
192.168.88.161 | /home/minio/data4 |
192.168.88.162 | /home/minio/data1 |
192.168.88.162 | /home/minio/data2 |
192.168.88.162 | /home/minio/data3 |
192.168.88.162 | /home/minio/data4 |
1.3.1 创建目录
mkdir /home/minio/data1
mkdir /home/minio/data2
mkdir /home/minio/data3
mkdir /home/minio/data4
1.3.2 编写启动脚本
/home/minio/minio server --address ":9000" --console-address ":9001" http://192.168.88.161/home/minio/data1 http://192.168.88.161/home/minio/data2 http://192.168.88.161/home/minio/data3 http://192.168.88.161/home/minio/data4 http://192.168.88.162/home/minio/data1 http://192.168.88.162/home/minio/data2 http://192.168.88.162/home/minio/data3 http://192.168.88.162/home/minio/data4 > /home/minio/minio.log 2>&1 &
#!/bin/bash
export MINIO_ROOT_USER=adminminio
export MINIO_ROOT_PASSWORD=adminminio
#export MINIO_PROMETHEUS_AUTH_TYPE="public"
/home/minio/minio server --address ":9000" --console-address ":9001" http://192.168.88.161/home/minio/data1 http://192.168.88.161/home/minio/data2 http://192.168.88.162/home/minio/data1 http://192.168.88.162/home/minio/data2 > /home/minio/minio.log 2>&1 &
1.3.3 赋权、启动
chmod +x /home/minio/minio
chmod +x /home/minio/run.sh
# 每个节点都运行
./run.sh
1.3.4 浏览器访问
1.3.5 Nginx负载均衡配置
Nginx.conf配置如下:
#user nobody;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream minio {
server 192.168.88.161:9000;
server 192.168.88.162:9000;
}
upstream console {
ip_hash;
server 192.168.88.161:9001;
server 192.168.88.162:9001;
}
server{
listen 19000;
server_name 192.168.88.161;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://minio;
}
}
server{
listen 19001;
server_name 192.168.88.161;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://console;
}
}
}
cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
二、Nginx学习
2.1 Nginx概念
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
2.2 Nginx作用
Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
正向代理
反向代理
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
轮询
加权轮询
iphash对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
2.3 Nginx的安装
2.3.1 windows下安装
1、下载nginx
http://nginx.org/en/download.html 下载稳定版本。
以nginx/Windows-1.16.1为例,直接下载 nginx-1.16.1.zip。
下载后解压,解压后如下:
2、启动nginx
有很多种方法启动nginx
(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过
(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe
,回车即可
3、检查nginx是否启动成功
直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!
4、配置监听
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload
即可让改动生效
5、关闭nginx
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1)输入nginx命令 nginx -s stop
(快速停止nginx) 或 nginx -s quit
(完整有序的停止nginx)
(2)使用taskkill taskkill /f /t /im nginx.exe
taskkill是用来终止进程的,/f是强制终止 ./t终止指定的进程和任何由此启动的子进程。/im示指定的进程名称 .
2.3.2 linux下安装
1、安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
5、下载安装包
手动下载.tar.gz安装包,地址:https://nginx.org/en/download.html
下载完毕上传到服务器上 /root
6、解压
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
7、配置
使用默认配置,在nginx根目录下执行
./configure
make
make install
查找安装路径: whereis nginx
2.4 Nginx常用命令
cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
nginx -t # 测试配置文件是否正确
./nginx -s reload 重新加载配置文件
ps aux|grep nginx 查看nginx进程
启动成功访问 服务器ip:80
注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!
三、Minio客户端的使用
3.1 部署客户端mc
Linux:
cd /home/minio/
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
mv mc /usr/local/sbin
Windows:
3.2 配置mc(添加MinIO存储服务)
MinIO服务器显示URL,访问权和秘密密钥。
【用法】
mc config host add <ALIAS> <YOUR-MINIO-ENDPOINT> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
【示例】
cd /opt/bigdata/minio/
# 明文输入
./mc config host add minio http://local-168-182-110:19000 admin admin123456
# 密文输入(推荐)
./mc config host add minio http://local-168-182-110:19000
Enter Access Key: admin
Enter Secret Key: admin123456
【测试】
cd /opt/bigdata/minio/
# 获取已配置别名“ minio”的MinIO服务器信息
./mc admin info minio
# 添加外壳别名以获取信息,以便恢复。
alias minfo='/opt/bigdata/minio/mc admin info'
alias mheal='/opt/bigdata/minio/mc admin heal'
实践:
[root@node1 minio]# ./mc config host add minio http://192.168.88.161:19000
Enter Access Key: admin
Enter Secret Key:
Added `minio` successfully.
[root@node1 minio]# ./mc admin info minio
● 192.168.88.161:9000
Uptime: 2 hours
Version: 2023-11-20T22:40:07Z
Network: 2/2 OK
Drives: 4/4 OK
Pool: 1
● 192.168.88.162:9000
Uptime: 2 hours
Version: 2023-11-20T22:40:07Z
Network: 2/2 OK
Drives: 4/4 OK
Pool: 1
Pools:
1st, Erasure sets: 1, Drives per erasure set: 8
2.9 MiB Used, 1 Bucket, 2 Objects
8 drives online, 0 drives offline
3.3 mc命令使用
[root@node1 minio]# ./mc config host ls
gcs
URL : https://storage.googleapis.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v2
Path : dns
local
URL : http://localhost:9000
AccessKey :
SecretKey :
API :
Path : auto
minio
URL : http://192.168.88.161:19000
AccessKey : admin
SecretKey : admin123456
API : s3v4
Path : auto
play
URL : https://play.min.io
AccessKey : Q3AM3UQ867SPQQA43P2F
SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
API : S3v4
Path : auto
s3
URL : https://s3.amazonaws.com
AccessKey : YOUR-ACCESS-KEY-HERE
SecretKey : YOUR-SECRET-KEY-HERE
API : S3v4
Path : dns
您在 /var/spool/mail/root 中有新邮件
[root@node1 minio]# ./mc ls minio
[2023-11-29 16:38:42 CST] 0B wang/
您在 /var/spool/mail/root 中有新邮件
[root@node1 minio]# ./mc ls minio/wang
[2023-11-29 18:08:42 CST] 942KiB STANDARD 一种改进的自适应遗传算法_刘萍.caj
[2023-11-29 16:38:50 CST] 2.0MiB STANDARD 基于抗原密度聚类的否定选择算法在入侵检测中的应用研究_贾琳.caj
3.3.1 下载与上传
下载
Windows连接minio客户端从minio服务器下载到Windows本地:
C:\Users\23140\Desktop>mc ls minio/wang
[2023-11-29 19:37:14 CST] 285KiB STANDARD contract.pdf
[2023-11-29 18:08:42 CST] 942KiB STANDARD 一种改进的自适应遗传算法_刘萍.caj
[2023-11-29 16:38:50 CST] 2.0MiB STANDARD 基于抗原密度聚类的否定选择算法在入侵检测中的应用研究_贾琳.caj
C:\Users\23140\Desktop>mc cp minio/wang/contract.pdf D:\tmp
...ng/contract.pdf: 285.10 KiB / 285.10 KiB [==============================================] 8.47 MiB/s 0s
上传
从Windows中上传本地文件到mini服务器:
C:\Users\23140\Desktop>mc cp D:\tmp\fsmd2023.pdf minio/wang
...mp\fsmd2023.pdf: 257.99 KiB / 257.99 KiB [==============================================] 5.05 MiB/s 0s
3.3.2 Bucket管理
3.4 mc admin使用
四、minio学习遇到的问题
4.1 问题1
问题描述:按照网上的教程使用Nginx给分布式的mino配了负载均衡之后发现查看桶一直在loading
原因分析:
按F12看了一下,查看桶发起的是websocket请求。
解决方案:
在nginx配置上加上支持websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
#user nobody;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream minio {
server 192.168.88.161:9000;
server 192.168.88.162:9000;
}
upstream console {
ip_hash;
server 192.168.88.161:9001;
server 192.168.88.162:9001;
}
server{
listen 19000;
server_name 192.168.88.161;
# ignore_invalid_headers off;
# client_max_body_size 0;
# proxy_buffering off;
location / {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio;
expires 0;
#添加了websocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server{
listen 19001;
server_name 192.168.88.161;
# ignore_invalid_headers off;
# client_max_body_size 0;
# proxy_buffering off;
location / {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://console;
expires 0;
#添加了websocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
4.2 问题2
在上传文件时,文件大于100M报错。
客户端上传到服务器:
C:\Users\23140\Desktop>mc cp C:\Users\23140\20231128_145853.mp4 minio/wang
mc: <ERROR> Failed to copy `C:\Users\23140\20231128_145853.mp4`. <html>
<head><title>413 Request Entity Too Large</title></head>
<body>
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
服务器自行上传:
解决:在nginx.conf中配置
# minio.conf
# 其他配置项...
[server]
max-object-size = 100MiB # 设置最大允许上传的文件大小,此处为100MB
# 其他配置项...
# 测试配置文件是否正确
nginx -t
# 重新加载 Nginx 配置
nginx -s reload
# 或者重启 Nginx 服务
service nginx restart
[root@node1 nginx]# cd sbin
[root@node1 sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
您在 /var/spool/mail/root 中有新邮件
重新启动,上传成功!!!
[外链图片转存中…(img-kNWF5Ca1-1701260266117)]
服务器自行上传:
[外链图片转存中…(img-xPMoxJba-1701260266117)]
解决:在nginx.conf中配置
# minio.conf
# 其他配置项...
[server]
max-object-size = 100MiB # 设置最大允许上传的文件大小,此处为100MB
# 其他配置项...
# 测试配置文件是否正确
nginx -t
# 重新加载 Nginx 配置
nginx -s reload
# 或者重启 Nginx 服务
service nginx restart
[root@node1 nginx]# cd sbin
[root@node1 sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
您在 /var/spool/mail/root 中有新邮件
重新启动,上传成功!!!
[外链图片转存中…(img-HviGwnrI-1701260266118)]