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网关的意思。这个图有点旧,目前MinIO支持的网关和图中的不一样,目前支持的网关如下:

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

MinIO网关架构图

上面的官方的示意图是基于网络连接的,没有网关的内部实现,我基于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网关的具体源代码分析实现。

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站 https://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请顺手点个赞吧。

扫码关注