xenon搭建

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
1.
2.
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;
1.
2.
配置成主从:(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;
1.
2.
3.
4.
5.
6.
注:这里配置主从复制省略

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';
1.
2.
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;
1.
2.
3.
注:其实这里只需要所有节点安装半同步插件,并不需要启动半同步。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
1.
2.
3.
4.
5.
6.
7.
8.
修改 mysql 环境变量:从其它普通账号复制 .bash* 到mysql 用户家目录(三台机器操作)

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

# visudo
mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip
1.
2.
3.4、配置 hosts 解析
所有机器配置

vim /etc/hosts
10.0.0.150 mysql-150
10.0.0.151 mysql-151
10.0.0.152 mysql-152
1.
2.
3.
4.
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 mysql@10.0.0.151:~/.ssh

[mysql@mysql-150 .ssh]$ scp authorized_keys mysql@10.0.0.152:~/.ssh

# 验证 ssh 信任
[mysql@mysql-150 .ssh]$ ssh mysql@10.0.0.151
[mysql@mysql-150 .ssh]$ ssh mysql@10.0.0.152

能够无密码登陆,就表示成功了
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.
其实配置可以像 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 mysql@10.0.0.150
[mysql@mysql-151 ~]$ ssh-copy-id mysql@10.0.0.152

# 无密码连接测试
[mysql@mysql-151 ~]$ ssh mysql@10.0.0.150
[mysql@mysql-151 ~]$ ssh mysql@10.0.0.152
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
3.5.1、152 配置
[root@mysql-152 ~]# su - mysql

[mysql@mysql-152 ~]$ ssh-copy-id mysql@10.0.0.150
[mysql@mysql-152 ~]$ ssh-copy-id mysql@10.0.0.151

[mysql@mysql-152 ~]$ ssh mysql@10.0.0.150
[mysql@mysql-152 ~]$ ssh mysql@10.0.0.151
1.
2.
3.
4.
5.
6.
7.
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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
1.
2.
3.
4.
5.
6.
7.
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
1.
2.
3.
4.
安装 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/

# 其他节点如上,相同操作
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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"
}
}
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.
55.
56.
57.
58.
其他节点的配置文件修改

把 /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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 &
1.
2.
3.
4.
2. 添加 xenon 节点成员

# 所有节点都要添加节点成员(150,151,152)
./xenoncli cluster add 10.0.0.150:8801,10.0.0.151:8801,10.0.0.152:8801
1.
2.
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 连接没问题
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
4. 查看xenon集群状态信息

 

LEADER 是主库 10.0.0.150
FOLLOWER 是从库 10.0.0.151,10.0.0.152
1.
2.
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这台机器
1.
2.
3.
4.
2、进行模拟故障

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

[mysql@mysql-150 bin]$ mysqladmin -S /tmp/mysql3306.sock -p shutdown

# 查看集群状态信息
[mysql@mysql-150 bin]$ ./xenoncli cluster status
1.
2.
3.
4.
 

 

从上图可知: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 飘到新的主库上
1.
2.
3.
4.
5.
6.
7.
8.
 

 

从上图得知: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
1.
2.
3.
4.
5.
6.
重建成功截图如下

 

# 查看重建后的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
# 如下图
1.
2.
3.
4.
5.
 

 

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

全文完。
-----------------------------------
使用Xenon实现MySQL高可用集群
https://blog.51cto.com/imysql/3182074

posted @ 2022-09-05 16:53  Cetus-Y  阅读(235)  评论(0编辑  收藏  举报