跳转到主要内容

【未完成】使用 Pacemaker 实现 MySQL 高可用

假设我们有一个 3 节点 MySQL 集群,显然我们需要有一个负载均衡/反向代理/自动故障转移服务,来将访问路由到可用的节点上。

传统上我们通常使用一个或一组负载均衡服务器来部署 HAProxy 或是 ProxySQL,访问该节点的 IP 就行了。

但要是部署 HAProxy 或是 ProxySQL 的负载均衡单个服务器挂了呢?
这就叫 SPOF,Single Point of Failure 单点故障。显然负载均衡也是需要高可用的。

那要是我们使用一组服务器部署负载均衡呢?
我想这样成本太高了。而且在流量不是太高和 Mysql 服务器性能不是太弱的情况下,完全可以和 Mysql 部署在同一台服务器上。

 

因此我觉得,我们可以在每一个 MySQL 节点上都部署一个  Pacemaker 来提供 VIP(Virural IP / 虚拟 IP) 来管理要路由到哪一个 MySQL 上,客户端始终访问 VIP 即可。
这样我们就可以保证只要有 MySQL 节点存活,就始终可以访问。
当然这就要求 MySQL 节点有多余的性能可以部署 Pacemaker。

如果你的应用场景需要网络层面的负载均衡,比如分散读取请求到多个节点,则你可能需要使用 Pacemaker 使 HAProxy 或  ProxySQL 高可用,然后再由它们转发到 MySQL 服务器,原理是一样的。

你也可以使用 Keepalived 来简单配置一个 VIP,只是功能上不如 Pacemaker 强大。

 

名词解释

什么是 Pacemaker 堆栈

pacemaker 是一个高可用的集群资源管理器,它的核心是一个能够协调一组机器上相互关联的服务的启动和恢复的分布式有限状态机(指 CRMd / Cluster Resource Management daemon)。
Pacemaker 支持多种资源代理标准(LSB 初始化脚本、OCF 资源代理、systemd 单元文件等)来管理任何服务,并且可以对它们之间的复杂关系(托管、排序等)进行建模。
Pacemaker 支持高级服务配置,例如依赖资源组、必须在多台机器上处于活动状态的克隆资源、可以在两个不同角色之间切换的资源以及容器化服务。

Pacemaker 堆栈包括以下组件:

名称

功能

libQB

 libqb 是一个库,其主要目的是为客户端/服务器应用程序提供高性能、可重用的功能,包括高性能日志记录、跟踪、IPC 和轮询

Corosync 消息层组件,管理成员关系、消息与仲裁,为高可用环境中提供通讯服务,位于高可用集群架构的底层,为各节点之间提供心跳信息
Resource agents  资源代理,在节点上接收 CRM 的调度,一般通过脚本对资源进行管理
Fencing agents 关闭不稳定或无答复的节点,以保障集群的其它资源,其主要功能是消除脑裂
Pacemaker 资源管理器,负责启停服务,位于集群架构中资源管理、资源代理层

这里有一点点迷惑,Pacemaker 堆栈是一组组件,其中包括 Pacemaker 本身。
在过去,Pacemaker 还支持 Corosync 1(有或没有 CMAN 的区别)以及 Heartbeat。
不同的发行版支持不同的集群层,需要不同的设置。我们将 Pacemaker 和集群层的每个组合称为“堆栈”。
真心希望 clusterlabs 能给它改个名字。

详情见:

 

说人话就是:

Pacemaker 是一个开源的集群资源管理器,用于监视和控制集群中的资源和服务。它可以管理各种资源,如虚拟 IP 地址、文件系统、数据库、应用程序等,以确保它们在集群节点之间实现高可用性。Pacemaker 提供了一个策略引擎,可以根据定义的资源约束和策略来自动调整资源的分配,以处理故障情况和负载均衡。

Corosync 是一个开源的通信框架,用于在集群节点之间提供高可用性集群通信。它提供了可靠的消息传递和集群成员检测机制,以确保节点之间的协调和同步。Corosync 负责维护集群成员的状态信息,以便 Pacemaker 可以基于此信息做出决策。它通常与Pacemaker 一起使用,作为 Pacemaker 的底层通信基础设施。

总之,Pacemaker 负责管理和监视集群资源,Corosync 则负责在集群节点之间提供通信和协同工作的能力,以确保高可用性和故障容忍性。它们共同构成了一个完整的高可用性解决方案,通常用于关键业务应用程序和服务的部署,以确保系统在面临硬件或软件故障时保持可用。

 

什么是 HAProxy

HAProxy 是一种开源、非常快速且可靠的反向代理,可为基于 TCP 和 HTTP 的应用程序提供高可用性、负载均衡和代理。

 
什么是 ProxySQL

ProxySQL 是一个开源的数据库代理服务器,主要用于数据库负载均衡、路由、缓存查询、读写分离、故障转移和监控等任务,可以自动故障转移,但没有 VIP 功能。

MySQL 集群

在 MySQL 集群方面我选择了 Percona XtraDB Cluster (PXC),这是一种自由的使用 Galera Cluster 的多主集群,可以自动确保节点间数据一致性等(不支持 XA 事务)。

将普通 MySQL 服务器迁移至 PXC 很简单,只需卸载 Mysql 包(不会删除数据,但最好备份),然后安装 PXC 包,安装文档说明引导第一个节点,添加其他节点后数据会自动同步,非常省心。
详见:https://docs.percona.com/percona-xtradb-cluster/8.0/install-index.html

如果你不幸拥有偶数个节点且不想再添加一个相同性能的节点,那么可以添加一个轻量级 Galera Arbitrato(Galera 仲裁器),仲裁器作为集群普通成员参与投票(不储存数据,但集群同步数据时都会发他一份,所以你也需要考虑该节点的网络),此外 Galera Arbitrato 还可以充当节点之间的数据中继服务器。

 

 

 

 

待续

 

 

 

 

 

 

 

 

主要参考