minio存储的使用
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
minio官方文档地址:
https://min.io/docs/minio/linux/index.html
https://minio.org.cn/docs/minio/linux/operations/installation.html #中文文档
下载二进制文件,linux和windows版本都在此下载,地址如下:
http://dl.minio.org.cn/server/minio/release/linux-amd64/minio #国内地址
https://dl.min.io/client/mc/release/linux-amd64/ #官方地址,更新较快
单节点部署
环境准备:
192.168.51.252 ubuntu 24.04
minio版本: RELEASE.2024-06-13T22-53-53Z
1、将下载的minio二进制文件放置到/usr/bin/minio中,如下:

2、创建数据存储目录,执行如下命令:
mkdir -p /data/minio/{data,logs}
3、编写启动minio.sh 脚本,如图:

- MINIO_ACCESS_KEY: 启动后的管理员登录账号,新版本已使用MINIO_ROOT_USER
- MINIO_SECRET_KEY: 登录密码,新版本已使用MINIO_ROOT_PASSWORD
- 9001:后台登录的端口,可自定义
- 9002:API端口,可自定义
- running.log启动日志
#!/bin/bash
export MINIO_ACCESS_KEY="minio"
export MINIO_SECRET_KEY="Abcd1234"
case $1 in
start)
nohup /usr/bin/minio server /data/minio/data \
--console-address :9001 \
--address :9002 > /data/minio/logs/running.log 2>&1 &
;;
stop)
ps -ef |grep minio |grep -v grep |awk '{print $2}' | xargs kill -9
;;
*)
echo " input error...,please check!!!"
esac
4、通过systemd托管,查看下面的的分布式部署中的服务托管部分
5、启动,通过上面的账号密码登录,创建一个用户,指定管理员权限,如图:


新建后,将上述minio.sh脚本中的MINIO_ACCESS_KEY和MINIO_SECRET_KEY注释,然后重启即可
注:如果不使用MINIO_ACCESS_KEY和MINIO_SECRET_KEY,默认的账号密码为minioadmin/minioadmin,使用后即可替换到默认账号密码,添加完新用户后,将MINIO_ACCESS_KEY和MINIO_SECRET_KEY删除,保证安全
分布式部署
注意前提:不能将数据目录放在根目录下,否则启动不了,会报错:
Unable to use the drive http://......: drive not found
可以通过添加一块新的磁盘,然后将数据目录放在新的磁盘即可
环境准备:
#minio1-4表示主机名
minio1 :192.168.226.131 centos7系统
minio2 :192.168.226.132 centos7系统
minio3 :192.168.226.133 centos7系统
minio4 :192.168.226.134 centos7系统
安装(四台机器执行同样的动作):
1、创建bin文件夹用于存放minio二进制文件和数据存储路径,执行命令:
mkdir –p /usr/local/minio/bin
mkdir -p /usr/local/minio/data
3、将minio二进制文件上传到bin目录下:

4、编辑/etc/hosts文件,添加内容如下:

5、编辑启动脚本,restart.sh,内容如下:

#!/bin/bash
export MINIO_ACCESS_KEY="minioadmin"
export MINIO_SECRET_KEY="hdb@5182086#"
case $1 in
start)
nohup /usr/local/minio/bin/minio server http://minio{1...4}/usr/local/data/data1 >/usr/local/minio/logs/running.log 2>&1 &
;;
stop)
ps -ef |grep minio |grep -v grep |awk '{print $2}' | xargs kill -9
;;
*)
echo " input error...,please check!!!"
esac
#export MINIO_ACCESS_KEY表示登录minio的用户名,MINIO_SECRET_KEY表示登录的密码,直接写在脚本文件中即可
#用case命令做判断,当传入参数为start时,开启minio,命令中的minio{1…4},表示minio1、minio2、minion3、minion4,与机器IP对应,在上一步骤中已经指定data1和logs目录也需要提前创建,当传入stop参数,停止minio
6、编写minio.service文件,通过systemd进行托管,如下:

[Unit]
Description=minio service
After=network.target
[Service]
Type=forking
WorkingDirectory=/usr/local/minio
ExecStart=/bin/bash /usr/local/minio/bin/restart.sh start
ExecStop=/bin/bash /usr/local/minio/bin/restart.sh stop
#RestartSec=60
StartLimitIntervalSec=180
StartLimitBurst=3
Restart=on-failure
#Group=ody
#User=ody
[Install]
WantedBy=multi-user.target
7、 通过systemctl start/stop/enable/restarat minio即可实现托管,如图 :

