在MinIO中添加Pools(池)并扩展容量

服务器池可帮助您快速轻松地扩展现有 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

将标签添加到池 zero 中的前 4 个节点,如下所示

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 操作员的租户 lite 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 个Pods:

$ 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:

      pool: one

    resources: {}

    runtimeClassName: ""

    servers: 4

    volumeClaimTemplate:

      metadata:

        creationTimestamp: null

        name: data

      spec:

        accessModes:

        - ReadWriteOnce

        resources:

          requests:

            storage: "2147483648"

        storageClassName: standard

      status: {}

    volumesPerServer: 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     Running   0          12h   10.244.3.10   kind-worker8              

myminio-pool-1-1   1/1     Running   0          12h   10.244.6.15   kind-worker6              

myminio-pool-1-2   1/1     Running   0          12h   10.244.2.7    kind-worker5              

myminio-pool-1-3   1/1     Running   0          12h   10.244.1.10   kind-worker7              

你有它。这难道不是一种非常简单的扩张方式吗?

总结

服务器池简化了 MinIO 集群的持续操作。池允许您立即扩展集群,而无需将数据移动到不同的集群或重新平衡集群。服务器池提高了运营效率,因为它们为存储管理员提供了将整个硬件群集作为单个资源进行寻址的强大快捷方式。

虽然服务器池是扩展群集容量的绝佳方式,但应谨慎使用它们。我们建议您从第一天开始调整群集的大小,以便有足够的空间来满足 3 年的预期增长,这样您就不需要立即开始添加更多池。此外,在购买更多容量之前,请考虑分层 - 将旧数据分层到较便宜的硬件,并将最新和最强大的硬件用于存储最新和访问量最大的对象。如果必须通过添加池来扩展群集,请制定一个游戏计划,最终停用较旧的池,并合并为每个站点的单个大型群集。这将进一步降低保持 MinIO 集群平稳运行所需的开销。

如果对Pools 有任何问题,请随时联系MinIO中国,为您们提供更专业的技术保障和商业授权。

相关推荐
GoppViper1 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
贩卖纯净水.10 小时前
白月光git
git·github
萌新求带啊QAQ10 小时前
腾讯云2024年数字生态大会开发者嘉年华(数据库动手实验)TDSQL-C初体验
云计算·腾讯云·tdsql-c
苓诣11 小时前
Submariner 部署全过程
云计算·k8s
lgbisha11 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云
A^mber12 小时前
828华为云征文|云服务器Flexus X实例|Ubunt部署Vue项目
运维·服务器·华为云
GDAL17 小时前
全面讲解GNU:从起源到应用
服务器·云计算·gnu
AI逍遥子21 小时前
如何从github上clone项目
github
iBaoxing21 小时前
如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
github