MinIO 可以以分布式方式部署,从而有效利用多个物理或虚拟机的计算和存储资源。这可以在私有或公共云环境中运行 MinIO,例如使用亚马逊网络服务、谷歌云平台、微软的 Azure 平台等等。MinIO 可以部署到多种拓扑结构中 - 在生产环境中,我们推荐使用 多节点多驱动器 (MNMD) 部署。MinIO 建议使用 站点复制 为您的单站点部署提供 BC/DR 级别的故障转移和恢复支持,您可以根据您的用例设计和优化它。
在之前的一篇博文中,我们已经讨论了一些在 为您的 MinIO 部署选择硬件 时应采用的最佳实践。我们提到了硬件的各个方面,从选择最佳区域、合适的驱动器、CPU 和内存配置,甚至一些推荐的网络配置。虽然我们提到了系统设计中各种最佳实践,但我们始终可以更深入地研究,今天我们将深入探讨一些围绕 MinIO 设计的细微之处,以充分发挥驱动器和网络的性能。
在本博文中,我们将深入探讨网络配置,您可以使用这些配置将 MinIO 配置到不同的复制策略和网络拓扑结构中,这些策略和拓扑结构可用于确保您的数据在多个 MinIO 部署中高效存储和访问。您无需进行任何复杂的配置,例如设置绑定/双 NIC(这会增加额外的开销)。
简单的网络策略
MinIO 是一个与 S3 兼容的云原生服务的存储后端。一般来说,我们将网络流量视为应用程序和集群之间的流量,或者集群中节点之间的流量。由于节点间流量,节点之间的网络速度越快越好。每个池由一组独立的节点组成,这些节点具有自己的擦除集。MinIO 必须查询每个池以确定将读写操作定向到的正确擦除集,这样每个额外的池都会为每次调用添加最小的但增加的节点间流量。包含正确擦除集的池会响应操作,对于应用程序来说完全透明。
企业使用 1 GbE 或 10 GbE NIC 的时代已经过去了。现代企业工作负载理想地利用 100 GbE NIC。鉴于物理限制和 TCP 协议的开销,这些 NIC 预计将提供 80-90% 的可用带宽,对于 100 Gbps NIC 通常约为 10GB/s,在配置良好的网络中可达 12GB/s。MinIO 不需要任何额外的开箱即用网络配置即可利用所有带宽,因为它侦听所有接口。MinIO 开箱即用地支持侦听多个网络接口(NIC)。
您不需要为 MinIO 网络进行任何其他特殊配置,但可以选择使用一些我们之前讨论过的 网络基础,您可以将 MinIO 流量路由到特定接口。
在本示例中,我们将使用 Linux 操作系统进行演示,但网络基础知识与您使用的操作系统无关。实现方式可能略有不同,具体取决于网络配置,但这应该给您一个概念。
我们首先列出路由表
$ ip route
10.56.98.0/24 dev eth0 proto kernel scope link src 10.56.98.18
如果您已将 MinIO 服务器配置为位于 10.56.98.16/28 CIDR 范围内,假设其中一个 MinIO 节点的 IP 地址为 10.56.98.21,它将通过 eth0 接口路由,因为 /28 与 10.56.98.0/24 的路由表条目匹配。
但是,如果您希望将 MinIO 流量通过 eth1 而不是 eth0 路由,我们需要为 MinIO CIDR 添加特定路由,以便与该子网匹配的任何流量都通过该特定网络接口路由。
$ ip route add 10.56.98.16/28 dev eth1
添加路由后,让我们再次列出路由表以查看其外观。
$ ip route
10.56.98.0/24 dev eth0 proto kernel scope link src 10.56.98.33.18
10.56.98.16/28 dev eth1 scope link
现在我们看到了 /28 CIDR 的路由。如果您 ping MinIO 节点 10.56.98.21,它现在将通过 eth1 接口路由。这是因为当有两个路由时,/24 与 /28 重叠,通常最长前缀的路由具有优先级(在本例中为 /28),并且在路由流量时将优先于任何其他较短前缀路由。这称为最长匹配前缀规则。
如果您 ping 10.56.98.21,然后检查如下所示的 tcpdump,您可以验证来自 10.56.98.16/28 的流量是否正在被正确路由。您会注意到,来自源 10.56.98.18 的流量正在通过 eth1 路由到 10.56.98.21。
$ tcpdump -n -i eth1 icmp
…
15:55:44.410450 IP 10.56.98.18 > 10.56.98.21: ICMP echo request, id 8416, seq 123, length 64
15:55:44.410471 IP 10.56.98.21 > 10.56.98.18: ICMP echo reply, id 8416, seq 123, length 64
15:55:45.434489 IP 10.56.98.18 > 10.56.98.21: ICMP echo request, id 8416, seq 124, length 64
15:55:45.434518 IP 10.56.98.21 > 10.56.98.18: ICMP echo reply, id 8416, seq 124, length 64
15:55:46.458490 IP 10.56.98.18 > 10.56.98.21: ICMP echo request, id 8416, seq 125, length 64
15:55:46.458520 IP 10.56.98.21 > 10.56.98.18: ICMP echo reply, id 8416, seq 125, length 64
如您所见,对于 MinIO,不需要额外的专用端口或服务来实现流量分离。MinIO 在设计时考虑了简单性,我们始终在考虑构建与购买,而不是构建像网关服务那样复杂的东西。MinIO 利用操作系统层已有的网络基础来实现相同的结果,同时尽可能地减少开销。
我们可以更进一步。如今,服务器至少有两个接口,可以选择添加更多接口。因此,您可以让应用程序流量通过与 MinIO 相同的接口,也可以让应用程序在单独的 CIDR 块上运行(选择适合您的应用程序大小的块)。这种分离确保 MinIO 用于复制和重新平衡的流量不会影响应用程序的性能,反之亦然。它还使您能够监控和跟踪流量,以确保 MinIO 始终拥有执行其操作所需的容量和带宽,而不会影响其性能。
但是,如果您在不同的站点或区域拥有 MinIO?如何有效地配置它以确保没有性能瓶颈?好吧,MinIO 为一些最严格的用例提供了多种不同的复制配置类型。
站点到站点复制是最有效的复制策略之一。这使您可以从单个集群开始 MinIO,并在需要时扩展到 N 个。假设您有一个在 3 个不同站点上运行的 ETL/ELT 应用程序。通常,数据仅在一个区域可用,其他区域需要跨区域拉取大量数据才能运行其进程。不用说,这不仅效率低下,而且会给网络基础设施带来巨大压力,并可能导致共享 WAN 的其他应用程序出现瓶颈。