如果要指定控制台端口为9011和api端口为9010,可修改内容如下:
nohup /usr/bin/minio server \
http://minio{1..4}/data/minio/data > /data/minio/logs/running.log 2>&1 \
--address ":9010" \
--console-address ":9011" &
集群健康状态检测
1、检测是否可写:如果可写返回200,否则返回503,服务不可用:
curl -i http://192.168.226.131:9000/minio/health/cluster

2、 检测集群是否可读,如果可读返回200,否则返回503,服务不可用:
curl -i http://192.168.226.131:9000/minio/health/cluster/read

3、检查集群状态是否可以维护,如果可以返回200,否则返回412,HA失效:
curl -i http://192.168.226.133:9000/minio/health/cluster?maintenance=true

注意:只要集群中任何一个节点down或者Minio服务关闭 , 就会出现412 ,如下:

可通过任何一个节点的http地址来访问minio集群,也可以通过在前方部署一个Nginx来代理到后端的4个minio
通过客户端来操作minio
环境准备:
192.168.226.130 centos7
1、 下载客户端二进制文件,下载地址如下: http://dl.minio.org.cn/client/mc/release/linux-amd64/mc
直接将mc放在环境变量中即可,如下:
#注:mc建议不要和minio在同一台机器,可以远程管理
mv mc /usr/bin/ #放在/usr/bin路径下
2、 查看mc当前可管理的服务,可以看到为空,因为没有认证凭据,如图:

3、添加一个云存储服务到mc中,mc的所有配置信息都保存在~/.mc/config.json中,,执行命令如下:
mc config host add minio http://192.168.226.131:9000 minioadmin hdb@5182086#
注意:url地址就是我们搭建的minio的地址,url后面为启动minio时配置的ACCESS_KEY和SECRET_KEY
API参数为可选参数,默认情况下设置为s3v4,add后面的存储名称可以自定义,不一定非要为minio
注意:添加完云存储后,可以在本地看到minio集群中的存储桶以及内容,如果要移除云存储,可执行命令mc config host remove minio即可
4、 配置完成后,执行命令mc alias list 可以看到配置后的清单,后续执行任何命令都是针对下图中这个minio服务的, 如图:

5、执行命令mc ls minio,即可查看当前minio存储上的存储桶情况,如图:

6、执行命令mc mb minio/guangzhou 可创建一个存储桶,如图:

7、 登录页面,也可以看到创建的存储桶,如图:

8、执行命令mc cp 文件名 minio/guangzhou ,将文件拷贝过去,如图:


minio两个集群内容如何做同步
环境准备:
minio集群1 192.168.226.128 centos7
minio集群2 192.168.226.129 centos7
客户端工具 192.168.226.130 centos7
步骤:
1、首先登录客户端机器,将两个minio集群都添加到云存储中,执行命令如下:
#将minio集群1的云存储服务命名为oldmino
mc config host add oldminio http://192.168.226.128:9000 minioadmin minioadmin --api s3v4
##将minio集群2的云存储服务命名为newmino
mc config host add oldminio http://192.168.226.129:9000 minioadmin minioadmin --api s3v4
2、添加完车后,执行命令mc alias list,查看如下:

3、通过mc ls oldminio/newminio查看存储桶情况,如图:

4、通过mc mirror -a oldminio newminio命令即可将oldminio中的所有内容同步到newminio中,如图:

Minio多用户权限管理
Minio服务启动后,默认情况下可通过初始化的管理用户来登录控制台页面,minio也支持多个长期用户,服务启动后,可以添加多个用户,并针对不同的用户设置不同的存储桶资源(包括删除、上传、下载)
步骤如下:
1、首先找一台除了集群之外的机器,部署mc客户端,并添加云存储服务,可参考上面教程,添加后的内容如图:

2、通过命令user来管理用户
创建用户:通过命令mc admin user add minio newuser newuser123 为minio存储服务创建用户newuser,newuser123表示用户密码 , 也可以直接输入mc admin user add minio 然后根据提示输入用户名和密码即可

查看用户:查看当前minio服务下面的全部用户,如图:

删除用户:删除用户 8856769,如图:

禁用用户:mc amdin user disable minio newuser,如图:

启用用户:mc admin user enable minio newuser,如图:

以JSON格式显示用户:mc admin user list –json minio,如图:

显示用户信息:mc admin user info minio newuser,如图:

3、通过命令group来管理组:
创建组:在minio上将用户newuser加入到组newgroup中,如果不存在此组将会自动创建,如图:

删除组内用户:mc admin group remove minio newgroup newuser,如图:

删除给定组:只有组内为空时才可以删除,mc admin group remove minio newgroup,如图:

列出所有组:mc admin group list minio,如图:

