服务器池可帮助您快速轻松地扩展现有 MinIO 集群的容量。这篇博文重点介绍如何增加一个集群的容量,这与添加另一个集群并在多个集群之间复制相同数据不同。将服务器池添加到现有群集时,可以增加该群集的整体可用容量。如果设置了复制,则需要平均增长复制目标,以适应复制源的增长。
服务器池是 MinIO 中的一个重要概念,因为它们有助于快速扩展存储容量。我们建议将单池集群的大小调整为至少 2-3 年的存储容量跑道,如果您预计会大幅增长,则可能会更长。这样,可以避免添加不必要的服务器池,而是从一个简单的 MinIO 群集开始,该群集会随着时间的推移而增长。尽管服务器池比单个节点更易于使用,但它们仍然会增加一点管理开销。扩展后,应考虑通过停用较小的池将多个池合并为几个大型池。
在这篇文章中,我们将向您展示在扩展服务器池之前需要考虑的事项,如何创建初始池,然后如何通过添加新池来扩展它。
构建集群
设置服务器池以扩展群集时,需要满足某些先决条件,才能获得其他池的必要规范。
网络和防火墙:新池中的节点需要能够与群集中的所有现有节点进行双向通信。所有新节点都必须侦听与现有节点相同的端口。例如,如果使用端口"9000",则新池也必须在"9000"上进行通信。我们还建议使用 Nginx 或 HAProxy 等负载均衡器来代理请求。配置路由算法,确保基于最少连接路由流量。
顺序主机名:MinIO 使用扩展表示法"{x...y}' 表示一系列连续的主机名。因此,必须按顺序命名池中的新节点。如果现有节点具有以下主机名:
然后,新池应具有以下主机名:
请确保在启动新池之前为这些主机名创建 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中国,为您们提供更专业的技术保障和商业授权。