
MySQL Router高可用搭建
- 安装简介
- 高可用搭建
- 高可用及负载均衡测试
- 问题处理
一、安装简介
1.1 安装目的
MySQL官方提供了InnoDB Cluster,该集群由MySQL MGR和MySQL Router组成。MySQL MGR在数据库层面实现自主高可用性,而MySQL Router则负责代理访问。在部署完成后,MySQL Router将形成单点,如果出现故障,将会影响数据库集群的可用性。因此,为了提高数据库系统的可用性,需要搭建MySQL Router的高可用性方案。
1.2 MySQL router高可用组件介绍
本篇文章中的高可用方案,主要是通过Corosync和Pacemaker是两个开源软件项目实现,它们结合起来为高可用性集群提供了通信、同步、资源管理和故障转移等服务。
1.2.1 corosync
Corosync是一个开源的高可用性集群通信和同步服务,可以实现集群节点之间的通信和数据同步,同时提供了可靠的消息传递机制和成员管理功能,以确保在分布式环境下集群的稳定运行。 Corosync基于可靠的UDP多播协议进行通信,并提供了可插拔的协议栈接口,可以支持多种协议和网络环境。它还提供了一个API,可以让其他应用程序使用Corosync的通信和同步服务。
1.2.2 pacemaker
Pacemaker是一个开源的高可用性集群资源管理和故障转移工具,可以实现在集群节点之间自动管理资源(如虚拟IP、文件系统、数据库等),并在节点或资源故障时进行自动迁移,从而确保整个系统的高可用性和连续性。 Pacemaker支持多种资源管理策略,可以根据不同的需求进行配置。它还提供了一个灵活的插件框架,可以支持不同的集群环境和应用场景,比如虚拟化、云计算等。
将Corosync和Pacemaker结合起来,可以提供一个完整的高可用性集群解决方案。它通过Corosync实现集群节点之间的通信和同步,通过Pacemaker实现集群资源管理和故障转移,从而确保整个系统的高可用性和连续性。 它们结合起来为高可用性集群提供了可靠的通信、同步、资源管理和故障转移等服务,是构建可靠、高效的分布式系统的重要基础。
1.2.3 ldirectord
ldirectord是一个用于Linux系统的负载均衡工具,它可以管理多个服务器上的服务,并将客户端请求分发到这些服务器中的一个或多个上,以提高服务的可用性和性能。ldirectord通常是与Heartbeat或Keepalived等集群软件一起使用,以确保高可用性和负载均衡。 ldirectord主要用途包括:
- 负载均衡:ldirectord可以基于不同的负载均衡算法进行请求分发,例如轮询、加权轮询、最少连接、源地址哈希等。它可以将客户端请求分发到多个后端服务器中的一个或多个上,从而实现负载均衡。
- 健康检查:ldirectord可以定期检查后端服务器的可用性,并将不可用的服务器从服务池中排除,从而确保服务的高可用性和稳定性。
- 会话保持:ldirectord可以根据客户端的IP地址、Cookie等标识,将客户端请求路由到相同的后端服务器上,从而实现会话保持,确保客户端与后端服务器之间的连接不会被中断。
- 动态配置:ldirectord支持动态添加、删除、修改后端服务器和服务,管理员可以通过命令行或配置文件等方式进行操作,从而实现动态配置。
ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。 ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控,如果服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过ipvsadm 进行添加。
2、安装规划
MySQL及MySQL Router版本均为8.0.32
IP | 主机名 | 安装组件 | 使用端口 |
172.17.140.25 | gdb1 | MySQL MySQL Router ipvsadm ldirectord pcs pacemaker corosync | MySQL:3309 MySQL Router:6446 MySQL Router:6447 pcs_tcp:13314 pcs_udp:13315 |
172.17.140.24 | gdb2 | MySQL MySQL Router ipvsadm ldirectord pcs pacemaker corosync | MySQL:3309 MySQL Router:6446 MySQL Router:6447 pcs_tcp:13314 pcs_udp:13315 |
172.17.139.164 | gdb3 | MySQL MySQL Router ipvsadm ldirectord pcs pacemaker corosync | MySQL:3309 MySQL Router:6446 MySQL Router:6447 pcs_tcp:13314 pcs_udp:13315 |
172.17.129.1 | VIP | 6446、6447 | |
172.17.139.62 | MySQL client |
大概安装步骤如下
二、高可用搭建
2.1 基础环境设置(三台服务器都做)
- 分别在三台服务器上根据规划设置主机名
- 将下面内容追加保存在三台服务器的文件/etc/hosts中
- 在三台服务器上禁用防火墙
- 在三台服务器上禁用selinux,如果selinux未关闭,修改配置文件后,需要重启服务器才会生效
如下输出表示完成关闭
- 在三台服务器上分别执行下面命令,用户建立互相
建立互信,仅仅是为了服务器间传输文件方便,不是集群搭建的必要基础。
执行情况如下
任意切换服务器,不需要输入密码,则说明互相建立成功
- 时钟同步,对于分布式、集中式集群,时钟同步都非常重要,时间不一致会引发各种异常情况
2.2 通过MySQL Router搭建读写分离MGR集群
具体参考文章https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/deep-dive-mgr/deep-dive-mgr-07.md
2.3 在三台服务器上分别进行进行MySQL Router部署并启动,MySQL Router配置文件如下
2.4 验证三台MySQL Router连接测试
2.5 安装pacemaker
- 安装pacemaker
安装pacemaker会依赖corosync这个包,所以直接安装pacemaker这一个包就可以了
- 安装pcs管理工具
- 创建集群认证操作系统用户,用户名为hacluster,密码设置为abc123
- 启动pcsd,并且设置开机自启动
- 修改pcsd的TCP端口为指定的13314
重启pcsd服务,让新端口生效
- 设置集群认证信息,通过操作系统用户hacluster进行认证
- 创建集群,任意节点执行即可
- 确认完整的集群配置,在任意节点查看即可
- 启动所有集群节点的pacemaker 相关服务,任意节点执行即可
关闭服务时,使用pcs cluster stop --all,或者用pcs cluster stop 《server》关闭某一台
- 在每个节点上设置pacemaker相关服务开机自启动
- 没有STONITH 设备时,禁用STONITH 组件功能
禁用STONITH 组件功能后,分布式锁管理器DLM等资源以及依赖DLM的所有服务:例如cLVM2,GFS2,OCFS2等都将无法启动,不禁用时会有错误信息
完整的命令执行过程如下
- 验证pcs集群状态正常,无异常信息输出
2.6 安装ldirectord(三台都做)
- ldirectord下载
下载地址 https://rpm.pbone.net/info_idpl_23860919_distro_centos_6_com_ldirectord-3.9.5-%203.1.x86_64.rpm.html
新标签打开获取到地址后,可以用迅雷下载
- 下载依赖包ipvsadm
- 执行安装,如果安装过程中,还需要其他依赖,需要自行处理
- 创建配置文件/etc/ha.d/ldirectord.cf,编写内容如下
参数说明
-
checktimeout=3
:后端服务器健康检查等待时间 -
checkinterval=5
:两次检查间隔时间 -
autoreload=yes
:自动添加或者移除真实服务器 -
logfile="/var/log/ldirectord.log"
:日志文件全路径 -
quiescent=no
:故障时移除服务器的时候中断所有连接 -
virtual=172.17.129.1:6446
:VIP -
real=172.17.140.25:6446 gate
:真实服务器 -
scheduler=rr
:指定调度算法:rr为轮询,wrr为带权重的轮询 -
service=mysql
:健康检测真实服务器时ldirectord使用的服务 -
protocol=tcp
:服务协议 -
checktype=connect
:ldirectord守护进程使用什么方法监视真实服务器 -
checkport=16310
:健康检测使用的端口 -
login="root"
:健康检测使用的用户名 -
passwd="a123456"
:健康检测使用的密码 -
database="information_schema"
:健康检测访问的默认database -
request="SELECT1"
:健康检测执行的检测命令
将编写好的配置文件,分发到另外两个服务器
2.7 配置回环网卡上配置VIP(三台都做)
此操作用于pcs内部负载均衡,在lo网卡上配置VIP用于pcs cluster内部通信,如果不操作,则无法进行负载均衡,脚本内容如下vip.sh,放在mysql_bin目录即可
启动配置
停止配置
2.8 集群资源添加(任意节点执行即可)
- pcs中添加vip资源
命令解析
-
pcs resource create
:pcs创建资源对象的起始命令 -
vip
: 虚拟IP(VIP)资源对象的名称,可以根据需要自定义 -
--disable
: 表示在创建资源对象时将其禁用。这是为了避免资源在尚未完全配置的情况下被Pacemaker集群所使用 -
ocf:heartbeat:IPaddr
:告诉Pacemaker使用Heartbeat插件(即ocf:heartbeat)中的IPaddr插件来管理这个VIP资源 -
nic=eth0
:这个选项指定了网络接口的名称,即将VIP绑定到哪个网卡上 -
ip=172.17.129.1
:指定了要分配给VIP的IP地址 -
cidr_netmask=24
:指定了VIP的子网掩码。在这个例子中,CIDR格式的子网掩码为24,相当于255.255.255.0 -
broadcast=172.17.143.255
:指定了广播地址 -
op monitor interval=5s timeout=20s
:定义了用于监视这个VIP资源的操作。interval=5s表示Pacemaker将每5秒检查一次资源的状态,timeout=20s表示Pacemaker将在20秒内等待资源的响应。如果在这20秒内资源没有响应,Pacemaker将视为资源不可用。
- pcs中添加lvs资源
命令解析
-
pcs resource create
:pcs创建资源对象的起始命令 -
lvs
: 虚拟IP(VIP)资源对象的名称,可以根据需要自定义 -
--disable
: 表示在创建资源对象时将其禁用。这是为了避免资源在尚未完全配置的情况下被Pacemaker集群所使用 -
ocf:heartbeat:ldirectord
:告诉Pacemaker使用Heartbeat插件(即ocf:heartbeat)中的ldirectord插件来管理LVS的负载均衡器,使用的配置文件为上面配置的/etc/ha.d/ldirectord.cf -
op monitor interval=10s timeout=10s
:定义了用于监视这个LVS资源的操作。interval=10s表示Pacemaker将每10秒检查一次资源的状态,timeout=10s表示Pacemaker将在10秒内等待资源的响应。如果在这10秒内资源没有响应,Pacemaker将视为资源不可用。
- 创建完成后检测resource状态
- 创建resource group,并添加resource
2.9 集群启停
集群启动
- 启动resource
如果之前有异常,可以通过下面的命令清理异常信息,然后再启动
- 启动状态确认,执行命令
pcs status
输出结果说明
Cluster name: gdb_ha
: 集群的名称为 gdb_ha。
Stack: corosync
:该集群使用的通信协议栈为 corosync。
`Current DC: gdb3 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum ``:当前的集群控制器(DC)为 gdb3,其版本为 1.1.23-1.el7_9.1-9acf116022,并且该节点所在的分区具有投票权。
Last updated: Thu Feb 23 15:55:27 2023
:最后一次更新集群状态信息的时间为 2023 年 2 月 23 日 15:55:27。
Last change: Thu Feb 23 15:53:55 2023 by hacluster via crmd on gdb2
:最后一次更改集群配置的时间为 2023 年 2 月 23 日 15:53:55,由用户 hacluster 通过 crmd 在节点 gdb2 上执行。
3 nodes configured
:该集群配置了 3 个节点。
2 resource instances configured
:该集群中配置了 2 个资源实例。
Online: [ gdb1 gdb2 gdb3 ]
:当前在线的节点为 gdb1、gdb2 和 gdb3。
Full list of resources
:列出了该集群中所有的资源,包括资源名称、资源类型和所在节点,以及资源的启动状态和当前状态。其中,dbservice 是资源组名称,lvs 是类型为 ocf::heartbeat:ldirectord 的资源,vip 是类型为 ocf::heartbeat:IPaddr 的资源。
Daemon Status
:列出了 Pacemaker 各个组件的运行状态,包括 corosync、pacemaker 和 pcsd。corosync、pacemaker 和 pcsd 均为 active/enabled 状态,表示它们都在运行并且已经启用。
- 在上面pcs status输出的vip Started gdb3的gdb3服务器上启动ldirectord服务
通过上述操作即完成集群启动。
集群停止
- 停止resource
卸载集群
三、高可用及负载均衡测试
- 在172.17.139.62上通过for循环,访问VIP,观察负载均衡情况
注意:VIP无法在real server服务器上进行访问,因此需要第4台服务器进行访问验证
在pcs resource lvs运行的服务器上,执行ipvsadm -Ln
可以看到访问被平均负载到每个服务器上了。
在每个服务器上,通过netstat -alntp| grep 172.17.139.62确认请求的存在,其中172.17.139.62是发起请求的IP地址。
- 停止gdb3服务器上的MySQl Router,重新发起100个新的请求,观察路由转发情况
通过上述结果可以看到,gdb3服务器的MySQL Router停止后,路由规则从集群中剔除,再次发起的100个请求,平均分配到了剩下的两个服务器上,符合预期效果。
四、问题处理
- pcs cluster启动异常
添加超时参数,再次启动
也有可能是其他节点的pcsd服务没有启动成功,启动其他节点pcsd服务后再启动pcs cluster
- 两个节点的pcs集群,需要关闭投票机制
- 日志文件查看,如果启动、运行异常,可以查看下面两个日志文件,分析具体异常原因
- pcs status输出offline节点
- 启动sh vip.sh start后节点退出集群
但是由于real server的是172.17.140.24、172.17.140.25、172.17.139.164,此时使用255.255.240.0无法通信,将其修改为255.255.0.0,再次启动后访问正常。
文章转载自公众号:GreatSQL社区
