当前位置: 首页 > article >正文

MySQL集群高可用工具Xenon

目录1、xenon基础介绍1.1. xenon是什么1.2. xenon的架构1.3. Xenon的工作原理2、全局事务标识符(GTID)2.1. 什么是GTID2.2. GTID的工作原理3、Mysql主从复制的三种类型3.1. 异步复制3.2. 全同步复制3.3. 半同步复制4、xenon部署环境介绍4.1. 系统环境说明4.2. 服务器规划4.3. 配置主机host4.4. 配置SSH互信4.5. 配置mysql用户sudo权限5、xenon以及相关软件安装5.1. 安装mysql(二进制)5.2. 安装xtrabackup5.3. 安装xenon6、xenon配置过程详解6.1. 配置xenon6.2. 对xenon进行授权7、启动xenon集群与状态监控8、xenon集群日常维护8.1. 监控集群状态8.2. 添加/删除节点8.3. Rebuild 重建节点8.4. 备份 MySQL到本地8.5. 关闭集群9、xenon集群故障切换实践9.1. 手动 Failover/switchover9.2. slave节点故障切换过程9.3. master节点故障切换过程1、xenon基础介绍1.1. xenon是什么Xenon是一款由青云开发团队开源的新一代 MySQL集群高可用工具。基于 Raft协议进行无中心化选主实现主从秒级切换基于Semi-Sync机制保障数据不丢失实现数据强一致性。并结合MySQL5.7及以上版本并行复制特性实现Binlog并行回放大大降低从库延迟。xenon的github地址为https://github.com/radondb/xenon1.2. xenon的架构Xenon的特点(1)、Xenon基于Raft协议进行无中心化选主并能实现秒级切换。(2)、数据一致性依赖于无损半同步Semi-Sync。(3)、借助于配置项leader-start-command和leader-stop-command调用脚本完成故障切换同时通过调用Xtrabackup可实现数据备份和恢复。(4)、支持MySQL5.6、5.7、8.0内核版本。1.3. Xenon的工作原理Xenon是基于RaftSemi-SyncGTID实现的高可用, 保证大多数节点接收到数据。而Raft基于心跳管理, 如果从节点超时收不到主的心跳, 会尝试发起选举, 若得到超过半数非 IDLE 节点的选票, 则会当选为主节点。下面以三节点 (一主两从) Xenon集群来简单说明工作原理。{Leader, [GTID:{1,2,3,4,5}]} {Follower1, [GTID:{1,2,3,4,5}]} {Follower2, [GTID:{1,2,3}]}当 Leader 不可用时, Follower1 和 Follower2 立即参与竞选成为主节点。Xenon校验GTID值较高的Follower 成为新主节点, 上例中GTID值较高的是Follower1 。当GTID值最高的Follower被选举成为新主时, 将结束竞选。示例中Follower1成为新主节点后, 将会拒绝 Follower2 的选举。接着, 自动完成主从切换。2、全局事务标识符(GTID)2.1. 什么是GTIDGTID(Global Transaction ID)是对于一个已提交事务的编号并且是一个全局唯一的编号。GTID实际上是由UUIDTID组成的。其中UUID是一个MySQL实例的唯一标识保存在mysql数据目录下的auto.cnf文件里。TID代表了该实例上已经提交的事务数量并且随着事务提交单调递增。GTID的复制方式是从MySQL5.6.5开始的。通过GTID保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性故障恢复以及容错能力。相比传统的复制GTID复制对于运维更加友好根据GTID可以知道事务最初是在哪个实例上提交的产生多少事物等都可以非常直接的标识出来。2.2. GTID的工作原理大致分为如下几个步骤:master更新数据时会在事务前产生GTID一同记录到binlog日志中。slave端的i/o线程将变更的binlog写入到本地的relaylog中。sql线程从relay log中获取GTID然后对比slave端的binlog是否有记录。如果有记录说明该GTID的事务已经执行slave会忽略。中执行该GTID的事务并记录到binlog。·如果没有记录slave就会从relaylog3、Mysql主从复制的三种类型3.1. 异步复制在mysql异步复制的情况下Master Server将自己的binlog通过复制线程传输出去以后MysqlMaster Sever就自动返回数据给客户端而不管slave上是否接受到了这个二进制日志。那么当master宕机后如果master不能恢复此时只能用slave代替master但slave处于同步落后的状态就会导致数据丢失。优点复制的性能最好缺点master挂掉后slave可能会丢失事务3.2. 全同步复制操作完数据库之后binlog的线程会发送请求到备份节点日志必须等待备份节点执行完成之后主节点才能执行后续的操作优点数据不会丢失缺点性能低、非常依赖网络3.3. 半同步复制半同步复制又分为两种分别是传统半同步复制和无损半同步复制。传统半同步复制在传统半同步复制的架构下master将自己的binlog写入到bin-log文件并且sync且向存储引擎提交事务然后一直等待ACK。当至少一个slave接收到binlog后写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后就将结果返回给客户端。优点会有数据丢失风险但很低。缺点会阻塞master session性能稍差非常依赖网络。特点由于master是在三段提交的最后commit阶段完成后才等待所以master的其他session是可以看到这个提交事务的所以这时候master上的数据和slave不一致master crash后slave有数据丢失。无损半同步复制(常用master自己的binlog写入到binlog文件并且sync之后会进入等待ACK当至少一个slave接收到binlog之后写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后向存储引擎提交事务最终返回给客户端。优点数据零丢失性能好缺点会阻塞master session非常依赖网络重点由于master是在三段提交的第二阶段sync binlog完成后才等待所以master的其他session是看不见这个提交事务的所以这时候master上的数据和slave一致master crash后slave没有丢失数据。要开启无损半同步复制需要设置如下几个参数:plugin_load rpl_semi_sync_mastersemisync_master.so;rpl_semi_sync_slavesemisync_slave.so loose_rpl_semi_sync_master_enabled 1 loose_rpl_semi_sync_slave_enabled 1 loose_rpl_semi_sync_master_timeout 5000参数rpl_semi_sync_master_wait_point在MySQL的半同步复制中控制master在哪阶段等待来自slave的ACK确认。在MySQL5.7中该参数主要有两个值after_commit和after_sync。after_commit: 这其实就是传统的半同步复制master将自己的binlog写入到bin-log文件并且sync并向存储引擎提交事务然后一直等待ACK。当至少一个slave接收到binlog后写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后就将结果返回给客户端。after_sync: 这其实就是后面马上要讲到的无损半同步复制master将自己的binlog写入到binlog 文件并且sync之后会进入等待ACK当至少一个slave接收到binlog之后写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后向存储引擎提交事务最终返回给客户端。4、xenon部署环境介绍4.1. 系统环境说明操作系统: RHEL8.3mysql版本: 二进制安装mysql-5.7.35xtrabackup: version 2.4.244.2. 服务器规划服务器相关IP规划如下:IP地址端口号主机名角色172.16.213.2333306xenon1node节点172.16.213.2343306xenon2node节点172.16.213.2353306xenon3node节点172.16.213.237无无vip注意,这里的vip地址是跟随xenon集群启动的默认vip会绑定在xenon选举出来的master节点上程序要连接mysql的话连接的就是这个vip地址。4.3. 配置主机host注意需要在三个mysql节点都执行如下操作修改系统的/etc/hosts文件添加如下内容127.0.0.1 localhost 172.16.213.233 xenon1 172.16.213.234 xenon2 172.16.213.235 xenon34.4. 配置SSH互信[mysqlxenon1 ~]# ssh-keygen [mysqlxenon1 ~]# ssh-copy-id xenon2 [mysqlxenon1 ~]# ssh-copy-id xenon3然后在xenon2节点执行如下操作[mysqlxenon2 ~]# ssh-keygen [mysqlxenon2 ~]# ssh-copy-id xenon1 [mysqlxenon2 ~]# ssh-copy-id xenon3最后在xenon3节点执行如下操作[mysqlxenon3 ~]# ssh-keygen [mysqlxenon3 ~]# ssh-copy-id xenon1 [mysqlxenon3 ~]# ssh-copy-id xenon24.5. 配置mysql用户sudo权限由于xenon在执行master、slave故障切换的时候需要将vip地址也切换过去而xenon是运行在mysql用户下的所以需要给mysql用户做一个授权让这个普通用户能够执行ip这个linux命令。注意下面的操作需要在三台mysql主机上都执行一遍。这里以xenon1为例修改/etc/sudoers文件添加如下内容[rootxenon1 ~]# vi /etc/sudoers mysql ALL(ALL) NOPASSWD: /usr/sbin/ip设置完成验证下设置是否生效执行如下操作[rootxenon1 ~]# su - mysql -c sudo ip a如果有本机ip地址信息输出表示配置正确。5、xenon以及相关软件安装5.1. 安装mysql(二进制)不赘述前文有提及二进制的mysql必须安装到/usr/local目录下解压即可完成安装安装完成后还需要做一些配置工作首先是添加mysql配置文件这里将mysql配置文件放到/usr/local/mysql/etc/my.cnf路径下配置文件内容如下[rootxenon1 ~]# vim /usr/local/mysql/etc/my.cnf [mysqld] datadir/usr/local/mysql/data socket/tmp/mysql.sock log-error/usr/local/mysql/logs/mysqld.log pid-file/usr/local/mysql/logs/mysqld.pid log_binmysql-bin server-id11 expire_logs_days 10 binlog_format row plugin-loadsemisync_master.so;semisync_slave.so master_info_repository TABLE relay_log_info_repository TABLE relay_log_recovery 1 loose_rpl_semi_sync_master_enabled 1 loose_rpl_semi_sync_slave_enabled 1 loose_rpl_semi_sync_master_timeout 3000 skip-slave-start gtid-mode ON enforce-gtid-consistency ON slave_parallel_type LOGICAL_CLOCK slave_parallel_workers4 slave_preserve_commit_order 1 log-slave-updates5.2. 安装xtrabackupxtrabackup是mysql的一个热备份、恢复工具xenon集成了xtrabackup可以实现集群的备份和迁移安装xtrabackup方法有很多可以下载rpm包直接安装也可以下载Percona提供的yum源进行安装这里通过Percona提供的yum源进行安装首先从https://www.percona.com/downloads/percona-release/ 下载Percona源然后放到服务器上进行安装即可。注意xtrabackup也需要在三个集群节点进行安装。这里以xenon1为例其它节点安装方法相同安装过程如下[rootxenon1 ~]# rpm -ivh percona-release-1.0-27.noarch.rpm有了这个yum源后接下来就可以安装xtrabackup了xtrabackup目前有两个大版本分别是percona-xtrabackup-24和percona-xtrabackup-80其中percona-xtrabackup-80版本主要是针对mysql5.7版本进行备份而percona-xtrabackup-80主要是针对mysql8.0以后的版本进行备份和恢复。这里我下载的是percona-xtrabackup-24安装如下:[rootxenon1 ~]# yum install -y percona-xtrabackup-24安装完成后执行如下命令可以查看版本信息[rootxenon1 ~]# xtrabackup --version xtrabackup: recognized server arguments: --datadir/usr/local/mysql/data --server-id11 --log_bin/usr/local/mysql/data/mysql-bin.log xtrabackup version 2.4.24 based on MySQL server 5.7.35 Linux (x86_64) (revision id: b4ee263)至此xtrabackup安装完成5.3. 安装xenon注意mysql集群三个节点都需要安装编译xenon。这里以xenon1为例首先安装环境依赖主要是安装golang环境操作如下dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm # 安装 git dnf install -y git # 安装 golang编译Xenon必须 dnf install -y golang然后从https://github.com/radondb/xenon/releases/ 选择需要的版本下载xenon源码包。接着就可以编译xenon了过程如下[rootxenon1 ~]# mv xenon /usr/local/ [rootxenon1 ~]# cd /usr/local/xenon [rootxenon1 ~]# make build [rootxenon1 ~]# cd conf/ [rootxenon1 ~]# cp xenon-simple.conf.json xenon.json ---------------修改编译版本上述是老版本--------- cd /usr/local/xenon cp makefile makefile.bak sed -i s/git rev-parse/echo/g makefile sed -i s/git log/echo/g makefile export GO111MODULEoff export GOPATH$(pwd) make build ls -lh bin/这里将xenon安装到了/usr/local目录下其中xenon.json就是xenon的配置文件。记得在xenon2、xenon3节点也执行相同的操作步骤。6、xenon配置过程详解6.1. 配置xenon将xenon在三个节点安装完成后接下来就需要配置xenon了三个集群节点都需要配置xenon这里以xenon1节点为例配置好的xenon.json文件内容如下[rootxenon1 ~]# more /etc/xenon/xenon.json { server: { endpoint:172.16.213.233:8801 }, raft: { meta-datadir:raft.meta, heartbeat-timeout:1000, election-timeout:3000, leader-start-command:sudo /usr/sbin/ip a a 172.16.213.237/24 dev enp0s3 arping -c 3 -A 172.16.213.237 -I enp0s3, leader-stop-command:sudo /usr/sbin/ip a d 172.16.213.237/24 dev enp0s3 }, mysql: #三个服务器默认一样即可 { admin:root, passwd:abc123456, host:127.0.0.1, port:3306, basedir:/usr/local/mysql, defaults-file:/usr/local/mysql/etc/my.cnf, ping-timeout:1000, master-sysvars:super_read_only0;read_only0;sync_binlogdefault;innodb_flush_log_at_trx_commitdefault;rpl_semi_sync_slave_enabled0;rpl_semi_sync_master_enabled1, slave-sysvars: super_read_only1;read_only1;sync_binlog1000;innodb_flush_log_at_trx_commit2;rpl_semi_sync_slave_enabled1;rpl_semi_sync_master_enabled0 }, replication: #主从复制直接写就行 { user:repl, passwd:123456 }, backup: { ssh-host:172.16.213.233, #本地ip地址 ssh-user:mysql, ssh-passwd:mysql123,#本机mysql用户 ssh-port:22, backupdir:/usr/local/mysql/data, #备份的默认路径 xtrabackup-bindir:/usr/bin, backup-iops-limits:100000, backup-use-memory: 2GB, backup-parallel: 2 }, rpc: { request-timeout:500 }, log: { level:INFO } }下面解释下这个配置文件中几个重要选项的含义。server段中endpoint是指定每个节点的ip和启动xenon服务对应的端口8801端口保持默认即可。IP就是三个节点的物理IP地址需要做修改。raft段中leader-start-command选项是配置集群选举后master节点绑定VIP地址的命令。根据前面的规划我们使用的vip地址为172.16.213.237注意IP的写法。leader-stop-command选项是删除VIP地址的命令。mysql段中admin是指定mysql用户一般是rootpasswd是root用户的密码这个密码在上面初始化mysql的时候做个设置host保持默认的127.0.0.1即可port默认是3306basedir指定mysql库的程序根目录我们这个环境是/usr/local/mysqldefaults-file是指定mysql库的配置文件路径我们这里是/usr/local/mysql/etc/my.cnf。master-sysvars是设置节点变为master角色时需要添加的mysql参数配置 而slave-sysvars是设置slave节点mysql的参数配置。replication段指定的是主从复制时对应的复制用户和密码这个复制用户无需创建只需要在这里指定即可xenon会自动创建此用户以及设置用户对应的密码。backup段是配置xenon使用xtrabackup进行备份的相关设置ssh-host是本机对应的IP地址不同节点ip不同记得修改ssh-user是本机的linux用户这里是mysqlssh-passwd是mysql这个Linux用户的密码ssh-port是ssh端口默认是22backupdir是指定通过xtrabackup进行备份时备份数据的存放路径xtrabackup在进行备份的时候会首先删除这个路径下的所有数据然后才开始备份。xtrabackup-bindir是指定xtrabackup这个命令所在的路径默认是/usr/bin。在xenon1节点配置完成后在xenon2、xenon3节点也需要做相同的配置记得修改配置文件中对应的ip地址。6.2. 对xenon进行授权先执行如下操作[rootxenon1 conf]# mkdir /etc/xenon/ [rootxenon1 conf]# cp /usr/local/xenon/conf/xenon.json /etc/xenon/ [rootxenon1 conf]# echo /etc/xenon/xenon.json /usr/local/xenon/bin/config.path [rootmaster conf]# mkdir /usr/local/xenon/logs注意在xenon命令路径中需要有一个名为config的文件否则生成集群节点时会报错。然后对/usr/local/xenon和/etc/xenon/目录进行授权允许mysql用户完全访问操作如下[rootxenon1 conf]# chown mysql.mysql -R /usr/local/xenon [rootxenon1 conf]# chown mysql.mysql -R /etc/xenon/至此xenon配置完毕。7、启动xenon集群与状态监控所有配置工作完成后就可以启动xenon集群了。首先在172.16.213.233节点通过mysql用户启动xenon服务执行如下命令[rootxenon1 ~]# su - mysql [mysqlxenon1 ]$ cd /usr/local/xenon/bin [mysqlxenon1 bin]$ ./xenon -c /etc/xenon/xenon.json /usr/local/xenon/logs/xenon.log 21 [mysqlxenon1 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801注意后面所有对集群的管理和维护操作都通过mysql用户来完成。这里用到了“xenoncli cluster add” 命令这是向xenon集群中添加节点的命令后面会多次用到。接着在172.16.213.233节点查看集群状态执行如下命令注意这里用到了xenoncli cluster mysql这个命令此命令用来查看xenon集群中mysql的状态信息。从上面输出可以看到172.16.213.233节点角色为FOLLOWER处于ALIVE状态并且为READONLY只读而IO/SQL_Running列为true/true表示此节点主从复制关系的IO进程和SQL进程都处于正常状态。而172.16.213.234节点所有状态均为UNKNOW这是因为172.16.213.234节点的xenon服务还未启动所以集群还无法识别这个节点的状态既然如此下面就在172.16.213.234节点启动xenon服务操作如下[rootxenon2 ~]# su - mysql [mysqlxenon2 ~]$ cd /usr/local/xenon/bin [mysqlxenon2 bin]$ ./xenon -c /etc/xenon/xenon.json /usr/local/xenon/logs/xenon.log 21 然后在172.16.213.234节点查看集群状态执行如下命令从上面输出可知172.16.213.234节点启动xenon服务后在集群中的状态变为ALIVE并且默认角色是FOLLOWER同时主从复制关系也自动建立起来了主从状态都正常。现在返回172.16.213.233节点再次查看集群状态输出如下从输出可知172.16.213.234节点从原来的UNKNOW角色变成了FOLLOWER角色同时172.16.213.233节点的角色也从之前的FOLLOWER变成了CANDIDATECANDIDATE表示候选状态也就是说xenon集群至少有两个或以上节点加入才能进行选举现在加入了一个无法完成选举所以接下来还需要在172.16.213.234节点将172.16.213.233节点加入集群才能实现master和slave的选举在172.16.213.234节点执行如下命令[mysqlxenon2 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801然后在172.16.213.234节点查看集群状态如下图所示从输出可知在172.16.213.234节点将xenon1和xenon2都加入集群后因为集群已经有了2个节点因此可以实现正常的选举选举的结果是172.16.213.233节点成为LEADER也就是主从复制中的master节点而172.16.213.234节点成为FOLLOWER角色也就是slave节点这样xenon集群选举就完成了。由于我们是三个节点所以还需要将最后一个节点172.16.213.235也加入集群中在xenon3执行如下命令[rootxenon3 ~]# su - mysql [mysqlxenon3 ~]$ cd /usr/local/xenon/bin [mysqlxenon3 bin]$ ./xenon -c /etc/xenon/xenon.json /usr/local/xenon/logs/xenon.log 21 [mysqlxenon3 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801,172.16.213.235:8801由于有新节点加入集群所以还需要在xenon1、xenon2节点将新的节点依次加入集群首先在172.16.213.233节点执行如下命令[mysqlxenon1 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801,172.16.213.235:8801然后在172.16.213.234节点也执行相同的命令[mysqlxenon2 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801,172.16.213.235:8801最后再返回任意一个集群节点执行如下命令查看集群状态输出结果如下从输出可知新增的节点172.16.213.235加入集群成功角色为FOLLOWER处于READONLY只读状态而处于LEADER 角色的节点状态为READWRITE可读可写这刚好就是mysql主从复制的基本运行逻辑。要查看集群状态的详细信息也可以执行如下命令“xenoncli cluster status”命令主要用来查看集群整体状态例如每个节点的角色mysql状态以及目前集群中哪个是LEADER都有清晰的输出要进行集群故障排查此命令会经常用到。至此xenon集群搭建成功。8、xenon集群日常维护8.1. 监控集群状态要查看集群状态经常执行的命令有如下几个[rootxenon1 ~]# su - mysql [mysqlxenon1 ~]$ cd /usr/local/xenon/bin [mysqlxenon1 bin]$ ./xenoncli cluster status #查看集群状态 [mysqlxenon1 bin]$ ./xenoncli cluster mysql #查看集群mysql的状态 [mysqlxenon1 bin]$ ./xenoncli cluster xenon #查看跟xenon相关的角色信息和配置其中“xenoncli cluster status”用来查看集群整体的状态下图是集群某时刻的一个状态截图从上图可以看出此集群中每个节点的角色、mysql运行状态、Monitor引擎是否运行、主从复制状态以及目前集群leader节点是哪个通过此命令集群所有状态一目了然。“xenoncli cluster mysql”命令主要是查看跟mysql有关的运行状态比如每个节点mysql角色、mysql存活状态、每个节点mysql读写权限、mysql的binlog日志回放位置、主从复制状态等信息。而“xenoncli cluster xenon”命令主要查看跟xenon相关的角色信息以及配置信息如下图所示检查集群一致状态可执行如下命令[mysqlxenon1 bin]$ ./xenoncli cluster raft注意上面命令是在/usr/local/xenon/bin目录下执行的如无特殊说明执行xenoncli命令都是在/usr/local/xenon/bin目录下完成的下面的操作都省去了 “cd /usr/local/xenon/bin”这个步骤。检查集群 GTID 状态可执行如下命令[mysqlxenon1 bin]$ ./xenoncli cluster gtid这个命令主要是查看集群的主从事务同步状态下面是一个输出截图这里重点关注Executed_GTID_Set列和Retrieved_GTID_Set列其中Retrieved_GTID_Set表示从库已经接收到主库的事务编号。 Executed_GTID_Set 表示从库自身已经执行的事务编号。uuid为6a2a5597-46a8-11ec-b8a2-08002735d58b的是172.16.213.233上面的mysql实例并且三个节点都有此UUID这说明此节点曾经是master节点主库6a2a5597-46a8-11ec-b8a2-08002735d58b:1-23960表示172.16.213.233这个mysql一共产生了23960个事务并且两个slave节点接收到了主库的23960个事务且都已全部执行。此外还有一个6a2a5597-46a8-11ec-b8a2-08002735d58d:1-8862的GTID这个GTID在三个节点都有事务查看发现GTID中的UUID刚好是172.16.213.235节点因此目前172.16.213.235节点是master节点主库并且其它两个slave节点接收到了主库的8862个事务且都已全部执行。Retrieved_GTID_Set列中第一行6a2a5597-46a8-11ec-b8a2-08002735d58d:523-8862表示172.16.213.233节点从172.16.213.235节点第523个事务开始接收目前接收到了第8862个事务从这里也可以看出172.16.213.233应该是发生过故障并且执行过恢复所以接收主库的事务不是从1开始的。Retrieved_GTID_Set列中第二行6a2a5597-46a8-11ec-b8a2-08002735d58d:1-8862表示172.16.213.234节点从172.16.213.235节点第1个事务开始接收目前接收到了第8862个事务。8.2. 添加/删除节点要添加一个节点到集群可执行如下命令[mysqlxenon1 bin]$ ./xenoncli cluster add 172.16.213.233:8801,172.16.213.234:8801,172.16.213.235:8801,172.16.213.232:8801其中172.16.213.232是新增节点由于所有集群节点都要能够识别新增的节点所以添加新节点的命令要在xenon集群每个节点都执行一遍。要在xenon集群中删除一个节点可以执行如下命令[mysqlxenon1 bin]$ ./xenoncli cluster remove 172.16.213.232:8801要删除某个节点只需要在集群任意节点执行上面命令即可但被删除的节点上无法删除自己节点的信息也就是说172.16.213.232这个节点被删除后在172.16.213.232这个节点执行“xenoncli cluster mysql”这个命令时还是能看到此节点的信息。不过不要紧此节点既然是删除的节点直接关闭集群服务停止mysql服务即可不会对集群产生影响。8.3. Rebuild 重建节点当某个节点发生故障时可以通过 rebuildme重建此节点例如某节点硬件故障硬件恢复后如果之前数据无法恢复此时可以利用之前的备份然后让此节点加入集群最后就可以使用rebuildme命令来将此节点恢复到最新数据状态。在要做重建的节点执行[mysqlxenon1 bin]$ ./xenoncli mysql rebuildmeXenon 重建的过程可分为如下几个阶段禁用 raft将 Xenon 状态设为 LEARNER如 mysql 进程存在则 stop mysql清空 MySQL 数据目录执行 xtrabackup --backup 以 xbstream 方式获取对端数据执行 xtrabackup --prepare应用 redo log启动 mysql执行 stop slave; reset slave all执行 reset master以 xtrabackup_binlog_info 文件中的 GTID 为准设置 gtid_purged启用 raft将 Xenon 状态设为 FOLLOWER 或 IDLE等待 Xenon 自动 change master to 到主节点执行 start slave。在进行节点重建的时候默认情况下xenon会从集群节点中选取一个最新的slave节点进行数据复制和拷贝但我们也可以指定从哪个节点进行数据的复制和拷贝指定节点复制重建当前 MySQL 节点可通过如下方式[mysqlxenon1 bin]$ ./xenoncli mysql rebuildme --from172.16.213.233:8801注意在执行节点重建时此节点的mysql服务、xenon服务需要处于启动状态也就是说重建的节点一定是集群的成员否则无法执行重建因此故障节点在恢复重建之前最好能通过之前的mysql备份将mysql服务启动起来。然后执行重建。8.4. 备份 MySQL到本地xenon集成了备份功能可以通过指定路径将集群数据备份到某节点某路径下操作命令如下所示[mysqlxenon1 bin]$ ./xenoncli mysql backup --to/home/mysql/data8.5. 关闭集群在xenon集群每个节点依次执行如下命令即可关闭集群这里以xenon1节点为例命令如下[mysqlxenon1 bin]$ ./xenoncli mysql stopmonitor [mysqlxenon1 bin]$ ./xenoncli mysql shutdown [mysqlxenon1 bin]$ pkill xenon其中前面两个命令是关闭xenon的监控引擎、停止mysql服务最后一个命令是关闭xenon进程。9、xenon集群故障切换实践9.1. 手动 Failover/switchoverxenon集群支持故障检测、故障自动切换也支持手动触发主从切换。如果想让哪个节点成为master节点就在哪个节点执行如下命令即可[mysqlxenon2 bin]$ ./xenoncli raft trytoleader上面命令执行完成后查看集群状态可以发现xenon2节点目前变为集群的LEADER角色。9.2. slave节点故障切换过程xenon集群中slave节点发生故障分为几种情况slave节点如果网络故障导致主从同步中断这个问题无需处理只需等待网络恢复后slave节点会自动去同步master节点的binlog数据实现主从同步。如果slave节点上mysql库异常关闭那么xenon进程会尝试重新启动如果能够启动mysql那么自动恢复正常如果xenon进程无法实现重启的那么可能是mysql本身有故障需要检查mysql实例修复问题只要mysql能够正常启动此节点就可以正常加入集群中。如果slave节点所在的主机磁盘故障导致mysql数据丢失或者由于redo log损坏导 致数据库无法启动的此种情况就需要重建此节点这种情况也是最难处理的一种。下面针对上面描述的第三种情况进行恢复演练。第一步获取此前的数据备份通过之前的备份数据恢复这个节点上mysql实例的正常运行。记住一定要通过之前对集群的备份数据进行恢复重新初始化数据库是无法进行恢复的。这里假定172.16.213.234节点发生故障此节点目前是FOLLOWER角色也就是slave节点首先关闭此节点的xenon服务和mysql服务实际环境中mysql可能无法启动了然后将之前的备份恢复到此节点的data目录下操作过程如下#关闭此节点的xenon服务和mysql服务 [mysqlxenon2 bin]$ ps -ef|grep xenon.json|grep -v grep|awk {print $2}|xargs kill -9 [mysqlxenon2 bin]$ /etc/init.d/mysqld stop #把之前mysql的data目录备份或者删除确认可删除情况下 [mysqlxenon2 bin]$ cd /usr/local/mysql/ [mysqlxenon2 mysql]$ mv data data.old #将备份数据拷贝到mysql的data目录下其中备份数据路径是/home/mysql/data [mysqlxenon2 mysql]$ cp -r /home/mysql/data . #数据库恢复完成后最后一步启动xenon服务mysql服务会自动启动 [mysqlxenon2 data]$ cd /usr/local/xenon/bin [mysqlxenon2 bin]$ ./xenon -c /etc/xenon/xenon.json /usr/local/xenon/logs/xenon.log 21 上面步骤恢复完成后可能会自动实现master节点数据同步到此节点那么恢复完成。但也可能出现xenon2节点主从复制失败的情况主要是sql进程异常失败原因是多方面的跟使用的备份有很大关系但解决这个问题的方法是一样的此时需要执行第二个步骤。第二步如果出现了主从同步失败那么最快的方法就是在这个节点执行重建也就是在此节点执行”xenoncli mysql rebuildme“命令但前提是此节点xenon服务和mysql服务已经正常启动。执行重建命令如下[mysqlxenon2 data]$ cd /usr/local/xenon/bin [mysqlxenon2 bin]$ ./xenoncli mysql rebuildme执行”xenoncli mysql rebuildme“命令进行重建后若重建成功此节点数据和master节点完全一致。slave节点恢复成功。9.3. master节点故障切换过程从这个提示中可以看出是主从复制的SQL线程报出来的异常在执行事务6a2a5597-46a8-11ec-b8a2-08002735d58d:1时发现无法复制的错误更详细信息可查看performance_schema.replication_applier_status_by_worker表执行select * from performance_schema.replication_applier_status_by_worker\G;语句那下面就看看此表如下图所示从输出可在错误在于“Table gao.k1 doesnt exist”也就是说xenon1从现在的新master的binlog拉取日志要回放gao.k1表的数据但是发现xenon1库中根本没有这个表所以发生了报错。这种主从复制的问题发生的几率是很高的不同的备份可能会出现不同的问题。出现的问题虽多但解决方法只有一个要解决这个问题最简单、直接的方法就是在此节点执行重建过程如下[mysqlxenon1 bin]$ ./xenoncli mysql rebuildme 2021/11/30 10:27:27.374562 [WARNING] prepare.to.rebuildme IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints completed OK!. 2021/11/30 10:27:27.375371 [WARNING] S1--check.raft.leader 2021/11/30 10:27:27.392982 [WARNING] rebuildme.found.best.slave[172.16.213.234:8801].leader[172.16.213.235:8801] 2021/11/30 10:27:27.393014 [WARNING] S2--prepare.rebuild.from[172.16.213.234:8801].... 2021/11/30 10:27:27.403049 [WARNING] S3--check.bestone[172.16.213.234:8801].is.OK.... 2021/11/30 10:27:27.403075 [WARNING] S4--set.learner 2021/11/30 10:27:27.404604 [WARNING] S5--stop.monitor 2021/11/30 10:27:27.405926 [WARNING] S6--kill.mysql 2021/11/30 10:27:27.488928 [WARNING] S7--check.bestone[172.16.213.234:8801].is.OK.... 2021/11/30 10:27:27.504558 [WARNING] S8--clear.datadir[/usr/local/mysql/data] 2021/11/30 10:27:27.541446 [WARNING] S9--xtrabackup.begin.... 2021/11/30 10:27:27.542133 [WARNING] rebuildme.backup.req[{From: BackupDir:/usr/local/mysql/data SSHHost:172.16.213.233 SSHUser:mysql SSHPasswd:mysql123 SSHPort:22 IOPSLimits:100000 XtrabackupBinDir:/usr/bin}].from[172.16.213.234:8801] 2021/11/30 10:27:44.235087 [WARNING] S9--xtrabackup.end.... 2021/11/30 10:27:44.235131 [WARNING] S10--apply-log.begin.... 2021/11/30 10:27:50.200013 [WARNING] S10--apply-log.end.... 2021/11/30 10:27:50.200058 [WARNING] S11--start.mysql.begin... 2021/11/30 10:27:50.201383 [WARNING] S11--start.mysql.end... 2021/11/30 10:27:50.201402 [WARNING] S12--wait.mysqld.running.begin.... 2021/11/30 10:27:53.250253 [WARNING] wait.mysqld.running... 2021/11/30 10:27:53.331268 [WARNING] S12--wait.mysqld.running.end.... 2021/11/30 10:27:53.331286 [WARNING] S13--wait.mysql.working.begin.... 2021/11/30 10:27:56.332544 [WARNING] wait.mysql.working... 2021/11/30 10:27:56.333433 [WARNING] S13--wait.mysql.working.end.... 2021/11/30 10:27:56.333458 [WARNING] S14--stop.and.reset.slave.begin.... 2021/11/30 10:27:56.615532 [WARNING] S14--stop.and.reset.slave.end.... 2021/11/30 10:27:56.615562 [WARNING] S15--reset.master.begin.... 2021/11/30 10:27:56.856596 [WARNING] S15--reset.master.end.... 2021/11/30 10:27:56.856704 [WARNING] S15--set.gtid_purged[6a2a5597-46a8-11ec-b8a2-08002735d58b:1-23960, 6a2a5597-46a8-11ec-b8a2-08002735d58d:1-522 ].begin.... 2021/11/30 10:27:56.898296 [WARNING] S15--set.gtid_purged.end.... 2021/11/30 10:27:56.898326 [WARNING] S16--enable.raft.begin... 2021/11/30 10:27:56.900621 [WARNING] S16--enable.raft.done... 2021/11/30 10:27:56.900646 [WARNING] S17--wait[3000 ms].change.to.master... 2021/11/30 10:27:56.900690 [WARNING] S18--start.slave.begin.... 2021/11/30 10:27:57.274490 [WARNING] S18--start.slave.end.... 2021/11/30 10:27:57.274519 [WARNING] completed OK! 2021/11/30 10:27:57.274529 [WARNING] rebuildme.all.done....从这个输出可知在执行重建过程中xenon自动从集群最新节点172.16.213.234:8801进行数据读取和备份然后将数据复制到xenon1节点上最后重建成功。这个恢复过程其实是利用了之前的数据备份由此可知在xenon集群中一定要定期做数据备份这样在某节点出现问题的时候可以通过备份来进行恢复。

