使用Xenon实现MySQL高可用集群

 


作者:杨建,知数堂优秀校友。

1、Xenon 介绍2、架构环境说明3、MySQL 安装准备3.1、MySQL 主从复制搭建3.2、MySQL 半同步复制配置3.3、系统配置3.4、配置 hosts 解析3.5、各节点配置 ssh 互信3.5.1、150 配置3.5.1、151 配置3.5.1、152 配置4、xenon 配置准备4.1、配置 golang 环境4.2、安装xtrabackup4.3、安装 xenon4.4、配置xenon4.5、开启 xenon 并配置集群5、检验 xenon 环境5.1、检测 VIP 切换5.2、数据库重建5.2.1、模拟删除主库数据目录5.2.2、进行数据库重建

1、Xenon 介绍

  1. https://github.com/radondb/xenon
  2. # VIP 就是对外提供服务的IP,比如jdbc配置就是写这个VIP

xenon 架构介绍 ,每个MySQL 节点安装了一个agent ,agent的作用:ping 一下本来MySQL是否存活,然后把本地的gtid 获取出来,写入到local index ,看各节点的local index的gtid 谁大,谁大谁做作为主库。

每个agent 都有一个心跳信息,主库的Leader 和 从库的Follower 的心跳时间是可以配置的,超过了多长时间,就认为主库不存活,然后从节点选举主库。

xenon 为什么要用三节点:其实用了增强半同步架构,最少有一个从节点,给主库ACK响应。两个从节点,就是为了防止,一个从节点挂了,主库不对外工作了。

xenon 的约束

  • 针对金融环境,基于GTID,增强半同步的复制架构。

  • mysql与xenon使用同一个用户启动(例如:都使用mysql用户启动,或都使用root用户启动,正常都使用mysql用户)

  • 要使用mysqld_safe启动mysql

实际 xenon 环境使用:

  • 如果需要读写分离可以结合 ProxySQL

  • xenon 做高可用

2、架构环境说明

IPCentosHostNameMySQLxtrabackupuser备注
10.0.0.150 Centos 7.8 mysql-150 MySQL 8.0.19 8.0.11 mysql 主库
10.0.0.151 Centos 7.8 mysql-152 MySQL 8.0.19 8.0.11 mysql 从库
10.0.0.152 Centos 7.8 mysql-152 MySQL 8.0.19 8.0.11 mysql 从库

vip:10.0.0.100,对外提供服务的IP

3、MySQL 安装准备

注:MySQL 8.0.19 安装省略

3.1、MySQL 主从复制搭建

  1. 基于 GTID+ROW 主从复制架构

  2. 参数设置:(从库操作151,152,设置一下参数)

  1. set global super_only=1;
  2. set global read_only=1;
  1. 配置成主从:(151和152 change 到 150)

  1. change master to \
  2. master_host='10.0.0.150', \
  3. master_user='repl', \
  4. master_password='123456', \
  5. master_port=3306, \
  6. master_auto_position=1;

注:这里配置主从复制省略

3.2、MySQL 半同步复制配置

1、安装插件(所有机器150,151,152)

  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  2. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

2、启动半同步(所有机器)

  1. set global rpl_semi_sync_master_enabled=1;
  2. set global rpl_semi_sync_master_timeout=2147483648;
  3. set global rpl_semi_sync_slave_enabled=1;

注:其实这里只需要所有节点安装半同步插件,并不需要启动半同步。xenon 会自动配置半同步

3.3、系统配置

  1. 修改三台主机的mysql账号指定shell 为/bin/bash ,并改密码(三台机密码改成一样):

  1. # 修改环境变量,三台机器都需要 如下相同操作
  2. [root@mysql-150 ~]# chsh mysql
  3. Changing shell for mysql.
  4. New shell [/sbin/nologin]: /bin/bash
  5. Shell changed.
  6.  
  7. # 修改 mysql 用户密码,这里密码我设置都是mysql
  8. shell# passwd mysql
  1. 修改 mysql 环境变量:从其它普通账号复制 .bash* 到mysql 用户家目录(三台机器操作)

  1. shell# mkdir /home/mysql
  2. shell# cp /root/.bash* /home/mysql/
  3. shell# chown -R mysql:mysql /home/mysql
  1. 添加mysql账号的sudo权限 (所有机器操作)

  1. # visudo
  2. mysql   ALL=(ALL)       NOPASSWD: /usr/sbin/ip

