使用Xenon工具搭建高可用MySQL集群实战(上)
一、Xenon简介
1.1、Xenon是什么
Xenon是一款由青云开发团队开源的新一代 MySQL集群高可用工具。基于 Raft协议进行无中心化选主,实现主从秒级切换;基于无损半同步(Semi-Sync)机制,保障数据不丢失,实现数据强一致性。并结合MySQL(5.7 及以上版本)并行复制特性,实现Binlog并行回放,极大降低从库延迟。
1.2、Xenon架构特点
序号 | Xenon架构的特点 |
1 | Xenon基于Raft协议进行无中心化选主,并能实现秒级切换。 |
2 | 数据一致性依赖于无损半同步Semi-Sync。 |
3 | 借助于配置项leader-start-command和leader-stop-command调用脚本完成故障切换; 同时,通过调用Xtrabackup可实现数据热备份和恢复。 |
4 | 支持MySQL5.7及其更高内核版本。 |
1.3、Xenon的工作原理
序号 | Xenon的工作原理 |
1 | Xenon是基于Raft+Semi-Sync+GTID实现的高可用,保证大多数节点接收到数据。 而Raft基于心跳管理,如果从节点超时收不到主的心跳,会尝试发起选举,若得到超过半数(非 IDLE 节点)的选票,则会当选为主节点。 |
2 | 我们以这三节点(一主两从)Xenon 集群来简单说明工作原理。 {Leader, [GTID:{1,2,3,4,5}] {Follower1, [GTID:{1,2,3,4,5}] {Follower2, [GTID:{1,2,3}] 《1》当 Leader 不可用时,Follower1 和 Follower2 立即参与竞选成为主节点。 《2》Xenon校验GTID值较高的Follower成为新主节点,示例中GTID值较高的是Follower1。当GTID值最高的Follower被选举成为新主时,将结束竞选。 《3》示例中Follower1成为新主节点后,将会拒绝 Follower2 的选举。接着,自动完成主从切换。 |
二、MySQL基础知识
2.1、全局事务标识符(GTID)
2.1.1、什么是GTID
GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识,保存在mysql数据目录下的auto.cnf文件里。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调增。
GTID的复制方式是从MySQL5.6.5开始的。通过GTID保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。相比传统的复制,GTID复制对于运维更加友好,根据GTID可以知道事务最初是在哪个实例上提交的,产生多少事物等,都可以非常直接的标识出来。
2.1.2、GTID的工作原理
序号 | GTID的工作原理 |
1 | master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。 |
2 | slave端的I/O线程将变更的binlog,写入到本地的relay log中。 |
3 | sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录: 《1》若有记录,说明该GTID的事务已经执行,slave会忽略。 《2》若没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。 |
2.2、MySQL主从复制的三种类型
高可用MySQL的整体解决方案、体系化原理和指导思路https://coffeemilk.blog.csdn.net/article/details/152078348
2.2.1、异步复制
在mysql异步复制的情况下,Master Server将自己的binlog通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志。那么,当master宕机后,如果master不能恢复,此时,只能用slave代替master,但slave处于同步落后的状态,就会导致数据丢失。 | |
优点 | 缺点 |
复制的性能最好 | master挂掉后,slave可能会丢失事务 |
2.2.2、全同步复制
在全同步复制中,master将自己的binlog写入到bin-log文件并且sync,然后向存储引擎提交事务,然后一直等待ACK,同时要求所有slave接收到binlog,写入relay-log后,并完成日志回放,同时返回ACK确认信息,master在接收到所有从库ACK确认信息后,才将结果返回给客户端。 | |
优点 | 缺点 |
数据不会丢失 | 会阻塞master session,性能太差,非常依赖网络 |
2.2.3、半同步复制
半同步复制,又分为两种,分别是【传统半同步复制】和【无损半同步复制】。
2.2.3.1、传统半同步复制
在传统半同步复制的架构下,master将自己的binlog写入到bin-log文件并且sync,且向存储引擎提交事务,然后一直等待ACK。当至少一个slave接收到binlog后,写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后,就将结果返回给客户端。【由此可知,传统半同步复制对于客户的请求响应稍微慢点,但是它可以保证二进制日志的完整性】。 | |
传统半同步的特点: 由于master是在三段提交的最后commit阶段完成后才等待,所以master的其他session是可以看到这个提交事务的,所以这时候master上的数据和slave不一致,master crash后,slave有数据丢失。 | |
参数rpl_semi_sync_master_wait_point在MySQL的半同步复制中,控制master在哪个阶段等待来自slave的ACK确认。在MySQL5.7中,该参数主要有两个值:after_commit和after_sync。 《1》after_commit:这其实就是传统的半同步复制,master将自己的binlog写入到bin-log文件并且sync,且向存储引擎提交事务,然后一直等待ACK。当至少一个slave接收到binlog后,写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后,就将结果返回给客户端。 《2》after_sync:这其实就是后面马上要讲到的无损半同步复制,master将自己的binlog写入到binlog文件并且sync,之后会进入等待ACK,当至少一个slave接收到binlog之后,写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后,向存储引擎提交事务,最终返回给客户端。 | |
| |
优点 | 缺点 |
会有数据丢失风险,但很低。 | 会阻塞master session,性能稍差,非常依赖网络。 |
2.2.3.2、无损半同步复制
master将自己的binlog写入到binlog文件并且sync,之后会进入等待ACK,当至少一个slave接收到binlog之后,写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后,向存储引擎提交事务,最终返回给客户端。 | |
重点: 由于master是在三段提交的第二阶段sync binlog完成后才等待, 所以master的其他session是看不见这个提交事务的,所以这时候master上的数据和slave一致,master crash后,slave没有丢失数据。 | |
| |
优点 | 缺点 |
数据零丢失,性能好 | 会阻塞master session,非常依赖网络 |
三、使用Xenon工具搭建高可用MySQL集群
3.1、使用Xenon工具实现MySQL高可用环境说明
系统环境说明 《1》采用三台物理机或虚拟机,都使用OpenEuler2203LTS或(RHEL9/Almalinux9.1)及其更高系统。 《2》MySQL版本:二进制安装的8.4.6。 《3》xtrabackup:8.4.6版本。 | |||||
序号 | IP地址 | 端口号 | 主机名 | 角色 | |
1 | 192.168.1.36 | 13336 | xenon1 | node节点 | |
2 | 192.168.1.37 | 13336 | xenon2 | node节点 | |
3 | 192.168.1.38 | 13336 | xenon3 | node节点 | |
4 | 192.168.1.227 | 13336 | 无 | VIP | |
注意:这里的vip地址是跟随xenon集群启动的,默认vip会绑定在xenon选举出来的master节点上,程序要连接mysql的话,连接使用的就是这个vip地址。 |
3.2、操作环境的相关配置
3.2.1、创建MySQL用户和配置主机名称
#在三台mysql节点服务器上都需要创建【mysql】用户并设置相同密码(密码需要记住后续在xenon工具配置使用【如密码设置为:qwas%1357】)
useradd mysqlpasswd mysql
#在三台mysql节点服务器上都需要配置主机的hosts,方便后续通过域名解析#方法一:直接给主机配置文件【/etc/hosts】追加这三台服务器的IP和名称内容(注意:ip地址需要根据自己的实际情况修改)
echo -e "192.168.1.36\txenon1\n192.168.1.37\txenon2\n192.168.1.38\txenon3\n" >> /etc/hosts#方法二:编辑主机配置文件【/etc/hosts】(注意:ip地址需要根据自己的实际情况修改)
vi /etc/hosts192.168.1.36 xenon1
192.168.1.37 xenon2
192.168.1.38 xenon3
查看和修改Linux的主机名称https://blog.csdn.net/xiaochenXIHUA/article/details/152363961?spm=1001.2014.3001.5501
#修改三台MySQL服务器的主机名称#1-修改第一台MySQL服务器主机名称为 xenon1
hostnamectl set-hostname xenon1
exec bash#2-修改第二台MySQL服务器主机名称为 xenon2
hostnamectl set-hostname xenon2
exec bash#3-修改第三台MySQL服务器主机名称为 xenon3
hostnamectl set-hostname xenon3
exec bash
3.2.2、配置三台MySQL服务器互信
注意:配置ssh互信,是指配置三个节点服务器之间的免密码登录。这个免密码登录,是在mysql用户上执行的配置,因为后面所有对xenon的操作,都是在mysql用户下完成的。
#配置三台MySQL服务器互信#1-配置xenon1节点互信
su - mysql
ssh-keygen -t ed25519 -C "ck@163.com"
cd /home/mysql/.ssh/
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon2
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon3#2-配置xenon2节点互信
su - mysql
ssh-keygen -t ed25519 -C "ck@163.com"
cd /home/mysql/.ssh/
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon1
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon3#3-配置xenon3节点互信
su - mysql
ssh-keygen -t ed25519 -C "ck@163.com"
cd /home/mysql/.ssh/
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon1
ssh-copy-id -i id_ed25519.pub -p 22 mysql@xenon2
实现Linux的ssh免密登录实操保姆级教程https://blog.csdn.net/xiaochenXIHUA/article/details/152375722?spm=1001.2014.3001.5501
3.3、配置mysql用户sudo权限
由于xenon在执行master、slave故障切换的时候,需要将vip地址也切换过去,而xenon是运行在mysql用户下的,所以需要给mysql用户做一个授权,让这个普通用户能够执行ip这个linux命令。
#1-配置mysql用户sudo权限(注意需要给三台MySQL服务器都执行)#方法一:修改/etc/sudoers文件添加mysql用户无密码操作ip权限
vi /etc/sudoers
mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip#方法二:直接使用echo命令添加到/etc/sudoers文件末尾
echo -e "mysql\tALL=(ALL)\tNOPASSWD: /usr/sbin/ip" >> /etc/sudoers#2-验证给mysql用户设置的sudo无密码操作ip权限(若执行如下命令后有本机ip地址信息输出,表示配置正确)
su - mysql -c "sudo ip a"
Linux的用户和用户组与权限解析、环境变量说明与配置、sudo配置解析和使用https://coffeemilk.blog.csdn.net/article/details/149323633