专栏首页飞雪无情的博客MinIO对象存储的网关架构设计

MinIO对象存储的网关架构设计

MinIO是一个非常轻量的对象存储服务,它只有一个二进制文件即可运行,快速的构建分布式的对象存储集群,适合存储大容量的非结构化数据,比如图片、日志文件等这些。

MinIO除了可以作为对象存储服务外,还可以作为网关,也就说MinIO的后端可以NAS系统、HDFS分布式文件系统或者S3、Google对象存储这样的第三方云存储系统。有了MinIO网关,就可以为Google对象存储这些后端系统添加S3兼容的API,便于管理和移植,因为S3 API已经是对象存储界事实上的标准。

当然MinIO网关不止具备S3兼容API功能,还有其他功能,比如缓存,这篇文章主要介绍MinIO网关的架构设计。

什么是网关

在讲MinIO网关之前,先看下什么是网关,这里我摘录维基百科上的定义:

网关(英语:Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。

是的,对于客户端来说,你完全感知不到你在访问一个网关。从设计模式来讲,网关就像一个外观模式,它封装了下层的各种服务,统一聚合包装后为客户端提供服务;从API上来讲,它是更高级别的API,是面向客户端的API,一般是HTTP协议,而被网关封装的下层服务可能是不同编程语言开发的各种服务,这些服务的协议也可能各不相同。

为什么需要网关

网关的核心是一种转换,比如把RCP协议转为HTTP协议,多个服务聚合一个API,数据格式的转换,统一API风格等等,其目的是更好的为客户端提供服务。如果没有网关,你的客户端就会直面那些底层服务,这些底层服务五花八门,API协议各种各样,风格也各不相同,这对于客户端来说,是非常痛苦的。

因为多了这一层网关,所以它可以做的事情也不止于转换了。你可以在网关这一层做限流、熔断、日志监控、授权等,因为它们都是和具体业务无关的,可以提前放到网关这一层来做,省去了每个底层服务重复做的成本。

MinIO网关

MInIO网关的出现也是类似的原因,它可以让你的旧存储系统可以很方便的具备S3 兼容API,这样你的旧存储系统就不用再多余开发,就有了标准的对象存储API,便于迁移以及使用方入门。

如果你们的旧存储系统是公有云,那么更好,你只需使用MinIO架设一个网关,就可以让你的用户使用S3 兼容的API访问你们的公有云服务了。这样做的好处就是你可以拉来更多的用户,为什么这么说呢?比如以前你去谈客户的时候,客户说你们的云对象存储是便宜,性能也好,但是你们提供的API不是S3 API,导致客户端如果迁移成本很大,那么现在有了MinIO网关,客户简单到只需要换个endpoint就可以了,就可以直接迁移到你们的云存储服务。

除了自建的存储系统外,如果你们以前使用Google对象存储这类第三方对象存储服务,那么也可以使用MinIO作为网关,一来可以统一S3 API,二来可以用MinIO做缓存,减少第三方对象存储的访问,节约成本。

你还可以启动多个MinIO网关代理同一个存储服务,比如共享的NAS系统,这样就可以构建分布式的网关,同时结合缓存功能,提供更强大的并发访问能力。

(MinIO 网关)

以上是MinIO官方的网关示意图,基本上也能看明白MinIO网关的意思。这个图有点旧,目前MinIO支持的网关和图中的不一样,目前支持的网关如下:

  1. AWS S3
  2. Google Cloud Storage
  3. NAS
  4. HDFS
  5. Microsoft Azure Blob Storage

MinIO网关架构图

上面的官方的示意图是基于网络连接的,没有网关的内部实现,我基于MinIO网关的具体实现画了一个架构图,对于了解MinIO的网关会更有帮助。

(MinIO网关架构图)

从以上架构可以看出,从终端发起的S3 API都是通过网关这一层的 S3 API Router提供的,通过S3 API Router统一了后端的API,也就是提供了统一的S3 兼容API。

S3 API Router的具体实现又是通过ObjectLayer这一层实现的,ObjectLayer是个接口,它定义了MinIO对象存储服务针对对象操作的所有API。ObjectLayer接口不止每个具体的网关会实现(比如GCS),MinIO本身作为存储服务器也会实现,这样对于对象的操作通过ObjectLayer接口就统一了(面向接口编程),具体的实现可以定义来实现不同的功能,比如MinIO 单点存储、分布式存储(纠删模式)、各个具体的网关存储,都是接口ObjectLayer的具体实现。

当每个具体的网关( 比如GCS)实现了ObjectLayer接口后,它对于具体后端存储的操作就是通过各个第三方存储SDK实现了。以GCS网关为例,终端通过S3 APi获取存储桶列表,那么最终的实现会通过GCS SDK访问GCS服务获取存储桶列表,然后包装成S3标准的结构返回给终端。

小结

MinIO网关是一个非常好的功能,它为S3 APi成为了事实上的标准也做出了不少贡献。除了MinIO网关的架构设计,它的源代码设计也非常好,可以很容易的添加一个新网关,便于我们进行二次开发,下一篇继续再讲MinIO网关的具体源代码分析实现。

本文为原创文章,转载注明出处

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 对象存储服务-构架设计

    对象存储服务构架设计 基本构架组成 ? 1.网关服务(Gateway): 客户端发送请求(Request)到网关服务(Gateway)再由网关服务实现将客户端请...

    用户1260683
  • 聊一聊分布式对象存储解决方案

    OSS(Object Storage Service)俗称对象存储,主要提供图片、文档、音频、视频等二进制文件的海量存储功能。目前除了公有云提供对象存储服务外,...

    大数据技术架构
  • 通过Minio搭建私有化对象存储服务_开源PaaS Rainbond最佳实践

    Minio是建立在云原生的基础上;有分布式和共享存储等功能;旨在多租户环境中以可持续的方式进行扩展的对象存储服务。它最适合存储非结构化数据,如:照片、视频、日志...

    Rainbond开源
  • 从源代码级别看懂MinIO对象存储网关的实现

    我在 《MinIO对象存储的网关架构设计》一文中介绍了MinIO的网关架构设计,它的整体架构如下图所示:

    飞雪无情
  • 通过Minio搭建私有化对象存储服务_开源PaaS Rainbond最佳实践

    Rainbond开源
  • Minio对象存储

    多节点的Minio会根据不同的Access_key及Secret_Key来区分不同租户,每个租户可操作对应Server获取Object。Minio Server...

    仙人技术
  • 通过Minio搭建私有化对象存储服务_开源PaaS Rainbond最佳实践

    Minio是建立在云原生的基础上;有分布式和共享存储等功能;旨在多租户环境中以可持续的方式进行扩展的对象存储服务。它最适合存储非结构化数据,如:照片、视频、日志...

    Rainbond开源
  • 使用Java 操作MinIO

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

    JAVA日知录
  • 基于Docker Compose部署分布式MinIO集群

    Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、...

    py3study

扫码关注云+社区

领取腾讯云代金券