minio 分布式对象存储

最后更新于:2022-04-02 04:02:26

[TOC] > [home](https://min.io/download#/linux) ## 安装 ### 单机版 #### docker `docker run -p 9000:9000 -v /mnt/data:/data minio/minio server /data` web : `http://127.0.0.1:9000/` 账号密码: `minioadmin/minioadmin` #### window #### mac #### linux ### 分布式MinIO快速入门 > [参考](https://docs.min.io/cn/distributed-minio-quickstart-guide.html) 1. 数据保护 分布式Minio采用[纠删码](https://docs.min.io/cn/minio-erasure-code-quickstart-guide)来防范多个节点宕机和[位衰减`bit rot`](https://github.com/minio/minio/blob/master/docs/zh_CN/erasure/README.md#what-is-bit-rot-protection)。 分布式Minio至少**需要4个硬盘**,使用分布式Minio自动引入了纠删码功能。 2. 高可用 单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。 例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。 注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。 3. 一致性 Minio在分布式和单机模式下,所有读写操作都严格遵守**read-after-write**一致性模型 启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。 ``` //启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令。 export MINIO_ACCESS_KEY= export MINIO_SECRET_KEY= minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \ http://192.168.1.13/export3 http://192.168.1.14/export4 \ http://192.168.1.15/export5 http://192.168.1.16/export6 \ http://192.168.1.17/export7 http://192.168.1.18/export8 ``` ## MinIO客户端 ``` ls 列出文件和文件夹。 mb 创建一个存储桶或一个文件夹。 cat 显示文件和对象内容。 pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。 share 生成用于共享的URL。 cp 拷贝文件和对象。 mirror 给存储桶和文件夹做镜像。 find 基于参数查找文件。 diff 对两个文件夹或者存储桶比较差异。 rm 删除文件和对象。 events 管理对象通知。 watch 监听文件和对象的事件。 policy 管理访问策略。 session 为cp命令管理保存的会话。 config 管理mc配置文件。 update 检查软件更新。 version 输出版本信息。 ``` ### 安装 ``` docker pull minio/mc //运行 docker run minio/mc ls play ``` [其他平台的客户端](https://docs.min.io/cn/minio-client-quickstart-guide.html) ## 接口 ### golang
fileupload.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) } ```

';