私有云中的 Kubernetes MySQL 集群

私有云中的 Kubernetes MySQL 集群

我对由 1 个主服务器和 2 个辅助服务器组成的 MySQL 集群感兴趣。

通常在公共云中我们

  • 使用外部存储

  • 使用 RDS 等服务,以便此服务后面处理复制和故障转移

  • 你可以在另一个节点上重新创建失败的 pod,因为存储和数据库没有在任何 k8s 节点上运行

在私有云中有效但在 Kubernetes 中无效的解决方案:

  • 使用本地存储

  • 通过使用 mysqlfailover 实用程序,以便它可以指定一个新的主节点

  • 通过更改“mysql-0”(主服务器)的 DNS 记录并指示应用程序刷新 DNS,以便在故障转移事件中可以看到新的主服务器

探索 Kubernetes 解决方案:

  • 哪一个使用本地存储还是NFS?(如果是NFS,如何在不同的服务器之间建立集群?)

  • 通过使用https://github.com/oracle/mysql-operator、Percona、类似的解决方案,甚至相同的 mysqlfailover - 您更喜欢哪一个,以及它如何处理故障转移情况?最好是开源选项。

如果我尝试合并当前有效的 mysqlfailover 解决方案并转移到 Kubernetes,我可能需要设置 Node Affinity,以便 pod 正确连接其本地存储。

此外,mysqlfailover 机制也应该改进(起点在这里https://medium.com/@zzdjk6/step-by-step-setup-gtid-based-mysql-replica-and-automatic-failover-with-mysqlfailover-using-docker-489489d2922),因为它可以例如指定一个新的主 mysql-1,而原始主节点 (mysql-0) 已关闭。根据我的理解,这可能不是最佳选择,因为在通常的架构中,我们总是希望在 StatefulSet 中将 mysql-0 作为主节点,而 mysqlfailover 的工作方式则完全相反。

那么,如果不解决现有问题,您会选择哪种方案?您会采取哪些步骤?您会使用哪些 MySQL 和 Kubernetes 组件?

非常感谢

答案1

我最终选择的解决方案是 Kubernetes 上的 Percona XtraDB Cluster。它有一个 Kubernetes 操作员来自动管理故障转移场景。

您的应用程序不应该知道有关集群的任何信息,因为它在 下透明地进行了排序kubernetes-service-hostname:3306。因此应用程序调用此地址,其后面有 3 个 SQLProxy/HAProxy 容器(每个服务器)。然后查询被路由到三个 MySQL 容器之一。

当服务器发生故障时,失败的 SQLProxy/HAProxy 和 MySQL 容器将从 Kubernetes 中删除,因此kubernetes-service-hostname只包含两个而不是三个成员。

当服务器重新上线时,将创建容器以再次拥有完整的集群。

还有 Percona 操作员容器,它可以自动帮助管理 pod 并执行其他操作,以使集群完全运行。

在存储方面,它可以只是hostPath本地目录,从存储角度来看,这显示出了简单的标志。您还可以使用PersistentVolumeClaim任何类型的存储类或外部存储,例如 NFS。

它实际上是多主设置。

更多细节:

https://www.percona.com/doc/kubernetes-operator-for-pxc/kubernetes.html

相关内容