相关文章:

MySQL集群高可用工具Xenon

目录 1、xenon基础介绍 1.1. xenon是什么 1.2. xenon的架构 1.3. Xenon的工作原理 2、全局事务标识符(GTID) 2.1. 什么是GTID 2.2. GTID的工作原理 3、Mysql主从复制的三种类型 3.1. 异步复制 3.2. 全同步复制 3.3. 半同步复制 4、xenon部署环境介绍 4.1. 系统环境…...

查各种数据库版本的sql写法

1. MySQLSELECT VERSION();SHOW VARIABLES LIKE version;2. OracleSELECT * FROM v$version;3. SQL ServerSELECT VERSION;SELECT SERVERPROPERTY(ProductVersion)4. PostgreSQLSELECT VERSION();5. 达梦SELECT VERSION();6. 人大金仓SELECT VERSION();7.SQLiteSELECT sqlite_v…...

CUDA_VISIBLE_DEVICES设置无效?3种方法彻底解决PyTorch多GPU分配问题

CUDA_VISIBLE_DEVICES设置无效?深度解析PyTorch多GPU分配机制与实战解决方案 当你在深夜调试模型时,突然看到屏幕上跳出"CUDA unknown error"的红色警告,而nvidia-smi显示GPU资源明明充足——这种挫败感每个深度学习工程师都深有体…...

