服务器池帮助您快速轻松地扩展现有 MinIO 集群的容量。这篇博文重点介绍如何提高一个集群的容量,这与添加另一个集群并在多个集群之间复制相同的数据不同。当向现有集群添加服务器池时,您会增加该集群的整体可用容量。如果您已设置复制,则需要平等地扩展复制目标以适应复制源的增长。
服务器池是 MinIO 中一个重要的概念,因为它有助于快速扩展存储容量。我们建议将单个池集群的容量规划为至少 2-3 年的存储容量冗余 - 并且如果您预计会出现大幅增长,则可能需要更长时间。这样,您可以避免添加不必要的服务器池,而是从一个简单的 MinIO 集群开始,并随着时间的推移逐渐扩展。即使服务器池比单个节点更容易使用,它们仍然会增加少量管理开销。扩展后,您应该考虑通过停用较小的池将多个池合并为几个大型池。
在这篇文章中,我们将向您展示在扩展服务器池之前需要考虑的事项,如何创建初始池,以及随后如何通过添加新池来扩展它。
构建集群
在设置服务器池以扩展集群时,需要满足某些先决条件才能为附加池提供必要的规格。
网络和防火墙:新池中的节点需要能够双向通信集群中所有现有节点。所有新节点都必须侦听与现有节点相同的端口。例如,如果您使用端口 `9000`,则新池也必须在 `9000` 上通信。我们还建议使用诸如 Nginx 或 HAProxy 之类的负载均衡器来代理请求。配置路由算法以确保根据最少连接数来路由流量。
顺序主机名:MinIO 使用扩展表示法 `{x...y}` 来表示一系列顺序主机名。因此,必须以顺序方式命名池中的新节点。如果现有节点具有以下主机名
minio1.example.com
minio2.example.com
minio3.example.com
minio4.example.com
那么新池应具有以下主机名
minio5.example.com
minio6.example.com
minio7.example.com
minio8.example.com
请务必在启动新池之前创建这些主机名的 DNS 记录。
顺序驱动器:与主机名类似,驱动器也需要使用相同的扩展表示法 {x...y}
按顺序挂载。这是一个 /etc/fstab
文件的示例。
$ mkfs.xfs /dev/sdb -L DISK1 $ mkfs.xfs /dev/sdc -L DISK2 $ mkfs.xfs /dev/sdd -L DISK3 $ mkfs.xfs /dev/sde -L DISK4
$ nano /etc/fstab
# LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2 LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2 LABEL=DISK3 /mnt/disk3 xfs defaults,noatime 0 2 LABEL=DISK4 /mnt/disk4 xfs defaults,noatime 0 2 |
然后,您可以使用 /mnt/disk{1...4}
指定驱动器的整个范围。如果要使用每个驱动器上的特定子文件夹,请将其指定为 /mnt/disk{1...4}/minio
。
擦除编码:如前所述,MinIO 要求每个服务器池都满足现有集群的部署参数。具体来说,新池拓扑必须每个擦除集至少支持 2 x EC:N
个驱动器,其中 EC:N 是部署的标准奇偶校验存储类。此要求确保新服务器池能够满足部署的预期 SLA。作为参考,这篇博文解释了如何使用 擦除编码计算器 来确定所需的磁盘数量和容量。有关擦除编码的解释,请参阅 擦除编码 101。
原子更新:您还应该确保新池尽可能与现有集群同构。它不必完全匹配规格,但驱动器和网络配置需要尽可能接近,以避免潜在的边缘情况问题。添加新的服务器池需要同时重新启动部署中的所有 MinIO 节点。MinIO 建议 同时重新启动所有节点。不要执行滚动重启(例如,一次一个节点),MinIO 操作是原子的并且严格一致。因此,重启过程不会中断应用程序和正在进行的操作。
让我们继续构建集群。在此示例中,我们将使用 KIND 构建 Kubernetes 集群。我们将使用以下配置构建一个虚拟 8 节点集群。
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking apiServerAddress: "127.0.0.1" apiServerPort: 6443 nodes - role: control-plane extraPortMappings - containerPort: 30080 hostPort: 30080 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30081 hostPort: 30081 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30082 hostPort: 30082 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30083 hostPort: 30083 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30084 hostPort: 30084 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30085 hostPort: 30085 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30086 hostPort: 30086 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30087 hostPort: 30087 listenAddress: "127.0.0.1" protocol: TCP - role: worker extraPortMappings - containerPort: 30088 hostPort: 30088 listenAddress: "127.0.0.1" protocol: TCP |
将前 4 个节点添加到名为 zero
的池中,如下所示
kubectl label nodes kind-worker pool=zero kubectl label nodes kind-worker2 pool=zero kubectl label nodes kind-worker3 pool=zero kubectl label nodes kind-worker4 pool=zero |
克隆 MinIO 运营商的租户精简版 Kustomize 配置
git clone https://github.com/minio/operator.git |
确保 tenant.yaml 中包含名为 pool-0
的池,如下所示
pools - name: pool-0 nodeSelector pool: zero |
应用租户配置以启动 pool-0
$ kubectl apply -k operator/resources
$ kubectl apply -k operator/examples/kustomization/tenant-lite |
检查以确保池中存在 4 个 Pod
$ kubectl get pods -n tenant-lite -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myminio-pool-0-0 1/1 Running 0 12h 10.244.7.5 kind-worker myminio-pool-0-1 1/1 Running 0 12h 10.244.5.5 kind-worker3 myminio-pool-0-2 1/1 Running 0 12h 10.244.4.10 kind-worker2 myminio-pool-0-3 1/1 Running 0 12h 10.244.8.13 kind-worker4 |
这是大多数人开始使用的初始设置。这确保了您以一种能够在将来无缝扩展的方式进行设置。说到扩展池,让我们看看它是什么样子
扩展集群
扩展池是一个非中断操作,不会导致集群停机。以下是我们希望达成的最终结果的示意图。

