kubernetes - 在 kubernetes/docker swarm 中部署 mariadb galera 集群

标签 kubernetes mariadb galera

我正在尝试部署 可扩展 kubernetes 或 docker swarm 中的 mariadb galera 集群。由于每个 pod 或容器都需要自己的 galera 配置,我应该如何创建我的部署以便能够在没有任何手动工作的情况下对其进行扩展?我认为我们不能使用 ConfigMap,因为 10 节点集群必须有 10 个 configmap!

节点的 mariadb galera 配置示例:

wsrep_cluster_address="gcomm://ip_1,ip_2,ip_3"    
wsrep_node_address="ip_1"    
wsrep_node_name="node_1"
wsrep_cluster_name="mariadb-cluster"

对于每个节点具有不同配置的此类应用程序,最好的部署方式是什么?

注意:我可以创建 Pod/容器并自己进行配置(将新节点加入集群),但我认为这不是正确的方法,我需要它是自动可扩展的。

最佳答案

您几乎肯定想使用 StatefulSet在 Kubernetes 中部署它。除其他外,这具有每个 Pod 将获得自己的 PersistentVolumeClaim 用于存储的属性,并且各个 Pod 的名称是可预测的和连续的。你应该 create a matching headless Service然后每个 Pod 都会有一个匹配的 DNS 名称。

这解决了谜语的几个部分:

# You pick this
wsrep_cluster_name="mariadb-cluster"

# You know what all of these DNS names will be up front
wsrep_cluster_address="gcomm://galera-0.galera.default.svc.cluster.local,...,galera-9.galera.default.svc.cluster.local"

对于 wsrep_node_name , MariaDB documentation表示它默认为主机名。在 Kubernetes 中,主机名默认为 Pod 名,Pod 名是连续的 galera-n 之一对于由 StatefulSet 管理的 pod,因此您无需手动设置。
wsrep_node_address更棘手。这里the documentation表示有启发式方法来猜测它(特别注意它可能对容器不可靠)。在创建单个 pod 之前,您无法知道它的 IP 地址。您原则上可以使用 downward API将 pod 的 IP 地址注入(inject)到环境变量中。我首先希望启发式算法能够猜出 pod IP 地址,并且这工作得很好(这是 headless 服务最终会解决的问题)。

剩下的就是 ConfigMap 中的上述 block ,并且它在所有副本中都是全局的。其他剩余的每个 Galera 节点的值应该是可以自动猜测的。

关于kubernetes - 在 kubernetes/docker swarm 中部署 mariadb galera 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58156046/

相关文章:

spring - 集群环境下的调度器

kubernetes - 从 kubectl 输出显示失败的 pod

kubernetes - kubectl exec 到多容器 pod 的容器中

mysql - 获取所有时间前 5 个国家最近 7 天的总数

mysql - 从其他表替换 MariaDB 中的列值

Mysql 对有条件的行进行部分求和

kubernetes - 监控 GKE 上运行的 Cronjob

tomcat - Kubernetes 正常关闭 Spring Boot Tomcat 应用程序

mysql - Galera Mysql Cluster XA 事务替代方案