从PoseCNN到Yolo-6D:2018年那几篇6D位姿估计论文,现在回头看还香吗?

从PoseCNN到Yolo-6D:2018年经典6D位姿估计算法的技术遗产与当代启示 在计算机视觉的发展历程中,2018年堪称6D位姿估计领域的"黄金年份"。这一年,PoseCNN、DOPE和Yolo-6D三篇里程碑式论文相继问世,为物体6D位姿&#xff…...

扩散模型如何给脑电信号做“数据增强”?一份基于CWT-DDPM的EEG生成实战心得

扩散模型在脑电信号数据增强中的创新实践:CWT-DDPM方法深度解析 前沿技术背景与需求分析 在脑机接口和神经科学研究领域,高质量脑电(EEG)数据的获取一直是制约算法性能提升的关键瓶颈。传统EEG数据采集面临被试者个体差异大、实验…...

Python条形码识别终极指南:5分钟掌握pyzbar库

Python条形码识别终极指南:5分钟掌握pyzbar库 【免费下载链接】pyzbar Read one-dimensional barcodes and QR codes from Python 2 and 3. 项目地址: https://gitcode.com/gh_mirrors/py/pyzbar 想要用Python快速识别条形码和二维码吗?pyzbar库就…...

八大网盘直链下载助手:免费开源工具实现下载速度10倍提升