在站点到站点复制配置中,您仅将数据写入第一个站点的 MinIO 集群。复制过程会自动将数据复制到其他站点。无需对 ETL/ELT 应用程序进行任何其他更改。您只需将每个站点的作业指向由反向代理(例如 Nginx)支持的各自的 MinIO 集群,读取速度将比跨区域 WAN 速度快得多,如下所示。

但这引出了一个问题,是否可以进一步微调流量?假设您将数据文件添加到站点 1,它将立即将其复制到其他站点,无论一天中的时间如何。这可能发生在高峰时段,可能其他 ETL/ELT 作业正在运行,并且同时网络资源被用来复制可能直到第二天下一个批次运行时才使用的数据。在这种情况下该怎么办?这就是 MinIO 的 批处理复制 发挥作用的地方。批处理复制使您能够选择要在特定时间复制的数据类型,它完全可配置。在这种情况下,可以设置一个批处理复制作业在流量最低的非工作时间运行。由于应用程序访问时间可能在一天、一周甚至一个月内变化,因此 监控 MinIO 网络流量 会派上用场,这样您就可以将批处理作业配置为在正确的时间运行。您可以在不同的机架、数据中心或地理区域部署对等站点,以支持诸如 BC/DR 或地理位置读取/写入性能的功能,这些功能位于全局分布式 MinIO 对象存储中。
最后的想法
概括地说,MinIO 的网络架构是最简单和最直接的架构之一。MinIO 并没有重新发明轮子,而是使用网络基础知识来实现与其他数据存储的同等功能,这些数据存储具有复杂的网络和网关设置,几乎不可能调试。无论您调试同一个问题多少次,由于架构的模糊性,它都会感觉像第一次遇到它一样。相反,MinIO 专注于更高级的抽象,使应用程序开发人员无需维护数据复制,而是专注于存储和处理数据。
与往常一样,如果您对 MinIO 网络配置或如何设置它有任何疑问,请随时联系我们 Slack,或者更好的是,注册 SUBNET 订阅!