分布式文件系统MinIO

本文介绍了MinIO,一个高性能、分布式且易于使用的对象存储系统,适用于高需求场景。文章详细讲解了MinIO的特点、与AmazonS3的兼容性以及如何通过SpringBoot集成MinIO进行文件操作,突出了其在云存储中的优势和适用性。
摘要由CSDN通过智能技术生成

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程icon-default.png?t=N7T8https://www.captainai.net/

前言

我们的系统离不开文件存储系统,因为系统会存储各种文件,所以选择一个好的文件存储系统是十分有必要的,我们选择文件系统一般需要看其使用是否简单,是否可靠,对各种环境是否适配,社区是否活跃,分布式等。随着云的普及,现在很多云厂商提供了文件存储服务,比如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`的可视化系统,使用上面的用户名和密码就可以登录。

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

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

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

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

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

1.Maven项目引入依赖
<dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.0.0</version>
</dependency>
2.application.yml设置minio连接属性

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

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

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

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

/**
 * @author
 * @date 2022-04-1614:32
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;
}
4.配置类

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

/**
 * @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();
    }
}
5.创建存储桶

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

    @Test
    void minioTest() {
       minioClient.makeBucket(MakeBucketArgs.builder().bucket("life").build());
    }
6.上传文件
    @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.获取文件链接
    @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

分布式Minio是一个可以将多块硬盘组成一个对象存储服务的解决方案。它通过在不同的节点上分布硬盘,避免了单点故障的问题。分布式Minio严格遵守read-after-write一致性模型,确保所有读写操作的一致性。要启动一个分布式Minio实例,你只需要将硬盘位置作为参数传递给minio server命令,并在所有其他节点上运行相同的命令。所有运行分布式Minio的节点应共享一个共同的根凭证,以便节点之间的连接和信任。建议在执行Minio服务器命令之前,将root用户和root密码导出为环境变量MINIO_ROOT_USER和MINIO_ROOT_PASSWORD,并在所有节点上导出。如果没有导出,可以使用默认凭据minioadmin/minioadmin。Minio将创建每组2到16个驱动器的纠删码集。您提供的驱动器总数必须是这些数字之一的倍数。分布式Minio选择最大的EC集大小,并将其划分为给定的驱动器总数或节点总数,以确保均匀分布,即每个节点参与每组相同数量的驱动器。每个对象都被写入单个EC集,因此它们分布在不超过16个驱动器上。建议所有运行分布式Minio设置的节点是同质的,即操作系统相同、磁盘数量相同、网络互连相同。分布式Minio需要新的目录,如果需要,可以与其他应用程序共享驱动器。您可以通过使用Minio独有的子目录来实现此目的。例如,如果您已将卷安装在/export下,则可以将其作为参数传递给Minio服务器/export/data。运行分布式Minio实例的服务器之间的时间间隔应小于15分钟。为了确保服务器之间的时间同步,建议启用NTP服务。在Windows操作系统上运行分布式Minio被认为是实验性的,请谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值