八大网盘直链下载助手:免费开源工具实现下载速度10倍提升 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

AI编程软件试用心得

试用国内一款t*a*软件,遇到的问题:一,有点呆。语义稍复杂,它就转不过弯;二,问题喜欢给简单粗暴的答案;三,要排队,这是我的问题。...

C++ std::move实现原理与vector扩容移动语义

C std::move 实现原理与 vector 扩容中的移动语义 std::move 是 C11 以后最常被误解的语义之一。它本身并不移动数据,而是把表达式转换为可绑定到右值引用的形式,从而触发移动构造/移动赋值。本文围绕三个核心问题展开: std::move 到底做了…...

从‘打架’到‘同步’:深入浅出图解DQ锁相环的四种工作模式(Cos/Sin信号全解析)

从‘打架’到‘同步’:深入浅出图解DQ锁相环的四种工作模式(Cos/Sin信号全解析) 在电力电子和电机控制领域,DQ锁相环(PLL)是实现精确同步的核心技术。想象一下,当你需要将逆变器输出的正弦电流完…...

如何用慕课助手轻松完成在线课程:新手终极完整指南

如何用慕课助手轻松完成在线课程:新手终极完整指南 【免费下载链接】mooc-assistant 慕课助手 浏览器插件(Chrome/Firefox/Opera) 项目地址: https://gitcode.com/gh_mirrors/mo/mooc-assistant 你是否曾在在线课程中感到力不从心?面对繁重的作业…...

