前两天跟大家分享了一篇关于如何利用fastdfs组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下《》。通过留言发现大家虽然感兴趣,但是都觉得部署比较麻烦。的确,fastdfs的部署很繁琐,而且也没有官方提供的针对.net core的sdk。而今天带来的minio则是一个比fastdfs更好的选择,可以让你足够简单的来部署使用,官方也提供了足够详细的api文档。下面就让我们开始今天的正文吧。

这里说明下为什么今天才进行分享,因为就在几个小时前官方才发布了最新的3.1.12版本的nuget包,解决了bucketexistsasync的一个bug,不然你还得引用源码才能正常运行。

作者:依乐祝

原文地址:

minio是什么?

官方对minio的介绍是:高性能,kubernetes原生支持的对象存储系统。minio的高性能软件定义对象存储套件可以使用户能够为机器学习、分析和应用程序数据工作负载构建云原生支持的数据基础设施。下面是几个常用的网址

  • 官网:
  • 开源地址:
  • 中文文档:
  • .net 客户端api地址:
  • 下载地址:
  • minio-dotnet:

minio对象存储与其他有本质的不同。它是为性能和s3 api而设计的并100%开源。minio非常适合具有严格安全性,在不同的工作负载范围内要求并提供关键任务可用性的大型私有云环境。

minio是高性能对象存储的先驱

minio是世界上速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度分别为183 gb/s和171 gb/s,可以作为一组不同工作负载的主存储层,这些工作负载包括spark、presto、tensorflow、h2o.ai以及hadoop hdfs的替代品。

建立在web规模的规则之上

minio利用了web定标器来之不易的知识,为对象存储带来了一个简单的定标器模型。在minio,扩展从一个集群开始,这个集群可以与其他minio集群联合以创建一个全局命名空间,如果需要,可以跨越多个数据中心。这也是《财富》500强中超过一半的人使用minio的原因之一。

为云而生

minio是在过去四年中从头开始构建的,是定义云的技术和架构的原生版本。其中包括集装箱化、与kubernetes的协调、微服务和多租户。没有比kubernetes更友好的对象存储了。

排名第一的开源对象存储服务,对企业友好

minio在apache v2许可和affero通用公共许可版本3(agplv3)下是100%开源的。这意味着minio的客户可以自由锁定、自由检查、自由创新、自由修改和自由重新分配。其部署的多样性使该软件变得更加强大,这是专有软件永远无法提供的。

亚马逊s3兼容性的事实标准

amazon的s3 api是对象存储领域的事实标准。minio是s3兼容性的事实上的标准,是第一个采用api和第一个添加对s3 select支持的标准之一。包括微软azure在内的750多家公司使用minio的s3网关,这一数字超过了业内其他公司的总和。

简单并且功能非常强大

极简主义是minio的一个指导性设计原则。简单性减少了错误的机会,提高了正常运行时间,提供了可靠性,同时也为性能奠定了基础。minio可以在几分钟内安装和配置。配置选项和变量的数量保持在最低限度,这将导致几乎为零的系统管理任务和更少的故障路径。

如何安装部署minio

官方提供了傻瓜式的ui页面来让你下载部署。下面以windows系统为例来进行演示。

打开上面列出的几个网址中的下载地址:

点击右侧的下载按钮进行下载即可

然后设置一个文件存储的路径如:e:\minio\data

然后进入minio.exe所在的目录,按住shilft键然后点击鼠标右键打开powershell直接运行如下命令即可:

minio.exe server e:\minio\data

看到如上所示的页面说明minio就已经运行起来了,简单吧!这时候你用浏览器打开

即可看到如下的ui

输入上面显示的access key 以及secret key登录即可

.net core集成

这一小节我们就结合我们之前开发的文件存储微服务来写一个minio的provider来支持minio的文件上传与下载吧。

这里我只是简单的演示下,所以就用官方提供的实例代码继续演示了。

首先引入nuget包,注意就在写这篇文章前几个小时官方才发布了最新的3.1.12版本的nuget包,解决了bucketexistsasync的一个bug,所以今天才进行这篇文章的分享。

install-package minio

然后构建minioclient

 var endpoint  = "127.0.0.1:9000";
            var accesskey = "minioadmin";
            var secretkey = "minioadmin";
            try
            {
                var minio = new minioclient(endpoint, accesskey, secretkey).withssl();
                fileupload.run(minio).wait();
            }
            catch (exception ex)
            {
                console.writeline(ex.message);
            }

上传的代码如下:

private async static task run(minioclient minio)
        {
            var bucketname = "mymusic";
            var location   = "us-east-1";
            var objectname = "golden-oldies.zip";
            var filepath = "c:\\users\\username\\downloads\\golden_oldies.mp3";
            var contenttype = "application/zip";

            try
            {
                // make a bucket on the server, if not already present.
                bool found = await minio.bucketexistsasync(bucketname);
                if (!found)
                {
                    await minio.makebucketasync(bucketname, location);
                }
                // upload a file to bucket.
                await minio.putobjectasync(bucketname, objectname, filepath, contenttype);
                console.writeline("successfully uploaded " + objectname );
            }
            catch (minioexception e)
            {
                console.writeline("file upload error: {0}", e.message);
            }
        }

是不是很简单。关于更多api的使用可以查看如下的文档:

这是中文的api文档哦,所以就不说太多了

总结

今天跟大家介绍了另一个而且是更好用的分布式文件存储系统,看了minio的资料后毫不犹豫的选择了它,然后就无情的把fastdfs给丢弃了。如果你也有构建分布式文件系统的需求不妨关注下这个minio。