使用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 介绍
https://github.com/radondb/xenon
# 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、架构环境说明
IP | Centos | HostName | MySQL | xtrabackup | user | 备注 |
---|---|---|---|---|---|---|
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 主从复制搭建
基于 GTID+ROW 主从复制架构
参数设置:(从库操作151,152,设置一下参数)
set global super_only=1;
set global read_only=1;
配置成主从:(151和152 change 到 150)
change master to \
master_host='10.0.0.150', \
master_user='repl', \
master_password='123456', \
master_port=3306, \
master_auto_position=1;
注:这里配置主从复制省略
3.2、MySQL 半同步复制配置
1、安装插件(所有机器150,151,152)
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2、启动半同步(所有机器)
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=2147483648;
set global rpl_semi_sync_slave_enabled=1;
注:其实这里只需要所有节点安装半同步插件,并不需要启动半同步。xenon 会自动配置半同步
3.3、系统配置
修改三台主机的mysql账号指定shell 为/bin/bash ,并改密码(三台机密码改成一样):
# 修改环境变量,三台机器都需要 如下相同操作
[root@mysql-150 ~]# chsh mysql
Changing shell for mysql.
New shell [/sbin/nologin]: /bin/bash
Shell changed.
# 修改 mysql 用户密码,这里密码我设置都是mysql
shell# passwd mysql
修改 mysql 环境变量:从其它普通账号复制 .bash* 到mysql 用户家目录(三台机器操作)
shell# mkdir /home/mysql
shell# cp /root/.bash* /home/mysql/
shell# chown -R mysql:mysql /home/mysql
添加mysql账号的sudo权限 (所有机器操作)
# visudo
mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip
3.4、配置 hosts 解析
所有机器配置
vim /etc/hosts
10.0.0.150 mysql-150
10.0.0.151 mysql-151
10.0.0.152 mysql-152
3.5、各节点配置 ssh 互信
3.5.1、150 配置
[root@mysql-150 ~]# su - mysql
[mysql@mysql-150 ~]$ pwd
/home/mysql
[mysql@mysql-150 ~]$ ssh-keygen
[mysql@mysql-150 ~]$ cd .ssh
[mysql@mysql-150 .ssh]$ ls
id_rsa id_rsa.pub
#id_rsa 私钥文件
#is_rsa.pub 公钥文件
[mysql@mysql-150 .ssh]$ cat id_rsa.pub > authorized_keys
[mysql@mysql-150 .ssh]$ chmod 600 /home/mysql/.ssh/*
# 151,152机器 创建.ssh 目录, 并且修改权限为700
[mysql@mysql-151 ~]$ mkdir .ssh
[mysql@mysql-152 ~]$ mkdir .ssh
[mysql@mysql-151 ~]$ chmod 700 .ssh/
[mysql@mysql-152 ~]$ chmod 700 .ssh/
# 拷贝authorized_keys 到151和152 机器
[mysql@mysql-150 .ssh]$ scp authorized_keys [email protected]:~/.ssh
[mysql@mysql-150 .ssh]$ scp authorized_keys [email protected]:~/.ssh
# 验证 ssh 信任
[mysql@mysql-150 .ssh]$ ssh [email protected]
[mysql@mysql-150 .ssh]$ ssh [email protected]
能够无密码登陆,就表示成功了
其实配置可以像 151配置,152配置那样, 但是上面写了一个详细过程是为了了解 配置ssh 信任,而方便排错
3.5.1、151 配置
[root@mysql-151 ~]# su - mysql
[mysql@mysql-151 ~]$ ssh-keygen
# 拷贝公钥到 150 和 152 节点
[mysql@mysql-151 ~]$ ssh-copy-id [email protected]
[mysql@mysql-151 ~]$ ssh-copy-id [email protected]
# 无密码连接测试
[mysql@mysql-151 ~]$ ssh [email protected]
[mysql@mysql-151 ~]$ ssh [email protected]
3.5.1、152 配置
[root@mysql-152 ~]# su - mysql
[mysql@mysql-152 ~]$ ssh-copy-id [email protected]
[mysql@mysql-152 ~]$ ssh-copy-id [email protected]
[mysql@mysql-152 ~]$ ssh [email protected]
[mysql@mysql-152 ~]$ ssh [email protected]
4、xenon 配置准备
4.1、配置 golang 环境
# 所有机器配置 golang 【150,151,152】
# 1、下载
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
# 2、解压
tar -zxf go1.14.4.linux-amd64.tar.gz -C /usr/local/
#3、配置 go 环境
vim /etc/profile
export GOPATH=/usr/local/go/bin
export PATH=$PATH:$GOPATH
source /etc/profile
# 4、查看 go 版本
shell# go version
go version go1.14.4 linux/amd64
4.2、安装xtrabackup
所有节点安装
# 下载xtrabackup 软件
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
yum localinstall percona-xtrabackup-80-8.0.11-1.el7.x86_64.rpm
yum -y install libdbi-dbd-mysql
4.3、安装 xenon
所有节点安装,以MySQL-150 为安装为例
安装git (所有节点)
[root@mysql-150 ~]# yum -y install git
[root@mysql-150 ~]# mkdir /mygit
[root@mysql-150 ~]# cd /mygit
[root@mysql-150 mygit]# git clone https://github.com/radondb/xenon
安装 xenon (所有节点)
[root@mysql-150 ~]# cd /mygit/xenon/
[root@mysql-150 xenon]# make
[root@mysql-150 xenon]# mkdir -p /data/xenon
[root@mysql-150 xenon]# cp -r /mygit/xenon/bin /data/xenon/
[root@mysql-150 xenon]# cp -r /mygit/xenon/conf/xenon-simple.conf.json /data/xenon/xenon.json
[root@mysql-150 xenon]# echo "/etc/xenon/xenon.json" > /data/xenon/bin/config.path
[root@mysql-150 xenon]# mkdir /etc/xenon
[root@mysql-150 xenon]# mv /data/xenon/xenon.json /etc/xenon/
[root@mysql-150 xenon]# chown -R mysql:mysql /data/xenon/
[root@mysql-150 xenon]# chown -R mysql:mysql /etc/xenon/
# 其他节点如上,相同操作
4.4、配置xenon
所有机器配置xenon,下面以150为例,其它机器,只需改成本机IP即可
[root@mysql-150 ~]# cat /etc/xenon/xenon.json
{
"server":
{
"endpoint":"10.0.0.150:8801"
},
"raft":
{
"meta-datadir":"raft.meta",
"heartbeat-timeout":1000,
"election-timeout":3000,
"leader-start-command":"sudo /sbin/ip a a 10.0.0.100/16 dev eth0 && arping-c3 -A 10.0.0.100 -1 ethO",
"leader-stop-command":"sudo /sbin/ip a d 10.0.0.100/16 dev eth0"
},
"mysql":
{
"admin":"root",
"passwd":"",
"host":"127.0.0.1",
"port":3306,
"basedir":"/usr/local/mysql",
"defaults-file":"/data/mysql/mysql3306/my3306.cnf",
"ping-timeout":1000,
"master-sysvars":"tokudb_fsync_log_period=default;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
"slave-sysvars": "tokudb_fsync_log_period=1000;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
},
"replication":
{
"user":"repl",
"passwd":"123456"
},
"backup":
{
"ssh-host":"10.0.0.150",
"ssh-user":"mysql",
"ssh-passwd":"mysql",
"ssh-port":22,
"backupdir":"/data/mysql/mysql3306/data",
"xtrabackup-bindir":"/usr/bin",
"backup-iops-limits":100000,
"backup-use-memory": "2GB",
"backup-parallel": 2
},
"rpc":
{
"request-timeout":500
},
"log":
{
"level":"INFO"
}
}
其他节点的配置文件修改
把 /etc/xenon/xenon.json 拷贝到 另外两个节点(151,152)
"endpoint":"10.0.0.150:8801" #需要把 endpoint 换成各节点相应ip
"ssh-host":"10.0.0.150", #需要把backup 下的 换成各节点相应ip
# 如果是mysql-151
"endpoint":"10.0.0.151:8801"
"ssh-host":"10.0.0.151",
# 如果是mysql-152
"endpoint":"10.0.0.152:8801"
"ssh-host":"10.0.0.152",
# 这个是 vip 生成的脚本
sudo /sbin/ip a a 10.0.0.100/16 dev eth0 && arping-c3 -A 10.0.0.100 -1 ethO
# 这个是删除 vip 的脚本
sudo /sbin/ip a d 10.0.0.100/16 dev eth0
4.5、开启 xenon 并配置集群
**1. 启动xenon,用mysql用户启动 **
# 所有节点启动 xenon (150,151,152)
su - mysql
cd /data/xenon/bin/
nohup /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
2. 添加 xenon 节点成员
# 所有节点都要添加节点成员(150,151,152)
./xenoncli cluster add 10.0.0.150:8801,10.0.0.151:8801,10.0.0.152:8801
3. 查看 vip 信息
# 查看 vip 在台机器
[mysql@mysql-150 bin]$ ip addr show | grep 10.0.0.100
inet 10.0.0.100/16 scope global eth0
# 测试 151 和 152 能否 连接 10.0.0.100
[mysql@mysql-151 ~]$ mysql -h 10.0.0.100 -u keme -p
mysql> system hostname -I # 这是查看当前ssh系统信息的ip
10.0.0.151 192.168.122.1
mysql> select @@hostname; # 这是查看 mysql 连接的主机名
+------------+
| @@hostname |
+------------+
| mysql-150 |
+------------+
# 通过 vip 测试写入
mysql> use keme #这是我做实验的测试库
mysql> insert into t2 values (13);
Query OK, 1 row affected (0.01 sec)
# 从上验证,通过 vip 连接没问题
4. 查看xenon集群状态信息
LEADER 是主库 10.0.0.150
FOLLOWER 是从库 10.0.0.151,10.0.0.152
5、检验 xenon 环境
5.1、检测 VIP 切换
1、查看VIP信息
# 查看 VIP 信息
[mysql@mysql-150 bin]$ ip addr show | grep 10.0.0.100
inet 10.0.0.100/16 scope global eth0
# 可以知道 VIP 信息,在10.0.0.150这台机器
2、进行模拟故障
关闭 150 数据库,看看 VIP 是不是切换到其他机器
[mysql@mysql-150 bin]$ mysqladmin -S /tmp/mysql3306.sock -p shutdown
# 查看集群状态信息
[mysql@mysql-150 bin]$ ./xenoncli cluster status
从上图可知:VIP 切换成功了
xenon 会自动把宕机的数据库给启动起来,Leader:10.0.0.152
5.2、数据库重建
5.2.1、模拟删除主库数据目录
这是我的实验操作,生产环境谨慎这样操作
[root@mysql-152 ~]# cd /data/mysql/mysql3306
[root@mysql-152 mysql3306]# rm -rf data
# kill 掉mysql 进程,我这里的数据库进程号是4718和6074
[root@mysql-152 mysql3306]# kill -9 4718 6074
# 查看以下 vip 信息 和 集群状态信息,是否正常切换
[root@mysql-152 mysql3306]# ip addr show | grep 10.0.0.150
一定要确认 VIP 飘到新的主库上
从上图得知:Leader: 10.0.0.151
5.2.2、进行数据库重建
[root@mysql-152 mysql3306]# su - mysql
[mysql@mysql-152 ~]$ cd /data/xenon/bin/
# 进行重建
[mysql@mysql-152 bin]$ mkdir /data/mysql/mysql3306/data
[mysql@mysql-152 bin]$ ./xenoncli mysql rebuildme
重建成功截图如下
# 查看重建后的152的数据库信息,是否正常重建,是不是正常恢复到集群节点了
[mysql@mysql-152 bin]$ ss -antlp | grep mysql
LISTEN 0 100 [::]:3306 [::]:* users:(("mysqld",pid=15545,fd=30))
[mysql@mysql-152 bin]$ /data/xenon/bin/xenoncli cluster status
# 如下图
从上面的得知,rm -rf 数据库目录
,只需要xenoncli mysql rebuildme
,数据库目录就自动重建成功了,并也自动加入了xenon 管理的高可用集群。
全文完。
知数堂精品课程,MySQL实战/优化、SQL优化、Python运维自动化、Elastic实战现已发车。
MySQL课程已全面升级到MySQL 8.0版本,现在上车刚刚好,一起开启MySQL 8.0的修行之旅吧。
加入知数堂
挑战50万+年薪!