Pads Layout新手必看:库管理与文件操作全流程详解(附Logic同步技巧)

Pads Layout新手必看:库管理与文件操作全流程详解(附Logic同步技巧) 刚接触Pads Layout的工程师常会遇到这样的困惑:为什么原理图更新后PCB布局没有同步?旧版本设计文件打开后元件位置全乱了?其实这些问题9…...

EZCTF小结-WP

EZCMD_4 首页是一个图片(其实与解题无关),发现网页标题为robot,访问/robots.txt,然后访问/4atP5Aup.php,发现php源码。读取源码发现这道题的过滤条件很严格,escapeshellcmd()和preg_match&#…...

彻底卸载WPS Office的5种高效方法及疑难解答

1. 为什么WPS Office卸载不干净? 很多朋友都遇到过这样的困扰:明明已经通过控制面板卸载了WPS Office,但电脑里还是残留着不少文件和注册表项。更糟的是,当你尝试重新安装时,系统提示"已安装";或…...

ViewPager性能优化实战:从卡顿到丝滑,你的图片轮播和Fragment页面切换可以更快(含内存泄漏排查)

ViewPager性能优化实战:从卡顿到丝滑的进阶指南 每次滑动ViewPager时出现的卡顿和白屏,就像在高速公路上突然踩刹车——用户体验瞬间跌入谷底。当你的应用需要展示高清图片轮播或复杂Fragment时,ViewPager的性能问题会暴露无遗。本文将带你深…...

