vlambda博客
学习文章列表

使用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 主从复制搭建

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

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

set global super_only=1;
set global read_only=1;
  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、系统配置

  1. 修改三台主机的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
  1. 修改 mysql 环境变量:从其它普通账号复制 .bash* 到mysql 用户家目录(三台机器操作)

shell# mkdir /home/mysql
shell# cp /root/.bash* /home/mysql/
shell# chown -R mysql:mysql /home/mysql
  1. 添加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 为安装为例

  1. 安装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
  1. 安装 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集群状态信息

使用Xenon 实现MySQL高可用集群

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


使用Xenon 实现MySQL高可用集群

从上图可知: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 飘到新的主库上


使用Xenon 实现MySQL高可用集群

从上图得知: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

重建成功截图如下

使用Xenon 实现MySQL高可用集群

# 查看重建后的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
# 如下图


使用Xenon 实现MySQL高可用集群

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

全文完。

使用Xenon 实现MySQL高可用集群知数堂推荐搜索
MySQL 8
InnoDB
索引
负载高
写入慢
排查思路





知数堂精品课程,MySQL实战/优化、SQL优化、Python运维自动化、Elastic实战现已发车。

MySQL课程已全面升级到MySQL 8.0版本,现在上车刚刚好,一起开启MySQL 8.0的修行之旅吧。

使用Xenon 实现MySQL高可用集群

加入知数堂

挑战50万+年薪!



扫码入群了解课程详情吧,有助教妹子在等着哟