MinIO轻量分布式对象存储服务的简单使用 | 青训营笔记

377 阅读2分钟

MinIO轻量分布式对象存储服务的简单使用 | 青训营笔记

这是我参与「第五届青训营 」笔记创作活动的第7天

前言

MinIO 是一款轻量、高性能、分布式的对象存储系统,它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM映像。作为对象存储而言是极为优秀的。本次青训营后期大项目中的视频对象存储可以考虑使用MinIO实现。

目录

搭建分布式MinIO服务器

本文使用docker搭建和管理分布式MinIO集群

  • 先自行安装docker和docker-compose

    image-20230128203416329

  • 编写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 image-20230128204918388

    集群顺利启动 image-20230128205025644

web页面操作

image-20230128212915862

可视化操作,没什么说的

Go语言API操作

导入minio的sdkimport "github.com/minio/minio-go/v7"

初始化MinioClient

参数描述
endpoint对象存储服务的URL
accessKeyIDAccess key是唯一标识你的账户的用户ID。
secretAccessKeySecret key是你账户的密码。
securetrue代表使用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初使化成功
}

创建桶

参数类型描述
bucketNamestring存储桶名称
locationstring存储桶被创建的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)
   }
}

上传文件

参数类型描述
bucketNamestring存储桶名称
objectNamestring对象的名称
filePathstring要上传的文件的路径
optsminio.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)

下载文件

参数类型描述
bucketNamestring存储桶名称
objectNamestring对象的名称
filePathstring下载后保存的路径
optsminio.GetObjectOptionsGET请求的一些额外参数,像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)