Visual C++运行库缺失:如何一次性彻底修复你的Windows系统?

Visual C运行库缺失:如何一次性彻底修复你的Windows系统? 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的场景&am…...

FaceFusion使用技巧:如何设置参数获得最佳换脸效果?

FaceFusion使用技巧:如何设置参数获得最佳换脸效果? 1. FaceFusion简介与核心功能 FaceFusion作为新一代AI换脸工具,凭借其易用性和强大功能在内容创作领域广受欢迎。与早期换脸工具相比,FaceFusion最大的优势在于: …...

SeetaFace6 GPU版本编译与QT示例程序运行实战(Linux环境)

SeetaFace6 GPU版本编译与QT示例程序运行实战(Linux环境) 人脸识别技术正从实验室走向工业界,而GPU加速成为突破性能瓶颈的关键。SeetaFace6作为国内领先的开源人脸识别框架,其GPU计算能力的释放让开发者能够处理更高并发的识别任…...

跨平台文本复制实战:从网页到微信小程序的实现技巧

1. 网页与小程序文本复制的本质差异 第一次做跨平台开发时,我发现网页上运行良好的复制功能在小程序里直接失效,这才意识到两者底层逻辑完全不同。网页的文本选择是浏览器原生行为,就像在Word文档里拖选文字那样自然;而小程序运行…...

