添加存储池并扩展容量

Add Pools and expand capacity

服务器池帮助您快速轻松地扩展现有 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 上联系我们!