MinIO轻量分布式对象存储服务的简单使用 | 青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第7天
前言
MinIO 是一款轻量、高性能、分布式的对象存储系统,它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM映像。作为对象存储而言是极为优秀的。本次青训营后期大项目中的视频对象存储可以考虑使用MinIO实现。
目录
搭建分布式MinIO服务器
本文使用docker搭建和管理分布式MinIO集群
-
先自行安装docker和docker-compose
-
编写docker-compose.yaml 此处使用了nginx实现分布式服务器的反向代理
version: '3.7' x-minio-common: &minio-common image: minio/minio:latest command: server --console-address ":9001" http://minio{1...4}/data{1...2} expose: - "9000" - "9001" environment: MINIO_ROOT_USER: minio MINIO_ROOT_PASSWORD: minio123 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 services: minio1: <<: *minio-common hostname: minio1 volumes: - ./data/data1-1:/data1 - ./data/data1-2:/data2 minio2: <<: *minio-common hostname: minio2 volumes: - ./data/data2-1:/data1 - ./data/data2-2:/data2 minio3: <<: *minio-common hostname: minio3 volumes: - ./data/data3-1:/data1 - ./data/data3-2:/data2 minio4: <<: *minio-common hostname: minio4 volumes: - ./data/data4-1:/data1 - ./data/data4-2:/data2 nginx: image: nginx:alpine hostname: nginx volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf:ro - ./log/nginx:/var/log/nginx:rw - ./data/cache/nginx:/usr/local/nginx/conf/cache:rw ports: - "9000:9000" - "9001:9001" depends_on: - minio1 - minio2 - minio3 - minio4 -
启动集群
docker-compose up集群顺利启动
web页面操作

可视化操作,没什么说的
Go语言API操作
导入minio的sdk
import "github.com/minio/minio-go/v7"
初始化MinioClient
| 参数 | 描述 |
|---|---|
| endpoint | 对象存储服务的URL |
| accessKeyID | Access key是唯一标识你的账户的用户ID。 |
| secretAccessKey | Secret key是你账户的密码。 |
| secure | true代表使用HTTPS |
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)
}
log.Printf("%#v\n", minioClient) // minioClient初使化成功
}
创建桶
| 参数 | 类型 | 描述 |
|---|---|---|
bucketName | string | 存储桶名称 |
location | string | 存储桶被创建的region(地区),默认是us-east-1(美国东一区),下面列举的是其它合法的值。注意:如果用的是minio服务的话,resion是在它的配置文件中,(默认是us-east-1)。 |
func createBucket() {
bucketName := "mymusic"
err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: "cn-south-1",ObjectLocking: false})
if err != nil {
log.Println("创建bucket错误: ",err)
exists, _ := client.BucketExists(ctx, bucketName)
if exists {
log.Printf("bucket: %s已经存在",bucketName)
}
} else {
log.Printf("Successfully created %s\n", bucketName)
}
}
上传文件
| 参数 | 类型 | 描述 |
|---|---|---|
bucketName | string | 存储桶名称 |
objectName | string | 对象的名称 |
filePath | string | 要上传的文件的路径 |
opts | minio.PutObjectOptions | 允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。 |
n, err := minioClient.FPutObject("my-bucketname", "my-objectname", "my-filename.csv", minio.PutObjectOptions{
ContentType: "application/csv",
});
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Successfully uploaded bytes: ", n)
下载文件
| 参数 | 类型 | 描述 |
|---|---|---|
bucketName | string | 存储桶名称 |
objectName | string | 对象的名称 |
filePath | string | 下载后保存的路径 |
opts | minio.GetObjectOptions | GET请求的一些额外参数,像encryption,If-Match |
err = minioClient.FGetObject("mybucket", "myobject", "/tmp/myobject", minio.GetObjectOptions{})
if err != nil {
fmt.Println(err)
return
}
引用参考
MinIO Go Client API文档 | Minio中文文档
minio/minio-go: MinIO Go client SDK for S3 compatible object storage (github.com)