3步解决OneNote数据孤岛:OneNote Md Exporter迁移最佳实践

3步解决OneNote数据孤岛:OneNote Md Exporter迁移最佳实践 【免费下载链接】onenote-md-exporter ConsoleApp to export OneNote notebooks to Markdown formats 项目地址: https://gitcode.com/gh_mirrors/on/onenote-md-exporter 你是否曾因OneNote的封闭格…...

告别卡顿!用火绒自定义规则打造轻量级安全防线(附隐私保护规则模板)

轻量化安全防护实战:用火绒自定义规则释放系统性能 每次开机后电脑风扇狂转,任务管理器里某个安全软件进程长期占用20%以上的CPU资源——这可能是许多办公族和轻度游戏玩家的日常困扰。传统安全软件在提供防护的同时,往往成为系统卡顿的元凶。…...

别再乱配DNS了!/etc/resolv.conf里search参数的正确用法,看完这篇就全懂了

DNS配置进阶:揭秘/etc/resolv.conf中search参数的实战技巧 你是否遇到过这样的场景:在Kubernetes集群中,Pod之间用短主机名互相调用时而正常时而失败?或者Docker容器内访问数据库服务,明明配置了主机名却突然无法解析&…...

技术管理者转型:从IC到TL的关键跨越

在技术驱动的浪潮下,软件测试领域正经历着前所未有的深刻变革。自动化工具、人工智能测试平台、持续集成/持续部署(CI/CD)的普及,正在重塑测试工作的内涵与外延。对于众多资深的测试工程师而言,沿着技术专家&#xff0…...

