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类型,那么浏览器在访问这个图片的时候,根据这个类型就会认为这文件需要下载而不是浏览,就会下载图片,那么我们想浏览图片的目的就达不到了

标签