暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Percona 操作扩容无需停机

原创 谭磊Terry 2022-07-29
1113

Percona Kubernetes Operators中管理存储的方法有多种:持久卷 (PV)、hostPath、临时存储等。使用 PV 由 Operator 通过Storage Classes 和 Persistent Volume Claims 提供,是我们用户最受欢迎的选择. 最受欢迎的问题之一是如何扩展我们基于 PV 的算子存储。为了使 PV 更容易调整大小,卷扩展功能在 Kubernetes 1.8 中作为 alpha 功能引入,并最终在 1.24 中成为稳定功能。

在这篇博文中,我将向您展示如何使用此功能轻松增加Percona Operators 中的存储大小而无需任何数据库停机,并解释如果您的存储类不支持卷扩展该怎么办。

通过卷扩展扩大持久卷声明 (PVC)

  • 如果 PVC 的存储类设置了 AllowVolumeExpansion=True选项 ,则只能调整 PVC 的大小。
kubectl describe sc <storage class name> | grep allowVolumeExpansion
  • 确保自定义资源中未设置删除 PVC 终结器(delete-pxc-pvc / delete-psmdb-pvc),否则可能会丢失所有集群数据。
  • 有关支持卷扩展的 intree 卷类型,请参阅卷扩展文档。
  • 如果底层的 Storage Driver 只能支持离线扩容,那么 PVC 的用户必须先把自己的 Pod 下线才能扩容成功。请参阅您的存储提供商的文档以了解支持哪些卷扩展模式。

请注意,扩展 EBS 卷是一项耗时的操作。此外,每六小时进行一次修改的每卷配额。

用于 MongoDB 的 Percona 运算符/用于 MySQL 的 Percona 运算符

在 Percona Operator for MongoDB 和 Percona Operator for MySQL 基于 Percona XtraDB Cluster的引擎下,使用了 StatefuSets,因此 Operator 的卷扩展任务归结为调整相应 StatefulSet 持久卷的大小。

调整通过更改自定义资源或 StatefulSets 声明的 PV 大小(不起作用)

创建后只能修改一些特定的 StatefulSet 字段。在 operator 自定义资源 或 StatefulSet 中更改存储大小会导致以下错误:

StatefulSet.apps \"my-cluster-name-rs0\" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', 
'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden"

通过修改持久卷声明 (PVC) 扩展存储

1.改变PVC尺寸:

kubectl patch pvc <pvc-name>  -n <pvc-namespace> -p '{ "spec": { "resources": { "requests": { "storage": "NEW STORAGE VALUE" }}}}'
  1. 该过程完成后,您可以在 PVC 描述中看到以下消息。
kubectl describe pvc <pvc-name>
Normal  FileSystemResizeSuccessful  3s    kubelet  MountVolume.NodeExpandVolume succeeded for volume "pvc-7ed0ba5c-cc79-42d4-a4b3-xxxxxxxxxxxx"

如果您在 PVC 描述中看到以下事件(并且它没有更改),您需要重新启动 pod 以完成调整大小。(见进一步的注释。)

FileSystemResizePending   True    Mon, 01 Jan 0001 00:00:00 +0000   Thu, 23 Jun 2022 19:24:50 +0200 Waiting for user to (re-)start a pod to finish 
file system resize of volume on node.

3.当 PVC 大小发生变化时,可以保证其他对象也发生变化。

kubectl get pvc

kubectl get pv

kubectl exec <pod-name> -- lsblk
  1. 更新对应算子自定义资源(基于 Percona XtraDB Cluster 的Percona Operator for MongoDB或Percona Operator for MySQL )中的存储大小。

所以现在我们已经在相应的 StatefulSets 中缩放了存储和旧存储值。正如我们在上面看到的,我们可以应用具有新存储值的自定义资源,但不能更改 StatefulSet 对象的存储大小字段。这就是为什么我们需要使用新值重新创建 StatefulSet。为了避免停机,我们删除 StatefulSet 而不删除 pod(–cascade=‘orphan’ 标志)。

kubectl delete sts <statefulset-name> --cascade=orphan
  1. 应用 cr.yml。
kubectl apply -f deploy/cr.yml
  1. 一个一个删除 StatefulSet pods(可选)。
    根据 Kubernetes官方文档:

如果您的存储提供商支持在线扩展,则无需重启 Pod 即可完成卷扩展。

PostgreSQL 的 Percona 运算符(pg 运算符)