超越Lab Guide:用ICC做物理实现的深层原理剖析,从命令到芯片的思考

超越Lab Guide:用ICC做物理实现的深层原理剖析,从命令到芯片的思考 在数字芯片设计的物理实现阶段,IC Compiler(ICC)作为Synopsys工具链的核心成员,承担着从网表到GDSII的关键转换任务。大多数工程师通过La…...

别再只盯着CPU利用率了!用ARM PMU深入挖掘你的A53/A72芯片真实性能

别再只盯着CPU利用率了!用ARM PMU深入挖掘你的A53/A72芯片真实性能 当你的嵌入式设备响应迟缓,而top命令却显示CPU利用率仅有30%时,问题究竟出在哪里?传统性能分析工具就像汽车仪表盘,只能告诉你发动机转速&#xff08…...

SolidWorks 2020新手避坑指南:从模板无效到材质不显示的5个常见问题解决

SolidWorks 2020新手生存手册:5个高频问题深度解决方案 刚接触SolidWorks 2020的新手工程师们,是否在打开软件的第一周就被各种报错提示弄得手足无措?从模板无效到材质显示异常,这些看似简单的"小问题"往往成为学习路上…...

别再混淆了!用5个实例彻底搞懂Stateflow里的状态动作和转移动作

Stateflow状态机设计:5个实战案例解析状态动作与转移动作的本质区别 在状态机建模领域,Stateflow作为MATLAB/Simulink生态系统中的核心工具,其精确的动作执行机制常常成为初学者进阶路上的绊脚石。许多工程师在首次接触状态动作(状…...

别再死记硬背公式了!用Python手把手带你实现UserCF和ItemCF(附MovieLens数据集实战)

从零实现UserCF与ItemCF:用Python构建电影推荐系统 推荐系统早已渗透进我们数字生活的每个角落——从电商平台的"猜你喜欢"到视频网站的"推荐观看",背后都离不开协同过滤算法的支撑。今天我将带大家用Python亲手实现两种最经典的协…...

告别Print:在JupyterLab中利用官方Debugger高效定位代码问题

1. 为什么我们需要告别Print调试? 还在用print大法调试代码?每次遇到问题就疯狂插入print语句,运行完再一个个删除?这种原始方法不仅效率低下,还容易遗漏关键信息。作为过来人,我深刻理解这种痛苦 - 特别是…...

信号处理实战:如何用Python实现傅里叶变换与冲激抽样(附完整代码)

信号处理实战:如何用Python实现傅里叶变换与冲激抽样(附完整代码) 在数字信号处理领域,傅里叶变换和冲激抽样是两个基础但极其重要的概念。它们不仅是理论研究的核心,更是工程实践中不可或缺的工具。本文将带你从零开始…...