禁用组:mc admin group disable minio newgroup ,如图:

启用组:mc admin group enable minio newgroup,如图:

获取组的所有信息,mc admin group info minio newgroup ,如图:

4、管理访问策略:
查看默认策略:mc admin policy list minio ,如图:

自定义策略:除了默认策略,也可以自定义策略,编辑文件system.json如图:

- Version:默认版本,不可以写其他时间
- Effect:值为Allow或者deny,表示允许或者拒绝下面设置的访问权限
- Action:配置权限、上传、删除、下载等权限
- Resource:配置权限的作用范围
图中的权限设置可以理解为对于存储桶hello、linshi、nihao以及下面的对象,具有上传、下载、删除和列出来的权限
注意:json文件中的格式,以及每行后的逗号
添加策略:将策略添加到minio服务中,mc admin policy create minio newpolicy system.json,如图:

再次查看minio上的策略名称,如图:

将策略应用到用户:mc admin policy attach minio newpolicy –user newuser,如图:


验证:此时通过newuser登录minio服务,可以看到对应的组,并可实现上传下载删除,但是不能创建存储桶,如图:

查看策略文件内容,mc admin policy info minio newpolicy ,如图:

注:其他默认的策略也可以通过此命令查看
删除策略:mc admin policy remove minio newpolicy
如果前端通过nginx访问minio下载时报出现跨域问题,此时可以在Nginx配置文件中配置跨域,下图add_header部分,如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name sunh.doc.net;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
root /usr/share/nginx/html;
}
创建Access Key
Access Key和上面创建的user有什么区别?
- Access Key主要用于程序化访问,user一般用于控制台页面访问
- Access Key继承父用户(user)或父用户所在群组的权限,user具有直接权限
- Access key 可以创建多个
注:如果创建了用户testuser,那么在testuser用户下创建的access key 将继承testuser的权限
1、创建用户testuser,如图:

2、定义策略文件,使其对test-bucket存储桶具有权限,如图:

创建策略,查看策略,如图:

3、将策略应用到用户testuser,如图:

4、通过testuser登录控制台页面即可看到存储桶信息,如图:

5、定义一个附加策略文件,创建access key 使用,如图:

注:附加的策略不能授权访问父用户策略未明确允许的任何操作或资源
6、执行如下命令创建access key ,如下:
mc admin user svcacct add --access-key "Hello12345@56789" --secret-key "World34567#987651" --policy "./tuacckey.json" minio testuser


通过docker容器搭建单节点minio
1、下载minio,执行命令如下:
docker pull minio/minio
2、执行命令启动minio
docker run -itd --name minio1 -p 9000:9000 -p 9003:9001 -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=5182086abcD#" -v /data/minio/data/:/data -v /data/minio/config:/root/.minio minio/minio server /data --console-address ":9001"
#MINIO_ACCESS_KEY:登录用户名
#MINIO_SECRET_KEY:登录密码
#console-address:控制台端口,也就是登录页面的端口,可自定义
#9000:minio的api接口端口,用于上传和下载
3、通过ip和端口访问页面,如图:

4、如果要通过url实现下载,需要将存储桶改为public,如图:.

在分享页面,可以看到IP地址是容器内部的IP地址,如图:

上面这个链接只是一个临时链接,是有有效期的,如果要使用永久链接,那么直接用minio地址/bucket存储桶/file文件来下载即可,如下:
http://10.9.2.248:9000/test/33.png #9000为api接口,不是登录控制台端口
注意:这个9000是创建的时候指定的API接口,不是登录页面使用的端口9001
5、如果只是浏览而不下载,比如浏览pdf、图片,此时需要针对存储桶添加策略,首先选择存储桶,如下:

点击Anonymous,如图:

点击Add Access Rule,如图:

设置规则,Prefix可根据需要设置,我这里选择*表示所有前缀,如图:

最后访问图片,可以看到能够正常加载出来,如图:

附加:
当我们通过minio页面来上传文件的时候,如果上传的是jpg格式图片,那么Content-Type的类型实际为image/jpeg,如图:

如果上传的是png格式图片,那么Content-Type的类型实际为image/png,如图:

minio会根据上传文件的后缀来区分要设置Content-Type的类型,文件对应的类型关系如下:
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
因此,如果我们通过程序来向minio中存储文件的时候,一定要区分文件类型来设置合适的Contene-Type,否则会出现无法访问的问题,比如我们上传png图片的时候,选择了application/octet-stream类型,那么浏览器在访问这个图片的时候,根据这个类型就会认为这文件需要下载而不是浏览,就会下载图片,那么我们想浏览图片的目的就达不到了


