MySQL高可用之Xenon介绍
MySQL 高可用的选择
在 MySQL(5.5 及以下)传统复制的时代,MHA(Master High Availability)在 MySQL 高可用应用中非常成熟。在 MySQL(5.6)及 GTID 时代开启以后,MHA 却没有与新的 MySQL 一起顺应时潮。
MHA 由日本 DeNA 公司 youshimaton 开发,他认为在 GTID 环境下 MHA 存在的价值不大,MHA 最近一次发版是 2018 年。现如今使用 MySQL 已离不开 GTID ,无论是从功能、性能角度,还是从维护角度,GTID 能具备更优异的表现,针对数据业务要求不高场景,常使用 GTID+ROW+Semi-Sync 方案。
MHA 活跃度
基于 MHA 和 GTID 发展现状,为适应 MySQL 版本更新的高可用业务场景,下面介绍一款可替代 MHA 的高可用方案:MySQL + Xenon
什么是 Xenon?
Xenon [ˈziːnɒn] (https://github.com/radondb/xenon) 是一款由 RadonDB 开发团队研发并开源的新一代 MySQL 集群高可用工具。基于 Raft 协议进行无中心化选主,实现主从秒级切换;基于 Semi-Sync 机制,保障数据不丢失,实现数据强一致性。并结合 MySQL(5.7 及以上版本)并行复制特性,实现 Binlog 并行回放,大大降低从库延迟。
Xenon 架构
自动选主
基于 Raft(依赖于 GTID)自动选主,数据一致性依赖于增强半同步 Semi-Sync。
故障自动切换
借助于配置项
leader-start-command
和leader-stop-command
调用脚本完成故障切换,也可以结合 Consul,ZooKeeper 自由扩展。Xtrabackup 备份调度集成
Xenon 工作原理
结合架构图,可看出 Xenon 就是基于 Raft + Semi-Sync + GTID 实现的高可用,保证大多数节点接收到数据。
而 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 的选举。
- 自动完成主从切换。
Xenon 企业级核心特性
一主多从架构,确保金融级强一致性
高可用架构大多采用一主两从的初始节点架构设计,并通过 MySQL 5.7 版本中的 Semi-Sync 特性实现数据的多副本同步复制,多个从节点的设置将极大的屏蔽掉单点故障带来的影响,确保至少一个从节点与主节点始终保持数据的完全一致,提供金融级数据强一致性。
主副本秒级切换,确保业务高可用
节点之间使用 Raft 协议进行管理,当主节点出现故障不可用时,集群会秒级响应并选出新的主节点(与主节点数据完全同步的从节点),并立即接管读写请求,确保业务的连续高可用。这一过程,无需设置后端集群中各节点的角色,一切由系统自动切换。集群中最多可以添加 6 个从节点,主节点可读可写,从节点设置为只读。同时,集群提供两个 VIP,分别是高可用读 IP 和高可用写 IP。读 IP 可将请求在所有节点之间进行负载分担,提供读取性能的同时,也消除了单点故障的影响,提供业务可靠性。写 IP 则始终指向主节点(Leader)。
系统自动运维,优化系统空间使用效率
通过对 binlog 日志的保留周期 expire_logs_days 的配置(1~4 天),主节点会定期清理不再使用的 binlog 日志,其他从节点已复制完毕,提高系统的空间利用率。
Xenon 的优势
相比 MHA,Xenon 的优势如下:
多版本内核支持
支持 MySQL 5.6、5.7、8.0 内核版本。
多平台支持
支持物理机、虚拟机/云平台、容器/ Kubernetes 平台部署。
稳定性更好
MySQL 新版本特性兼容。
性能更佳
与 GTID、MTS(并行复制) 结合,并行日志复制、并行日志回放。
架构更简单
不需要管理节点,机器成本更低。
数据更安全
增强半同步复制不会降级为异步,保证数据零丢失,不会存在 MHA 在 GTID 模式下丢数据的风险。
故障修复全自动
Xenon 对于故障节点会自动先自我修复。
节点恢复快
配合 Xtrabackup 等可以实现快速恢复。
操作更简单,维护成本更低
持续更新
Xenon 由 RadonDB 数据库开发团队持续维护更新。
Xenon 实现 MySQL 高可用架构 部署篇
基于 Xenon 架构原理,部署 一主两从 架构的 MySQL 高可用集群的实操文档。
Xenon 架构图
环境信息:
- Redhat 7
- MySQL 5.7
- Xenon 1.0.7
- XtraBackup 24
*另:Xenon 支持 MySQL 5.6/5.7/8.0 内核,本文以 5.7 为例。
搭建 MySQL 增强半同步复制架构
准备单机 MySQL
准备三台单机 MySQL,安装步骤(略)。
- db1 (10.10.10.10)
- db2 (10.10.10.11)
- db3 (10.10.10.18)
1.2 配置主从复制
配置三台单机 MySQL 主从 复制关系,配置步骤(略)。
1.3 配置增强半同步复
在 db1 服务器上,开启 semi_sync
插件。
1 2 3 4 5 | set global super_read_only=0; ---默认 set global read_only=0; ---默认 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; show plugins; |
在 db2 和 db3 服务器上执行并查看结果。
1 2 3 4 5 6 7 8 | stop slave io_thread; start slave io_thread; 2020-01-05T12:16:01.269943Z 20 [Note] Aborted connection 20 to db: 'unconnected' user: 'root' host: 'localhost' (Got timeout reading communication packets) 2020-01-05T12:25:57.193720Z 13 [Note] Slave I/O thread killed while reading event for channel '' 2020-01-05T12:25:57.193804Z 13 [Note] Slave I/O thread exiting for channel '', read up to log 'mysql-bin.000002', position 2310 2020-01-05T12:25:57.227685Z 22 [Note] Slave I/O thread: Start semi-sync replication to master 'repl@10.10.10.10:3306' in log 'mysql-bin.000002' at position 2310 2020-01-05T12:25:57.227782Z 22 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 2020-01-05T12:25:57.230523Z 22 [Note] Slave I/O thread for channel '': connected to master 'repl@10.10.10.10:3306',replication started in log 'mysql-bin.000002' at position 2310 |
至此,一主两从 增强半同步复制就配置好了,接下来即可使用 Xenon 搭建高可用架构。
使用 Xenon 搭建高可用架构
2.1 环境准备
2.1.1 配置帐号
修改 MySQL 的路径和帐号密码,由 /sbin/nologin
修改为 /bin/bash
, 并修改 MySQL 帐号的密码。
说明:MySQL 默认路径为 /bin/bash
。
1 2 3 4 | chsh mysql Changing shell for mysql. New shell [/sbin/nologin]: /bin/bash passwd mysql |
为 Xenon 的帐号添加 sudo /usr/ip
权限。
1 2 3 4 5 6 7 8 9 10 | visudo mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip ## 添加权限前 [mysql@db1 ~]$ sudo /sbin/ip a a 10.10.10.30/16 dev enp0s3 && arping -c 3 -A 172.18.0.100 -I enp0s3 bind: Cannot assign requested address ## 添加权限后 [mysql@db1 ~]$ ping 10.10.10.30 PING 10.10.10.30 (10.10.10.30) 56(84) bytes of data. 64 bytes from 10.10.10.30: icmp_seq=1 ttl=64 time=0.021 ms [1]+ Stopped ping 10.10.10.30 |
2.1.2 建立互信关系
建立三台服务器之间互信关系。
1 2 3 | ssh-copy-id -i /home/mysql/.ssh/id_rsa.pub 10.10.10.18 ssh-copy-id -i /home/mysql/.ssh/id_rsa.pub 10.10.10.10 ssh-copy-id -i /home/mysql/.ssh/id_rsa.pub 10.10.10.11 |
2.1.3 安装 XtraBackup
1 2 3 4 5 6 7 8 9 | yum install -y perl-DBD-MySQL rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm rpm -ivh percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm root@db2 tmp]## rpm -ivh percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm warning: percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY Preparing... ################################## [100%] Updating / installing... 1:percona-xtrabackup-24-2.4.15-1.el################################## [100%] |
2.1.4 安装 Go
1 2 3 4 5 6 7 8 9 | wget https://golang.org/doc/install?download=go1.13.4.linux-amd64.tar.gz tar -C /usr/local -xzf go1.13.4.linux-amd64.tar.gz echo "export PATH=\$PATH:/usr/local/go/bin" >> /etc/profile [root@db1 tmp]## source /etc/profile [root@db1 tmp]## which go /usr/local/go/bin/go [root@db1 tmp]## go version go version go1.13.4 linux/amd64 |
2.2 安装 Xenon
在 https://github.com/radondb/xenon/releases 下载 1.0.7 版本的安装包至服务器。
1 2 3 4 5 6 7 8 9 10 11 | [root@db1 local]## tar -xvf xenon-1.0.7.tar.gz [root@db1 local]## mv xenon-1.0.7 xenon [root@db1 local]## cd /usr/local/xenon [root@db1 xenon]## make build fatal: Not a git repository (or any of the parent directories): .git fatal: Not a git repository (or any of the parent directories): .git fatal: Not a git repository (or any of the parent directories): .git fatal: Not a git repository (or any of the parent directories): .git --> Building... ## 省略…… [root@db1 xenon]## make |
2.3 配置 Xenon
2.3.1 添加配置文件
添加 db1 的配置文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | [mysql@db1 conf]$ cat xenon.json { "server": { "endpoint":"10.10.10.10:8801" }, "raft": { "meta-datadir":"raft.meta", "heartbeat-timeout":1000, "election-timeout":3000, "admit-defeat-hearbeat-count": 5, "purge-binlog-disabled": true, "leader-start-command":"sudo /sbin/ip a a 10.10.10.20/24 dev enp0s3 && arping -c 3 -A 10.10.10.20 -I enp0s3", "leader-stop-command":"sudo /sbin/ip a d 10.10.10.20/24 dev enp0s3" }, "mysql": { "admin":"root", "passwd":"123456", "host":"127.0.0.1", "port":3306, "basedir":"/usr/local/mysql", "defaults-file":"/etc/my.cnf" }, "replication": { "user":"repl", "passwd":"123456" }, "backup": { "ssh-host":"10.10.10.10", "ssh-user":"mysql", "ssh-passwd":"123456", "basedir":"/usr/local/mysql", "backup-dir":"/backup", "mysqld-monitor-interval": 5000, "backup-use-memory": "3072M", "ssh-port": 22, "backup-parallel": 2, "backup-iops-limits": 100000, "xtrabackup-bindir":"/usr/bin" }, "rpc": { "request-timeout":500 }, "log": { "level":"INFO" } } |
添加 db2 和 db3 的配置文件。以 db2 配置文件为示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | [mysql@db2 ~]$ cd /usr/local/xenon/conf [mysql@db2 conf]$ cat xenon.json { "server": { "endpoint":"10.10.10.11:8801" #添加 db3 配置文件时,需设置为 10.10.10.18 }, "raft": { "meta-datadir":"raft.meta", "heartbeat-timeout":1000, "election-timeout":3000, "admit-defeat-hearbeat-count": 5, "purge-binlog-disabled": true, "leader-start-command":"sudo /sbin/ip a a 10.10.10.20/24 dev enp0s3 && arping -c 3 -A 10.10.10.20 -I enp0s3", "leader-stop-command":"sudo /sbin/ip a d 10.10.10.20/24 dev enp0s3" }, "mysql": { "admin":"root", "passwd":"123456", "host":"127.0.0.1", "port":3306, "basedir":"/usr/local/mysql", "defaults-file":"/etc/my.cnf" }, "replication": { "user":"repl", "passwd":"123456" }, "backup": { "ssh-host":"10.10.10.11", "ssh-user":"mysql", "ssh-passwd":"123456", "basedir":"/usr/local/mysql", "backup-dir":"/backup", "mysqld-monitor-interval": 5000, "backup-use-memory": "3072M", "ssh-port": 22, "backup-parallel": 2, "backup-iops-limits": 100000, "xtrabackup-bindir":"/usr/bin" }, "rpc": { "request-timeout":500 }, "log": { "level":"INFO" } } |
注意:主机配置文件中leader-start-command
和 leader-stop-command
参数的值,10.10.10.20/24 和 enp0s3 需要根据实际情况填写。
2.3.2 配置备份环境
1 | mkdir /backup & chown -R mysql.mysql /backup |
在复制环境中创建管理员帐号。
1 2 3 | create user 'root'@'127.0.0.1' identified by '123456'; grant all privileges on *.* to 'root'@'127.0.0.1'; flush privileges; |
2.3.3 修改权限
1 2 3 4 | mkdir /etc/xenon/ ln -s /usr/local/xenon/conf/xenon.json /etc/xenon/ chown mysql.mysql -R /usr/local/xenon chown mysql.mysql -R /etc/xenon/ |
2.3.4 修改日志目录
1 2 3 4 | mkdir /etc/xenon/log chown mysql.mysql /etc/xenon/log cd /usr/local/xenon/bin/ echo "/etc/xenon/xenon.json" > /usr/local/xenon/bin/config.path |
2.4 启用 Xenon
2.4.1 登录
通过 MySQL 帐号登录并启动 Xenon。
1 2 3 4 5 6 7 8 9 10 11 | ## db1 su - mysql /usr/local/xenon/bin/xenon -c /etc/xenon/xenon.json > /etc/xenon/log/xenon.log 2>&1 & ## db2 su - mysql /usr/local/xenon/bin/xenon -c /etc/xenon/xenon.json > /etc/xenon/log/xenon.log 2>&1 & ## db3 su - mysql /usr/local/xenon/bin/xenon -c /etc/xenon/xenon.json > /etc/xenon/log/xenon.log 2>&1 & |
2.4.2 添加成员
1 2 | /usr/local/xenon/bin/xenoncli cluster add \ 10.10.10.10:8801,10.10.10.11:8801,10.10.10.18:8801 |
2.4.3 查看集群状态
查看集群状态。
查看 MySQL 状态。
MySQL 高可用部署成功!
总结
在使用 Xenon 搭建高可用集群时,需要注意以下几点:
- MySQL 5.7+ GTID 复制结构为基础
- 必须有增强半同步复制插件
- MySQL 帐号必须是
/bin/bash
- Xenon 和 MySQL 必须运行在同一帐号下,一般就是 MySQL
- MySQL 帐号在节点之前必须有 SSH 信任
- 节点必须安装 Xtrabackup
- 必须使用 mysqld_safe 启用 mysql
Xenon 实现 MySQL 高可用架构之日常操作篇
启动集群
启动 MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 | ## db1: [mysql@db1 ~]$ nohup mysqld_safe --defaults-file=/etc/my.cnf & [1] 5526 [mysql@db1 ~]$ nohup: ignoring input and appending output to ‘nohup.out’ ## db2: [mysql@db2 ~]$ nohup mysqld_safe --defaults-file=/etc/my.cnf & [1] 3637 [mysql@db2 ~]$ nohup: ignoring input and appending output to 'nohup.out' mysql –uroot –p ## 开启增强半同步 set global rpl_semi_sync_slave_enabled=1; stop slave io_thread; start slave io_thread; |
db3 的启动步骤同 db2。
启动 Xenon
1 2 3 | db1: [mysql@db1 ~]$ cd /usr/local/xenon/bin/ [mysql@db1 bin]$ ./xenon -c /etc/xenon/xenon.json > /etc/xenon/log/xenon.log 2>&1 & |
db2、db3 的启动方式同 db1。
注意:当 MySQL 未启动时,启动 Xenon 会自动启动 MySQL。
检查半同步复制
启动时,需要检查半同步复制是否开启。
1 2 3 4 5 6 7 8 9 10 11 12 13 | (product)root@localhost [(none)]> show variables like '%semi%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | …… |
主要参数:主节点rpl_semi_sync_master_enabled
的状态为 ON,从节点 rpl_semi_sync_slave_enabled
的状态为 ON,表示半同步复制正常开启。
帮助命令
通过 xenoncli 的帮助命令查看可选的命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [mysql@db1 bin]$ ./xenoncli help A simple command line client for xenon Usage: xenoncli [command] Available Commands: cluster cluster related commands init init the xenon config file mysql mysql related commands perf perf related commands raft raft related commands version Print the version number of xenon client xenon xenon related commands Use "xenoncli [command] --help" for more information about a command. |
举例说明,查看 cluster 的操作命令帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [mysql@db1 bin]$ ./xenoncli cluster -h cluster related commands Usage: xenoncli cluster [command] Available Commands: add add peers to leader(if there is no leader, add to local) gtid show cluster gtid status log merge cluster xenon.log from logdir mysql show cluster mysql status raft show cluster raft status remove remove peers from leader(if there is no leader, remove from local) status show cluster status xenon show cluster xenon status Use "xenoncli cluster [command] --help" for more information about a command. |
查看集群
查看状态
1 2 3 4 5 | xenoncli cluster status xenoncli cluster mysql xenoncli cluster xenon |
检查集群一致状态
1 | xenoncli cluster raft |
检查集群 GTID 状态
1 | xenoncli cluster gtid |
关闭集群
1 2 3 | xenoncli mysql stopmonitor xenoncli mysql shutdown pkill xenon |
添加/删除节点
添加节点
1 | xenoncli cluster add 192.168.0.2:8801,192.168.0.3:8801,192.168.0.5:8801 |
Xenon 允许添加已经添加过的节点。如果节点已经在集群里面,将直接被忽视,不做任何操作。
删除节点
1 | xenoncli cluster remove 192.168.0.2:8801,192.168.0.3:8801,192.168.0.5:8801 |
备份 MySQL 到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@db1 backup]## xenoncli mysql backup Usage: xenoncli mysql backup --to=backupdir [flags] [mysql@db1 bin]$ ./xenoncli mysql backup --to=/backup/data 2020/02/10 04:28:43.924306 [WARNING] rebuildme.found.best.slave[10.10.10.11:8801].leader[10.10.10.10:8801] 2020/02/10 04:28:43.924576 [WARNING] S1-->found.the.best.backup.host[10.10.10.11:8801].... 2020/02/10 04:28:43.945828 [WARNING] S2-->rm.and.mkdir.backupdir[/backup/data] 2020/02/10 04:28:43.945845 [WARNING] S3-->xtrabackup.begin.... 2020/02/10 04:28:43.946692 [WARNING] rebuildme.backup.req[&{From: BackupDir:/backup/data SSHHost:10.10.10.10 SSHUser:mysql SSHPasswd:123456 SSHPort:22 IOPSLimits:100000 XtrabackupBinDir:/usr/bin}].from[10.10.10.11:8801] 2020/02/10 04:29:06.360412 [WARNING] S3-->xtrabackup.end.... 2020/02/10 04:29:06.360444 [WARNING] S4-->apply-log.begin.... 2020/02/10 04:29:11.010835 [WARNING] S4-->apply-log.end.... 2020/02/10 04:29:11.011275 [WARNING] completed OK! 2020/02/10 04:29:11.011300 [WARNING] backup.all.done.... |
因 xenoncli 会尝试先删除 backupdir 再 mkdir,故不建议使用 /backup 根目录路径。若使用这种路径,rm 可以成功,mkdir 会失败。
Rebuild 重建
选择最佳状态的从节点,进行 XtraBackup 流式重建,from 参数可指定重建源节点。
- 作用:重建当前节点 MySQL
- 场景:节点坏掉需要快速重建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | // 在要做重建的节点执行: xenoncli mysql rebuildme // 如果想以指定节点为准重建,执行: xenoncli mysql -h // 基于指定节点复制重建当前 MySQL 节点 [mysql@db1 bin]$ ./xenoncli mysql rebuildme --from=10.10.10.11:8801 2020/02/11 01:19:40.907645 [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!". 2020/02/11 01:19:40.908418 [WARNING] S1-->check.raft.leader 2020/02/11 01:19:40.911586 [WARNING] S2-->prepare.rebuild.from[10.10.10.11:8801].... 2020/02/11 01:19:40.913050 [WARNING] S3-->check.bestone[10.10.10.11:8801].is.OK.... 2020/02/11 01:19:40.913066 [WARNING] S4-->set.learner 2020/02/11 01:19:40.915499 [WARNING] S5-->stop.monitor 2020/02/11 01:19:40.916758 [WARNING] S6-->kill.mysql 2020/02/11 01:19:40.947717 [WARNING] S7-->check.bestone[10.10.10.11:8801].is.OK.... 2020/02/11 01:19:40.950867 [WARNING] S8-->rm.datadir[/backup/data] 2020/02/11 01:19:40.950879 [WARNING] S9-->xtrabackup.begin.... 2020/02/11 01:19:40.951632 [WARNING] rebuildme.backup.req[&{From: BackupDir:/backup/data SSHHost:10.10.10.10 SSHUser:mysql SSHPasswd:123456 SSHPort:22 IOPSLimits:100000 XtrabackupBinDir:/usr/bin}].from[10.10.10.11:8801] 2020/02/11 01:19:51.200092 [WARNING] S9-->xtrabackup.end.... 2020/02/11 01:19:51.200116 [WARNING] S10-->apply-log.begin.... 2020/02/11 01:19:56.666199 [WARNING] S10-->apply-log.end.... 2020/02/11 01:19:56.666209 [WARNING] S11-->start.mysql.begin... 2020/02/11 01:19:56.666757 [WARNING] S11-->start.mysql.end... 2020/02/11 01:19:56.666766 [WARNING] S12-->wait.mysqld.running.begin.... 2020/02/11 01:19:59.680987 [WARNING] wait.mysqld.running... 2020/02/11 01:19:59.709382 [WARNING] S12-->wait.mysqld.running.end.... 2020/02/11 01:19:59.709395 [WARNING] S13-->wait.mysql.working.begin.... 2020/02/11 01:19:59.710943 [WARNING] S13-->wait.mysql.working.end.... 2020/02/11 01:19:59.710955 [WARNING] S14-->stop.and.reset.slave.begin.... 2020/02/11 01:19:59.731108 [WARNING] S14-->stop.and.reset.slave.end.... 2020/02/11 01:19:59.731121 [WARNING] S15-->reset.master.begin.... 2020/02/11 01:19:59.739414 [WARNING] S15-->reset.master.end.... 2020/02/11 01:19:59.739455 [WARNING] S15-->set.gtid_purged[1520b6dd-2fb1-11ea-ab64-080027d70146:1-14 ].begin.... 2020/02/11 01:19:59.742273 [WARNING] S15-->set.gtid_purged.end.... 2020/02/11 01:19:59.742284 [WARNING] S16-->enable.raft.begin... 2020/02/11 01:19:59.743512 [WARNING] S16-->enable.raft.done... 2020/02/11 01:19:59.743534 [WARNING] S17-->wait[3000 ms].change.to.master... 2020/02/11 01:19:59.743551 [WARNING] S18-->start.slave.begin.... 2020/02/11 01:19:59.763468 [WARNING] S18-->start.slave.end.... 2020/02/11 01:19:59.763478 [WARNING] completed OK! |
手动 Failover/switchover
手动触发主从切换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | (product)root@localhost [(none)]> set global read_only=on; Query OK, 0 rows affected (0.00 sec) [mysql@db1 bin]$ ./xenoncli raft trytoleader 2020/02/11 01:48:51.219975 [WARNING] [10.10.10.10:8801].prepare.to.propose.this.raft.to.leader 2020/02/11 01:48:51.255617 [WARNING] [10.10.10.10:8801].propose.done [mysql@db1 bin]$ ./xenoncli cluster status +------------------+-------------------------------+---------+---------+--------------------------+---------------------+----------------+------------------+ | ID | Raft | Mysqld | Monitor | Backup | Mysql | IO/SQL_RUNNING | MyLeader | +------------------+-------------------------------+---------+---------+--------------------------+---------------------+----------------+------------------+ | 10.10.10.10:8801 | [ViewID:4 EpochID:0]@LEADER | RUNNING | ON | state:[NONE] | [ALIVE] [READWRITE] | [true/true] | 10.10.10.10:8801 | | | | | | LastError: | | | | +------------------+-------------------------------+---------+---------+--------------------------+---------------------+----------------+------------------+ | 10.10.10.11:8801 | [ViewID:4 EpochID:0]@FOLLOWER | RUNNING | ON | state:[NONE] | [ALIVE] [READONLY] | [true/true] | 10.10.10.10:8801 | | | | | | LastError: | | | | +------------------+-------------------------------+---------+---------+--------------------------+---------------------+----------------+------------------+ | 10.10.10.18:8801 | [ViewID:4 EpochID:0]@FOLLOWER | RUNNING | ON | state:[NONE] | [ALIVE] [READONLY] | [true/true] | 10.10.10.10:8801 | | | | | | LastError: | | | | +------------------+-------------------------------+---------+---------+--------------------------+---------------------+----------------+------------------+ |
MySQL Stack Info
查看 MySQL 如何调用堆栈信息。Quick Stack 功能速度快,对流程几乎没有影响。
1 2 3 4 5 6 7 8 | xenoncli perf -h perf related commands Usage: xenoncli perf [command] Available Commands: quickstack capture the stack of mysqld using quickstack |
Raft + Operation
不发起选主 enable 是恢复,disable 指该 Xenon 节点只复制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | xenoncli raft -h raft related commands Usage: xenoncli raft [command] Available Commands: add add peers to local disable enable the node out control of raft disablepurgebinlog disable leader to purge binlog enable enable the node in control of raft enablepurgebinlog enable leader to purge binlog(default) nodes show raft nodes remove remove peers from local status status in JSON(state(LEADER/CANDIDATE/FOLLOWER/IDLE)) trytoleader propose this raft as leader |
启动增强半同步检查
1 2 3 4 5 | ## 启动半同步复制检查 xenoncli raft enablechecksemisync ## 启动或关闭半同步复制检查 xenoncli raft disablechecksemisync |
我们可以看到半同步的参数是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | (product)root@localhost [(none)]> show variables like '%rpl%'; +-------------------------------------------+---------------------+ | Variable_name | Value | +-------------------------------------------+---------------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000000000000000000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | | rpl_stop_slave_timeout | 31536000 | +-------------------------------------------+---------------------+ |
若通过 set global
修改半同步的 timeout,将自动订正为无限大;若基于运维临时调整,需要先执行 xenoncli mysql disablechecksemisync
再修改;若运维完,需要恢复自动订正的话,执行 enablechecksemisync
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // 例如:修改 timeout 参数为 10, (product)root@localhost [(none)]> set global rpl_semi_sync_master_timeout=10; Query OK, 0 rows affected (0.00 sec) (product)root@localhost [(none)]> show variables like '%rpl%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | | rpl_stop_slave_timeout | 31536000 | +-------------------------------------------+------------+ 9 rows in set (0.00 sec) // 过一会儿又自动变为无穷大了 (product)root@localhost [(none)]> show variables like '%rpl%'; +-------------------------------------------+---------------------+ | Variable_name | Value | +-------------------------------------------+---------------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000000000000000000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | | rpl_stop_slave_timeout | 31536000 | +-------------------------------------------+---------------------+ 9 rows in set (0.00 sec) |
指令分类
查询集群信息:
1 | xenoncli cluster 指令 |