英文官网:https://min.io/
中文官网:http://minio.org.cn/(更新不及时,容易被坑)
一、为什么要使用MinIO
其实抛开Ceph这类复杂的存储解决方案外,小公司小团队的选择一般都会是FastDFS或者MinIO,那么这里我们就简单对比下MinIO相较于FastDFS的优势!
1、安装部署(运维)复杂度
虽然我觉得FastDFS安装也不算很复杂,但是MinIO的安装可以说更简单;
FastDFS安装:https://www.jiguiquan.com/?p=2133
2、文档
FastDFS可以说发展了十几年几乎没有官方文档,都是靠热心网友投稿;
而MinIO文档还是比较全的,中文文档:http://docs.minio.org.cn/docs/master/minio-monitoring-guide
3、开源项目运营组织
FastDFS是阿里余庆大神的一个个人项目,而MinIO背靠的是Apache开源组织;
4、UI界面
FastDFS默认是不带UI界面的,而MinIO服务部署时候,是自带UI界面的,开箱即用;
5、性能
MinIO号称是世界上速度最快的对象存储服务器,标准硬件设备上,读/写速度都是GB级别的;FastDFS差多了;
6、容器化支持
MinIO提供了与k8s、etcd、docker等容器化技术深度集成方案,可以说就是为了云环境而生的。这点是FastDFS不具备的。
7、丰富的SDK支持
MinIO支持的不同语言SDK多于FastDFS,尤其文档,更是完胜;
8、AWS S3标准兼容
Amazon的S3 API是对象存储领域的事实标准。MinIO是S3兼容性的事实上的标准,是第一个采用API和第一个添加对S3 Select支持的标准之一。包括微软Azure在内的750多家公司使用MinIO的S3网关,这一数字超过了业内其他公司的总和。
什么意思?就是说你现在为了节约成本使用MinIO,等你的公司壮大了、有钱了。不想自己运维基础设施了,你就可以把对象存储放到云上,只要云厂商支持S3标准,你的应用程序是不需要重新开发的。
二、MinIO的部署之Centos单机部署
此单机模式,每一份对象数据,minio直接在data目录下存储一份数据,不会建立副本,也不会启用纠删码机制(数据恢复),存在单点故障;
1、直接下载二进制执行文件,并启动:
文件下载地址:https://min.io/download#/linux
wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
后端调用就是9000端口,访问前端页面就是9001端口:
一切都是如此的简单!
编写一个后台运行的nohup脚本runminio.sh:
#!/bin/bash export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=Haier2022 nohup /usr/local/minio/minio server /mnt/data --console-address ":9001" > log.file 2>&1 & #默认服务端口为9000,如果端口冲突,可以修改端口 nohup /usr/local/minio/minio server /mnt/data --address ":9999" --console-address ":9001" > log.file 2>&1 &
2、配置Minio的开机自启:
创建配置文件:minio.conf
[root@localhost minio]# mkdir /usr/local/minio/conf [root@localhost minio]# vim /usr/local/minio/conf/minio.conf MINIO_VOLUMES="/data/minio" MINIO_OPTS="--console-address :9001" MINIO_ROOT_USER="admin" MINIO_ROOT_PASSWORD="Wolong2022" MINIO_SERVER_URL="http://192.168.0.117:9000"
在/etc/systemd/system目录下新建一个服务minio.service
[root@localhost minio]# vim /etc/systemd/system/minio.service [Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/minio/minio [Service] User=root Group=root EnvironmentFile=/usr/local/minio/conf/minio.conf ExecStart=/usr/local/minio/minio server $MINIO_OPTS $MINIO_VOLUMES # Let systemd restart this service always Restart=always # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=65536 # Disable timeout logic and wait until process is stopped TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target
3、启动minio并设置开机自启:
[root@localhost minio]# systemctl start minio [root@localhost minio]# systemctl enable minio Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service. [root@localhost minio]# systemctl status minio ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled) Active: active (running) since 二 2022-11-01 15:19:19 CST; 14s ago Docs: https://docs.min.io Main PID: 34443 (minio) CGroup: /system.slice/minio.service └─34443 /usr/local/minio/minio server --console-address :9001 /data/minio
三、MinIO的部署之Docker单机部署
此单机模式,每一份对象数据,minio直接在data目录下存储一份数据,不会建立副本,也不会启用纠删码机制(数据恢复),存在单点故障;
直接执行docker命令:
docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=password" \ -v /mnt/data:/data \ -v /mnt/config:/root/.minio \ quay.io/minio/minio server /data --console-address ":9001"
四、MinIO的部署之纠删码模式部署
该部署模式使用纠删码(Reasure Code)和校验checksum来保护数据免受硬件故障或无声数据损坏,即使你丢了一般数量(N/2)的硬盘,你仍可以恢复数据!
纠删码技术的官方描述资料:http://docs.minio.org.cn/docs/master/minio-erasure-code-quickstart-guide
使用docker进行单机版的纠删码模式部署:
docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=password" \ -v /mnt/data1:/data1 \ -v /mnt/data2:/data2 \ -v /mnt/data3:/data3 \ -v /mnt/data4:/data4 \ -v /mnt/data5:/data5 \ -v /mnt/data6:/data6 \ -v /mnt/data7:/data7 \ -v /mnt/data8:/data8 \ -v /mnt/config:/root/.minio \ quay.io/minio/minio server /data{1...8} --console-address ":9001"
执行成功后,我们登录到后台,然后上传几个文件看看效果:
[root@node2 /]# tree /mnt /mnt ├── config │ └── certs │ └── CAs ├── data │ └── haier │ ├── harbor-offline-installer-v1.10.10.tgz │ ├── maven.jpeg │ └── nexus3.jpg ├── data1 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data2 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data3 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data4 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data5 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data6 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta ├── data7 │ └── haier │ ├── maven.jpeg │ │ └── xl.meta │ └── nexus3.jpg │ └── xl.meta └── data8 └── haier ├── maven.jpeg │ └── xl.meta └── nexus3.jpg └── xl.meta 37 directories, 19 files
此时,我做了一次简单的测试,删盘(其实是删除文件夹):
当我删除4个文件夹时候,数据依然可以正常访问;
当我删除第5个文件夹时候,数据文法正常访问,UI页面无法登录,报错:
五、MinIO的部署之分部署集群部署
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量,新版本使用MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD。
分布式Minio使用的磁盘里必须是干净的,里面没有数据。
下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
比如我打算用三台机器部署分布式集群,挂载6块盘
1、首先,在三台机器的 /usr/local/minio 目录下下载好我们的minio程序,并添加环境变量:
chmod +x minio export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=Haier2022
2、在每台机器上,都执行以下命令,启动集群:
nohup /usr/local/minio/minio server --config-dir /minio/config --address ':9000' --console-address ':9001' \ http://10.206.73.154/minio/data1 http://10.206.73.154/minio/data2\ http://10.206.73.155/minio/data1 http://10.206.73.155/minio/data2\ http://10.206.73.156/minio/data1 http://10.206.73.156/minio/data2> /usr/local/minio/log.file 2>&1 &
但是当我们执行时,经常会碰到这个问题:
即必须要使用新的挂载磁盘,不可以使用与系统root目录相同的磁盘;这时候我们就要想办法先给系统挂载一块新磁盘到 /minio 目录上,之后才能进行之后的操作了!
3、挂载完了,但是我只有一块机器有磁盘,将就一下:
nohup /usr/local/minio/minio server --config-dir /minio/config --address ':9000' --console-address ':9001' \ http://10.206.73.156/minio/data1 http://10.206.73.156/minio/data2 \ http://10.206.73.156/minio/data3 http://10.206.73.156/minio/data4 \ http://10.206.73.156/minio/data5 http://10.206.73.156/minio/data6> /usr/local/minio/log.file 2>&1 &
4、在minio的9001面板中,对服务进行监控:
六、MinIO如何配置公共读/私有写权限(最常见)
首先,需要了解MinIO基于策略的权限控制系统(PBAC)
1、首先我们将创建的bucket桶,设置为private:
默认就是private,就不截图了!
2、在匿名(Anonymous)下添加一个 * 只读权限,即可实现公共读:
3、创建一个自己的AccessKey,并配置对应的PBAC权限:
PBAC权限的格式是简单的json,很容易理解:
默认创建的AccessKey的标准权限很多,如下:
{ "Version":"2012-10-17", "Statement":[ Object{...}, { "Effect":"Allow", "Action":[ "admin:*" ] }, { "Effect":"Allow", "Action":[ "kms:*" ] }, { "Effect":"Allow", "Action":[ "s3:*" ], "Resource":[ "arn:aws:s3:::*" ] }, { "Effect":"Allow", "Action":[ "s3:PutObject" ], "Resource":[ "arn:aws:s3:::*" ] }, { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetBucketLocation" ], "Resource":[ "arn:aws:s3:::*" ] } ] }
我们可以简化一下,只留自己需要的权限,一版对于AccessKey,我们只会保留简单的“文件上传PutObejct”和“文件查看GetObject”权限:
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject" ], "Resource":[ "arn:aws:s3:::jiguiquan/*" ] }, { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetBucketLocation" ], "Resource":[ "arn:aws:s3:::*" ] } ] }
注意其中的“jiguiquan/*”代表,jiguiquan这个桶下面的所有路径!
这样就实现了“公共读,授权写”的功能,且使用此accessKey只有jiguiquan这个桶的上传权限!—— 正常工作中,做到这和个程度就OK了!