与基于 Percona XtraDB Cluster 的Percona Operator for MongoDB / Percona Operator for MySQL使用部分可修改的 StatefulSet 对象相比,我们的 Percona Operator for PostgreSQL 使用 Deployment 而不是 StatefulSet 用于集群对象。部署是一个可变对象,不仅可以在集群启动时更改,还可以在正在运行的集群上更改。这就是为什么自定义资源中存储大小的变化将持续应用于正在运行的集群。自定义资源的更改不仅会调整卷大小,还会启动 pod 重启。

此外,为了维护安全的集群配置,操作员保持主卷和副本卷大小完全相同。因此,如果主节点的大小发生变化,副本的大小也会发生变化,并且主节点和副本 pod 都会重新启动。否则,如果您先修改副本大小,则只会扩展副本 PVC 并重新创建 pod。但是,如果您尝试将主节点大小增加到与副本相同的值,则只会缩放主 PVC(副本的 PVC 已经具有必要的值),但副本和主 Pod 都会重新启动。

因此,您可以看到主 PVC 和副本 PVC 都改变了大小的情况,只有在自定义资源中增加了主 PVC 的存储大小。

您需要小心并保持您的自定义资源文件是最新的。

通过将数据传输到新 PVC 来调整持久卷声明 (PVC) 的大小

卷扩展是 Kubernetes 的一项出色功能,它提供了一种简单有效的方式来调整 PVC 的大小。但是,某些存储类不支持 PVC 卷扩展。对于这些类,您必须创建一个新的 PVC 并将内容移动到其中。您可以按照以下步骤进行操作:

  1. 在自定义资源中为对应的算子( Percona Operator for MongoDB或Percona Operator for MySQL 基于 Percona XtraDB Cluster )配置 PVC 大小并应用。
kubectl apply -f deploy/cr.yaml
  1. 删除有状态集。与上一部分一样,我们需要重新创建 StatefulSet 以应用存储更改。
kubectl delete sts <statefulset-name> --cascade=orphan

结果,Pod 启动了,Operator 使用新的卷大小重新创建 StatefulSet。

  1. 扩展集群(可选)。
    更改存储大小需要我们终止 Pod,这会导致性能下降。为了在操作期间保持性能,我们可以使用Percona Operator for MongoDB或Percona Operator for MySQL 基于 Percona XtraDB Cluster 的这些指令来扩展集群。 只要我们已经更改了 StatefulSet,就会为新的 operator pod 提供更多的容量。

  2. 一个一个地重新配置 Pod 以更改存储。
    这是将为数据库 Pod 更改底层存储的步骤。
    删除要重新配置的 Pod 的 PVC。

kubectl delete pvc <pvc-name>

PVC 不会被立即删除,因为有一个 Pod 正在使用它。要继续,请删除 Pod:

kubectl delete pod <pod-name>

Pod 将与 PVC 一起被删除。StatefulSet 控制器会注意到 pod 已消失,并将与新扩展的 PVC 一起重新创建它。
检查 PVC 尺寸:

kubectl get pvc
NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mongod-data-minimal-cluster-rs1-1   Bound    pvc-e9b494fb-f201-44b9-9493-ea6faa903ddc   4Gi        RWO            standard       3m3s
mongod-data-minimal-cluster-rs1-2   Bound    pvc-6236c7e1-9670-49a8-9928-0dd24708588c   3Gi        RWO            standard       144m

CAPACITY 列表示此 PVC 已增加。

一旦 Pod 启动,数据就会从其他节点同步。数据传输速度取决于集群中的数据量和集群利用率,因此同步可能需要一段时间。请等待节点完全启动并运行,同步完成,然后才能继续下一个 Pod。

  1. 缩减集群并清理不必要的 PVC。

结论

我们不断在 Percona Kubernetes Operators 中引入新功能。其中之一是自动卷扩展,它将在未来的版本中实现。我们还计划在自定义资源中添加直接更改存储大小的可能性,从而可以添加到 Percona 监控和管理 (PMM) 中的私有 DBaaS 功能,以检测卷消耗并自动扩展集群。如果您对该主题有任何建议并愿意与我们合作,请将问题提交到社区论坛或 JIRA。

原文标题:Percona Operator Volume Expansion Without Downtime
原文作者:Natalia Marukovich
原文地址:https://www.percona.com/blog/percona-operator-volume-expansion-without-downtime/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论