3.4、配置 hosts 解析

所有机器配置

  1. vim /etc/hosts
  2. 10.0.0.150  mysql-150
  3. 10.0.0.151  mysql-151
  4. 10.0.0.152  mysql-152

3.5、各节点配置 ssh 互信

3.5.1、150 配置

  1. [root@mysql-150 ~]# su - mysql
  2.  
  3. [mysql@mysql-150 ~]$ pwd
  4. /home/mysql
  5.  
  6. [mysql@mysql-150 ~]$ ssh-keygen 
  7.  
  8. [mysql@mysql-150 ~]$ cd .ssh
  9.  
  10. [mysql@mysql-150 .ssh]$ ls
  11. id_rsa  id_rsa.pub
  12. #id_rsa 私钥文件
  13. #is_rsa.pub 公钥文件
  14.  
  15. [mysql@mysql-150 .ssh]$ cat id_rsa.pub > authorized_keys
  16.  
  17. [mysql@mysql-150 .ssh]$ chmod 600 /home/mysql/.ssh/*
  18.  
  19. # 151,152机器 创建.ssh 目录, 并且修改权限为700
  20. [mysql@mysql-151 ~]$ mkdir .ssh
  21. [mysql@mysql-152 ~]$ mkdir .ssh
  22. [mysql@mysql-151 ~]$ chmod 700 .ssh/
  23. [mysql@mysql-152 ~]$ chmod 700 .ssh/
  24.  
  25. # 拷贝authorized_keys 到151和152 机器
  26. [mysql@mysql-150 .ssh]$ scp authorized_keys mysql@10.0.0.151:~/.ssh
  27.  
  28. [mysql@mysql-150 .ssh]$ scp authorized_keys mysql@10.0.0.152:~/.ssh
  29.  
  30. # 验证 ssh 信任
  31. [mysql@mysql-150 .ssh]$ ssh mysql@10.0.0.151
  32. [mysql@mysql-150 .ssh]$ ssh mysql@10.0.0.152
  33.  
  34. 能够无密码登陆,就表示成功了
  35.  

其实配置可以像 151配置,152配置那样, 但是上面写了一个详细过程是为了了解 配置ssh 信任,而方便排错

3.5.1、151 配置

  1. [root@mysql-151 ~]# su - mysql
  2.  
  3. [mysql@mysql-151 ~]$ ssh-keygen 
  4.  
  5. # 拷贝公钥到 150 和 152 节点
  6. [mysql@mysql-151 ~]$ ssh-copy-id mysql@10.0.0.150
  7. [mysql@mysql-151 ~]$ ssh-copy-id mysql@10.0.0.152
  8.  
  9. # 无密码连接测试
  10. [mysql@mysql-151 ~]$ ssh mysql@10.0.0.150
  11. [mysql@mysql-151 ~]$ ssh mysql@10.0.0.152

3.5.1、152 配置

  1. [root@mysql-152 ~]# su - mysql
  2.  
  3. [mysql@mysql-152 ~]$ ssh-copy-id mysql@10.0.0.150
  4. [mysql@mysql-152 ~]$ ssh-copy-id mysql@10.0.0.151
  5.  
  6. [mysql@mysql-152 ~]$ ssh mysql@10.0.0.150
  7. [mysql@mysql-152 ~]$ ssh mysql@10.0.0.151

4、xenon 配置准备

4.1、配置 golang 环境

  1. # 所有机器配置 golang 【150,151,152】
  2.  
  3. 1、下载
  4. wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
  5.  
  6. 2、解压
  7. tar -zxf go1.14.4.linux-amd64.tar.gz -C /usr/local/
  8.  
  9. #3、配置 go 环境
  10. vim /etc/profile
  11. export GOPATH=/usr/local/go/bin
  12. export PATH=$PATH:$GOPATH
  13.  
  14. source /etc/profile
  15.  
  16. 4、查看 go 版本
  17. shell# go version
  18. go version go1.14.4 linux/amd64

4.2、安装xtrabackup

所有节点安装

  1. # 下载xtrabackup 软件
  2. wget https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.11/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.11-1.el7.x86_64.rpm
  3.  
  4. yum localinstall percona-xtrabackup-80-8.0.11-1.el7.x86_64.rpm
  5.  
  6.  
  7. yum -y install libdbi-dbd-mysql

4.3、安装 xenon

所有节点安装,以MySQL-150 为安装为例

  1. 安装git (所有节点)

  1. [root@mysql-150 ~]# yum -y install git
  2. [root@mysql-150 ~]# mkdir /mygit
  3. [root@mysql-150 ~]# cd /mygit
  4. [root@mysql-150 mygit]# git clone https://github.com/radondb/xenon
  1. 安装 xenon (所有节点)

  1. [root@mysql-150 ~]# cd /mygit/xenon/
  2. [root@mysql-150 xenon]# make
  3.  
  4. [root@mysql-150 xenon]# mkdir -p /data/xenon
  5. [root@mysql-150 xenon]# cp -r /mygit/xenon/bin /data/xenon/
  6. [root@mysql-150 xenon]# cp -r /mygit/xenon/conf/xenon-simple.conf.json /data/xenon/xenon.json
  7. [root@mysql-150 xenon]# echo "/etc/xenon/xenon.json" > /data/xenon/bin/config.path
  8.  
  9. [root@mysql-150 xenon]# mkdir /etc/xenon
  10. [root@mysql-150 xenon]# mv /data/xenon/xenon.json /etc/xenon/
  11.  
  12. [root@mysql-150 xenon]# chown -R mysql:mysql /data/xenon/
  13. [root@mysql-150 xenon]# chown -R mysql:mysql /etc/xenon/
  14.  
  15. # 其他节点如上,相同操作

4.4、配置xenon

所有机器配置xenon,下面以150为例,其它机器,只需改成本机IP即可

  1. [root@mysql-150 ~]# cat /etc/xenon/xenon.json 
  2. {
  3.     "server":
  4.     {
  5.         "endpoint":"10.0.0.150:8801"
  6.     },
  7.  
  8.     "raft":
  9.     {
  10.         "meta-datadir":"raft.meta",
  11.         "heartbeat-timeout":1000,
  12.         "election-timeout":3000,
  13.         "leader-start-command":"sudo /sbin/ip a a 10.0.0.100/16 dev eth0 && arping-c3 -A 10.0.0.100 -1 ethO",
  14.         "leader-stop-command":"sudo /sbin/ip a d 10.0.0.100/16 dev eth0"
  15.     },
  16.  
  17.     "mysql":
  18.     {
  19.         "admin":"root",
  20.         "passwd":"",
  21.         "host":"127.0.0.1",
  22.         "port":3306,
  23.         "basedir":"/usr/local/mysql",
  24.         "defaults-file":"/data/mysql/mysql3306/my3306.cnf",
  25.         "ping-timeout":1000,
  26.         "master-sysvars":"tokudb_fsync_log_period=default;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
  27.         "slave-sysvars": "tokudb_fsync_log_period=1000;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
  28.     },
  29.  
  30.     "replication":
  31.     {
  32.         "user":"repl",
  33.         "passwd":"123456"
  34.     },
  35.  
  36.     "backup":
  37.     {
  38.         "ssh-host":"10.0.0.150",
  39.         "ssh-user":"mysql",
  40.         "ssh-passwd":"mysql",
  41.         "ssh-port":22,
  42.         "backupdir":"/data/mysql/mysql3306/data",
  43.         "xtrabackup-bindir":"/usr/bin",
  44.         "backup-iops-limits":100000,
  45.         "backup-use-memory": "2GB",
  46.         "backup-parallel": 2
  47.     },
  48.  
  49.     "rpc":
  50.     {
  51.         "request-timeout":500
  52.     },
  53.  
  54.     "log":
  55.     {
  56.         "level":"INFO"
  57.     }
  58. }

其他节点的配置文件修改

  1. 把 /etc/xenon/xenon.json 拷贝到 另外两个节点(151,152) 
  2. "endpoint":"10.0.0.150:8801"  #需要把 endpoint 换成各节点相应ip
  3. "ssh-host":"10.0.0.150",      #需要把backup 下的 换成各节点相应ip
  4.  
  5. # 如果是mysql-151
  6. "endpoint":"10.0.0.151:8801"
  7. "ssh-host":"10.0.0.151", 
  8.  
  9. # 如果是mysql-152
  10. "endpoint":"10.0.0.152:8801"
  11. "ssh-host":"10.0.0.152", 
  12.  
  13.  
  14. # 这个是 vip 生成的脚本 
  15. sudo /sbin/ip a a 10.0.0.100/16 dev eth0 && arping-c3 -A 10.0.0.100 -1 ethO
  16.  
  17. # 这个是删除 vip 的脚本
  18. sudo /sbin/ip a d 10.0.0.100/16 dev eth0

4.5、开启 xenon 并配置集群

1. 启动xenon,用mysql用户启动

  1. # 所有节点启动 xenon (150,151,152)
  2. su - mysql
  3. cd /data/xenon/bin/
  4. nohup /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &

2. 添加 xenon 节点成员

  1. # 所有节点都要添加节点成员(150,151,152)
  2. ./xenoncli cluster add 10.0.0.150:8801,10.0.0.151:8801,10.0.0.152:8801

3. 查看 vip 信息

  1. # 查看 vip 在台机器
  2. [mysql@mysql-150 bin]$ ip addr show | grep 10.0.0.100
  3.     inet 10.0.0.100/16 scope global eth0
  4.  
  5. # 测试 151 和 152 能否 连接 10.0.0.100
  6. [mysql@mysql-151 ~]$ mysql -h 10.0.0.100 -u keme -p
  7. mysql> system hostname -I # 这是查看当前ssh系统信息的ip
  8. 10.0.0.151 192.168.122.1 
  9. mysql> select @@hostname; # 这是查看 mysql 连接的主机名
  10. +------------+
  11. | @@hostname |
  12. +------------+
  13. | mysql-150  |
  14. +------------+
  15. # 通过 vip 测试写入
  16. mysql> use keme #这是我做实验的测试库
  17. mysql> insert into t2 values (13);
  18. Query OK, 1 row affected (0.01 sec)
  19.  
  20. # 从上验证,通过 vip 连接没问题 

4. 查看xenon集群状态信息

  1. LEADER 是主库 10.0.0.150 
  2. FOLLOWER 是从库 10.0.0.151,10.0.0.152

5、检验 xenon 环境

5.1、检测 VIP 切换

1、查看VIP信息

  1. # 查看 VIP 信息 
  2. [mysql@mysql-150 bin]$ ip addr show | grep 10.0.0.100
  3.     inet 10.0.0.100/16 scope global eth0
  4. # 可以知道 VIP 信息,在10.0.0.150这台机器

2、进行模拟故障

关闭 150 数据库,看看 VIP 是不是切换到其他机器

  1. [mysql@mysql-150 bin]$ mysqladmin -S /tmp/mysql3306.sock -p shutdown
  2.  
  3. # 查看集群状态信息
  4. [mysql@mysql-150 bin]$ ./xenoncli cluster status

从上图可知:VIP 切换成功了

xenon 会自动把宕机的数据库给启动起来,Leader:10.0.0.152

5.2、数据库重建

5.2.1、模拟删除主库数据目录

这是我的实验操作,生产环境谨慎这样操作

  1. [root@mysql-152 ~]# cd /data/mysql/mysql3306
  2. [root@mysql-152 mysql3306]# rm -rf data
  3. # kill 掉mysql 进程,我这里的数据库进程号是4718和6074
  4. [root@mysql-152 mysql3306]# kill -9 4718 6074
  5.  
  6. # 查看以下 vip 信息 和 集群状态信息,是否正常切换
  7. [root@mysql-152 mysql3306]# ip addr show | grep 10.0.0.150
  8. 一定要确认 VIP 飘到新的主库上

从上图得知:Leader: 10.0.0.151

5.2.2、进行数据库重建

  1. [root@mysql-152 mysql3306]# su - mysql
  2. [mysql@mysql-152 ~]$ cd /data/xenon/bin/
  3.  
  4. # 进行重建
  5. [mysql@mysql-152 bin]$ mkdir /data/mysql/mysql3306/data
  6. [mysql@mysql-152 bin]$ ./xenoncli mysql rebuildme

重建成功截图如下

  1. # 查看重建后的152的数据库信息,是否正常重建,是不是正常恢复到集群节点了
  2. [mysql@mysql-152 bin]$ ss -antlp | grep mysql
  3. LISTEN    0  100   [::]:3306      [::]:*     users:(("mysqld",pid=15545,fd=30))
  4. [mysql@mysql-152 bin]$ /data/xenon/bin/xenoncli cluster status
  5. # 如下图

从上面的得知,rm -rf 数据库目录 ,只需要xenoncli mysql rebuildme,数据库目录就自动重建成功了,并也自动加入了xenon 管理的高可用集群。

posted @ 2021-05-27 10:59  da0h1  阅读(350)  评论(0编辑  收藏  举报