什么是 MinIO?
Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如 NodeJS、Redis、MySQL等。
1)MinIO 的应用场景
如下图,MinIO 的应用场景除了可以作为私有云的对象存储服务来使用,也可以作为云对象存储的网关层,无缝对接 Amazon S3
或者 MicroSoft Azure
。
2)特点
-
高性能:
作为一款高性能存储,在标准硬件条件下,其读写速率分别可以达到55Gb/s
和35Gb/s
。并而 MinIO 支持一个对象文件可以是任意大小,从几kb到最大5T不等。 -
可扩展:
不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心。 -
云原生:
容器化、基于K8S的编排、多租户支持。 -
Amazon S3兼容:
使用 Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK 和 AWS CLI 访问Minio服务器。 -
可对接多种后端存储:
除了Minio自己的文件系统,还支持 DAS、 JBODs、NAS、Google云存储和 Azure Blob存储。
部署与使用
minio分服务端minio 和客户端工具mc 两个
wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
客户端也是一个命令行工具,mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
mv mc /usr/local/bin/
docker安装
docker run \
-p 9000:9000 \
-p 9001:9001 \
minio/minio server /data --console-address ":9001"
docker run -p 9000:9000 --name minio1 \
-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server /data
这里的9000端口是api调用的,
9001是web ui的页面,直接访问http://ip:9001 然后输入默认账密: minioadmin/minioadmin 登陆
minio服务配置
MinIOserver在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json
文件中
可以使用--config-dir命令行选项重写
minio server --config-dir /etc/minio /data
证书目录默认在${HOME}/.minio/certs
目录下,如果需要TLS,需要将证书放在该目录来启用https
MinIO Client(mc)提供了“ admin”子命令来对您的MinIO部署执行管理任务
service 服务重启并停止所有MinIO服务器
update 更新更新所有MinIO服务器
info 信息显示MinIO服务器信息
user 用户管理用户
group 小组管理小组
policy MinIO服务器中定义的策略管理策略
config 配置管理MinIO服务器配置
heal 修复MinIO服务器上的磁盘,存储桶和对象
profile 概要文件生成概要文件数据以进行调试
top 顶部提供MinIO的顶部统计信息
trace 跟踪显示MinIO服务器的http跟踪
console 控制台显示MinIO服务器的控制台日志
prometheus Prometheus管理Prometheus配置
kms kms执行KMS管理操作
启用shell自动补全
下载官方提供的自动补全配置,使用时 按TAB键补全
sudo wget https://raw.githubusercontent.com/minio/mc/master/autocomplete/bash_autocomplete -O /etc/bash_completion.d/mc
source /etc/bash_completion.d/mc
MinIO Client(mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案
在没有配置minio服务端时,执行以下命令就像执行系统命令,操作的也是系统上的文件,而不是minio
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹。
cat 显示文件和对象内容。
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
find 基于参数查找文件。
diff 对两个文件夹或者存储桶比较差异。
rm 删除文件和对象。
events 管理对象通知。
watch 监听文件和对象的事件。
policy 管理访问策略。
session 为cp命令管理保存的会话。
config 管理mc配置文件。
update 检查软件更新。
version 输出版本信息。
配置服务器地址 | mc alias set myminio http://10.10.1.32:9000 minioadmin minioadmin |
创建一个bucket | mc mb myminio/test2 |
上传文件 | mc cp /var/log/messages myminio/test2 |
列出目录文件 | mc ls myminio/test2 |
查看文件内容 | mc cat myminio/test2/messages |
删除文件或对象 | mc rm myminio/test2/messages |
事件通知
如果bucket发生了上传对象或删除对象等,通过存储桶事件通知机制进行监控,并支持mq,sql,webhooks等发送出去,或存储起来
webhooks发布minio事件
webhooks是采用推送的方式,将数据发送给定义好的api
配置webhook
localhost:3000是自已编写的api接口
"webhook": {
"1": {
"enable": true,
"endpoint": "http://localhost:3000/"
}
启用bucket通知
新增一个名称为images 的bucket,并开启事件通知
#创建bucket
mc mb myminio/images
#创建bucket
mc mb myminio/images-thumbnail
#开启事件通知 ARN是arn:minio:sqs:us-east-1:1:webhook
mc event add myminio/images arn:minio:sqs:us-east-1:1:webhook --events put --suffix .jpg
查看事件通知列表
mc event list myminio/images
当有上传和删除等操作时,通过自已的3000端口api,可以收到相应通知信息
arn:minio:sqs:us-east-1:1:webhook s3:ObjectCreated:* Filter: suffix=".jpg"
监控
以下接口需要通知9000端口访问
minio默认提供了2个接口路径做健康检查
- 活力探针
/minio/health/live
活动性探针-服务器是否工作正常 - 就绪探针
/minio/health/ready
就绪性探针-指示服务器是否由于重负载而未接受连接
集成到prometheus
默认也是公开接口并提供了相关监控数据,给到prometheus抓取指标
- Prometheus 数据可在
/minio/prometheus/metrics
配置prometheus监控minio
scrape_configs:
- job_name: minio-job
metrics_path: /minio/prometheus/metrics
scheme: http
static_configs:
- targets: ['localhost:9000']
复制代码
具体指标含义请参考:如何使用Prometheus监控MinIO服务器
示例-文件上传
本示例连接到一个对象存储服务,创建一个存储桶并上传一个文件到存储桶中。
我们在本示例中使用运行在 https://play.min.io 上的MinIO服务,你可以用这个服务来开发和测试。示例中的访问凭据是公开的。
FileUploader.go
package main
import (
"github.com/minio/minio-go/v6"
"log"
)
func main() {
endpoint := "play.min.io"
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// 初使化minio client对象。
minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
if err != nil {
log.Fatalln(err)
}
// 创建一个叫mymusic的存储桶。
bucketName := "mymusic"
location := "us-east-1"
err = minioClient.MakeBucket(bucketName, location)
if err != nil {
// 检查存储桶是否已经存在。
exists, err := minioClient.BucketExists(bucketName)
if err == nil && exists {
log.Printf("We already own %s\n", bucketName)
} else {
log.Fatalln(err)
}
}
log.Printf("Successfully created %s\n", bucketName)
// 上传一个zip文件。
objectName := "golden-oldies.zip"
filePath := "/tmp/golden-oldies.zip"
contentType := "application/zip"
// 使用FPutObject上传一个zip文件。
n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, n)
}
2.3上传文件到桶的子文件夹下
子文件夹的创建是在文件名前使用,而不是作为桶的后缀
minioClient.putObject("asiatrip","ppp/minio.png", "C:\\Users\\Administrator\\Desktop\\minio.png");
2.4 文件链接获取
getObjectURL()获取桶内文件的url地址,如果设置了只写权限,用户直接访问地址是查看不了的
getObgect()可以获取桶内对应文件的流对象,进行文件流传输
presignedGetObject()返回的是进行加密算法的地址,通过它可以直接访问文件
设置有效期的分享链接(共享文件时间最大7天)
minioClient.getPresignedObjectUrl(Method.GET,"asiatrip","minio.png",10,null)有效期10秒,可以通过get方式访问
3.操作对象
使用的类都是MinioClient对象
3.1 对存储桶操作方法
makeBucket 创建桶
listBuckets 列出当前所有桶
bucketExists 判断桶是否存在
removeBucket 移除桶
listObjects 获取桶内的内容
listIncompleteUploads 获取上传中断的内容,支持断点续传
3.2 对文件操作方法
getObject 下载文件
putObject 上传文件
copyObject 复制文件
statObject 查看文件状态
removeObject 删除文件
removeIncompleteUpload 删除上传中断的文件
3.3 Presigned操作
签名加密操作
presignedGetObject 用于获取桶内文件的get下载链接
presignedPutObject 用于获取桶内文件的上传链接
presignedPostPolicy 用于设置返回和访问链接的编解码算法
3.4 对存储桶策略操作
存储桶的策略主要是设置读写权限,当访问文件地址时会对策略进行判断是否开放相应的功能
getBucketPolicy 获取策略信息
setBucketPolicy 设置策略信息
http://docs.minio.org.cn/minio/baremetal/
http://docs.minio.org.cn/docs/
MinIO 教程