我对由 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)已关闭。根据我的理解,这可能不是最佳选择,因为在通常的架构中,我们总是希望 mysql-0 作为 StatefulSet 中的主节点,而 mysqlfailover 则完全相反。
那么,如果不解决现有问题,您会选择哪个选项?你会采取哪些步骤?你会使用哪些 MySQL 和 Kubernetes 组件?
非常感谢
我最终得到的解决方案是 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