在上图左侧,我们看到 pool-0
已在前面的步骤中设置。在本节中,我们将解决添加 pool-1
以扩展集群整体容量的问题。您需要向 pool-0 添加 4 个类似的节点才能扩展到 pool-1。我们已经通过启动一个 8 节点集群来简化演示,从而实现了这一点。
编辑 tenant-lite 配置以添加 pool-1
kubectl edit tenant -n tenant-lite |
它应该会打开一个 yaml 文件,找到 pools
部分并在其下方添加以下内容。
- affinity podAntiAffinity requiredDuringSchedulingIgnoredDuringExecution - labelSelector matchExpressions - key: v1.min.io/tenant operator: In values - myminio - key: v1.min.io/pool operator: In values - pool-1 topologyKey: kubernetes.io/hostname name: pool-1 nodeSelector 池:one 资源:{} 运行时类名:"" 服务器:4 卷声明模板 元数据 创建时间:null 名称:data 规范 访问模式 - ReadWriteOnce 资源 请求 存储:"2147483648" 存储类名:standard 状态:{} 每个服务器的卷数:2 |
保存文件后,新的池应该开始部署。通过获取 Pod 列表来验证它。
$ kubectl get pods -n tenant-lite -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myminio-pool-0-0 1/1 Running 0 12h 10.244.7.5 kind-worker myminio-pool-0-1 1/1 Running 0 12h 10.244.5.5 kind-worker3 myminio-pool-0-2 1/1 Running 0 12h 10.244.4.10 kind-worker2 myminio-pool-0-3 1/1 Running 0 12h 10.244.8.13 kind-worker4 myminio-pool-1-0 1/1 运行中 0 12h 10.244.3.10 kind-worker8 myminio-pool-1-1 1/1 运行中 0 12h 10.244.6.15 kind-worker6 myminio-pool-1-2 1/1 运行中 0 12h 10.244.2.7 kind-worker5 myminio-pool-1-3 1/1 运行中 0 12h 10.244.1.10 kind-worker7 |
就是这样。扩展起来是不是非常容易?
太棒了 池!

服务器池简化 MinIO 集群的持续运营。池允许您在任何时候扩展集群,而无需将数据移动到不同的集群或重新平衡集群。服务器池提高了运营效率,因为它们为存储管理员提供了一种强大的快捷方式,可以将整个硬件集群作为单个资源来处理。
虽然服务器池是扩展集群容量的绝佳方法,但应谨慎使用。我们建议您从第一天开始就调整集群大小,使其拥有足够的空间来满足 3 年的预期增长,这样您就不需要立即开始添加更多池。此外,在购买更多容量之前,请考虑分层——将旧数据分层到成本较低的硬件上,并将最新最好的硬件用于存储最新和访问最频繁的对象。如果并且当您必须通过添加池来扩展集群时,请制定一个计划,最终停用旧池并合并到每个站点的单个大型集群中。这将进一步降低保持 MinIO 集群平稳运行所需的开销。
如果您有任何关于如何添加和扩展服务器池的问题,请务必在 Slack 上联系我们!