分布式文件系统Minio

前言

我们的系统离不开文件存储系统,因为系统会存储各种文件,所以选择一个好的文件存储系统是十分有必要的,我们选择文件系统一般需要看其使用是否简单,是否可靠,对各种环境是否适配,社区是否活跃,分布式等,随着云的普及,现在很多云厂商提供了文件存储服务,我们成为OSS,我们的文件由云厂商进行托管,我们只需要按时按量付费,这就是SAAS模式,使用OSS,那么自然得付费,加上文件是存储在别人家,对于很多行业来说,文件得存储在自己的网络,所以OSS自然不行,所以我们得搭建自己的文件服务器,常见的分布式文件服务器有HDFSFastDFS等,不过对于HDFSFastDFS,他们的学习成本有点高,加上随着云原生的普及,可能就不太适合我们现在使用,所以我们就说到了Minio

Minio介绍

MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。

MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

特性

高性能

MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。
对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。
MinIO用作云原生应用程序的主要存储,与传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。

可扩展性

MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。 这是我们坚定的理念 “简单可扩展.” 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。 通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。

云原生支持

MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。 其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

开放全部源代码 + 企业级支持

MinIO 基于Apache V2 license 100% 开放源代码 。 这就意味着 MinIO的客户能够自动的、无限制、自由免费使用和集成MinIO、自由的创新和创造、 自由的去修改、自由的再次发行新的版本和软件. 确实, MinIO 强有力的支持和驱动了很多世界500强的企业。 此外,其部署的多样性和专业性提供了其他软件无法比拟的优势。

与Amazon S3 兼容

亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。 MinIO 在很早的时候就采用了 S3 兼容协议,并且MinIO 是第一个支持 S3 Select 的产品. MinIO对其兼容性的全面性感到自豪, 并且得到了 750多个组织的认同, 包括Microsoft Azure使用MinIO的S3网关 - 这一指标超过其他同类产品的总和。

简单

极简主义是MinIO的指导性设计原则。简单性减少了出错的机会,提高了正常运行时间,提供了可靠性,同时简单性又是性能的基础。 只需下载一个二进制文件然后执行,即可在几分钟内安装和配置MinIO。 配置选项和变体的数量保持在最低限度,这样让失败的配置概率降低到接近于0的水平。 MinIO升级是通过一个简单命令完成的,这个命令可以无中断的完成MinIO的升级,并且不需要停机即可完成升级操作 - 降低总使用和运维成本。

通过Docker部署单节点的Minio

Minio的部署方式有很多种,生产上我们为了保证其高可用和高可靠,我们需要部署集群,这里我们演示使用,所以采用Docker部署单节点。

拉取镜像,运行镜像

我们将minio容器得名字设置未xiaosiminio,将minio的文件存储位置设置为/minio/data,minio的用户为minioadmin,密码也为minioadmin,minio的后台api访问端口是9001,可视化系统访问端口是9000

docker pull minio/minio

docker run -p 9000:9000 -p 9001:9001 -d --name xiaosiminio -v /minio/data:/data -v /minio/config:/root/.minio -e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=minioadmin" minio/minio server /data --console-address ":9000" --address ":9001"

运行成功后我们通过http://ip:9001便可以访问到minio的可视化系统,使用上面的用户名和密码就可以登录。

image.png

在minio中,存储数据的地方我们成为存储桶,也就是Bucket,它和我们的文件夹是同一个概念,对这个存储桶,我们可以对其设置权限,比如可读可写读写都可,这需要我们根据具体的场景来定。

image.png

我们在创建桶后需要对其访问权限进行设置,Prefix就是前缀,如果这个桶下面的文件带有这个前缀,那么文件就能访问到,如果没有这个前缀,那么将无权限访问,如果想要全部可以访问到,我们可以设置为*,不过一般我们的文件都有一定个规则性,所以一般我们需要进行设计。

image.png

设置好权限以后,我们可以直接访问文件,如下,我们通过http://ip:9001/存储桶名称/文件名称格式可以直接访问到文件。

image.png

通过SpringBoot整合Minio实现文件的上传下载

minio提供了很多客户端API,我这里直接通过Java API来访问,基于SpringBoot的便捷,就使用SpringBoot来整合。

一.Maven项目引入依赖

12345
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.0.0</version> </dependency>

二.application.yml设置minio连接属性

endpoint就是就是minio服务地址,accessKeysecretKey是访问的访问用户和密钥,注意,并不是我们上面的minioadmin,而是需要我们创建的,不然访问不了minio服务。

 
1234
minio: endpoint: http://ip:9001 accessKey: FoJrG0P85vkCUoLk secretKey: wKH3HBUX1jVdasgVoiUoaOqBgjbUoYRi

image.png

三.使用@ConfigurationProperties获取minio配置属性

一般这些配置我们都使用yml来进行配置,不应该写死在代码里面,一般会放在配置中心,如Nacos上面,这样有改动的话就不需要重启,直接可以动态刷新,使用@ConfigurationProperties就比较合适,有些同学会说使用@Value也行呀,没错,@Value也行,但是使用@Value如果想要动态刷新,需要加上@RefreshScope,不然,不能动态刷新配置。

123456789101112131415
/** * @author 小四哥 * @date 2022-04-1614:32 */ @Data @Component @ConfigurationProperties(prefix = "minio") public class MinioProperties { private String endpoint; private String accessKey; private String secretKey; }

四.配置类

对MinioClient进行配置,我们就可以在项目的其他地方注入使用。

123456789101112131415161718
/** * @author 小四哥 * @date 2022-04-1614:39 */ @Data @Configuration public class MinIoClientConfiguration { final MinIoProperties minIoProperties; @Bean public MinioClient minioClient(){ return MinioClient.builder() .endpoint(minIoProperties.getEndpoint()) .credentials(minIoProperties.getAccessKey(), minIoProperties.getSecretKey()) .build(); } }

五.创建存储桶

除了可以直接在页面上创建存储桶,我们也可以指通过API的方式来创建,我使用minio依赖版本是8,所以API和以前的一些版本可能不一样,如下创建了一个名字为life的存储桶。

1234
@Test void minioTest() { minioClient.makeBucket(MakeBucketArgs.builder().bucket("life").build()); }

6.上传文件

123456789101112
@Test void minioTest(){ File file = new File("C:\\Users\\DELL\\Desktop\\文章\\茶园.mp4"); FileInputStream fileInputStream = new FileInputStream(file); minioClient.putObject( PutObjectArgs.builder() .bucket("life") .object(file.getName()) .stream(fileInputStream,fileInputStream.available(),-1) .build() ); }

7.获取文件链接

123456789
@Test void getFile(){ GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder() .bucket("life") .object("茶园.mp4") .build()); String fileLink = minioProperties.getEndpoint() + "/" + response.bucket() + "/" + response.object(); }

还有很多API,我们就不一一去说了,大家在实际使用的过程中一般会对其进行封装,然后提供一个统一的接口来进行操作,这样更加方便统一的进行管理。

关于minio,我们就说到这里,使用minio来存储文件是一个十分不错的选择,当然,上述的操作都过于简单,在实际使用过程中,我们还是需要再进行设计,如果是集群的话,我们又需要制定合适的设计方案,以保证我们能正常的使用minio,今天的分享就到这里,感谢你的观看,我们下期见。

@Async一个注解搞定异步编程
被遗忘的人
steakliu渣男小四公众号【小四的技术之旅】成都
文章26
分类13
标签4