首页 > 数据库 >使用Xenon实现MySQL高可用集群

使用Xenon实现MySQL高可用集群

时间:2022-11-25 12:03:20浏览次数:45  
标签:10.0 152 150 xenon 集群 ssh Xenon mysql MySQL


使用Xenon实现MySQL高可用集群

1、Xenon 介绍

使用Xenon实现MySQL高可用集群_git

 

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高可用集群_git_02

使用Xenon实现MySQL高可用集群_数据库_03

使用Xenon实现MySQL高可用集群_数据库_03

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高可用集群_mysql_05

使用Xenon实现MySQL高可用集群_git_06

从上图可知: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高可用集群_数据库_07

使用Xenon实现MySQL高可用集群_mysql_08

使用Xenon实现MySQL高可用集群_数据库_07

从上图得知: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高可用集群_数据库_10

使用Xenon实现MySQL高可用集群_数据库_11

使用Xenon实现MySQL高可用集群_数据库_11

# 查看重建后的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高可用集群_git_13

使用Xenon实现MySQL高可用集群_git_14

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

 

 

标签:10.0,152,150,xenon,集群,ssh,Xenon,mysql,MySQL
From: https://blog.51cto.com/u_13940603/5886224

相关文章

  • mysql商品评论表
    CREATEDATABASEshop;USEshop;CREATETABLEsh_goods(idINTUNSIGNEDPRIMARYKEYAUTO_INCREMENTCOMMENT'商品id',category_idINTUNSIGNEDNOTNULLDEFAULT0......
  • 第13节-MySQL事件调度器
    14.1、事件调度器使用场景数据库管理是一项重要且烦琐的工作,许多日常管理任务往往会频繁地﹑周期性地执行,例如定期维护索引﹑定时刷新数据﹑定时关闭帐户﹑定义打开或关闭数据库......
  • 【Mysql】 linux | mysql | 配置日志路径 | 关闭binlog
    一、说明        1、linux环境       2、操作数据库,一定要慎重;尤其是涉及到配置,搞不好数据就丢了,备份,备份,备份。二、日常维护1、配置错误日志路径1)mysql重......
  • 【MySQL】mysql | 时间函数 | 时间戳 | 日期转时间戳
    一、说明        1、where条件需要加入mysql的运算函数        2、留存日常使用二、函数1、日期转时间戳1)函数SELECTUNIX_TIMESTAMP(NOW());说明1:时间戳......
  • 【MySQL】mysql | 数据处理 | 行转列 | 一种行转列的处理思路
    一、说明        1、mysql数据库        2、行转列场景,对于不同行业来说,使用频率不一样        3、本文档仅提供一种行转列的思路,仅做参考二、开始......
  • 使用DBeaver链接PostgreSQL(MySQL)显示所有数据库
             ......
  • CentOS7.9 MySQL5.1 安装
    1.下载相关mysql源码包wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-5.1.63-linux-x86_64-glibc23.tar.gz2.安装相关依赖包yuminstallbisongcc......
  • mysql表、数据库快速复制
    停止mysql服务ALTERTABLEtable_nameDISCARDTABLESPACE;将原数据库的\mysql-8.0.25-winx64\data\中的ibd文件复制到对应数据库中,ALTERTABLEtable_nameIMPORTTABL......
  • MySQL进阶实战3,mysql索引详解,上篇
    一、索引索引是存储引擎用于快速查找记录的一种数据结构。我觉得数据库中最重要的知识点,就是索引。存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如MyI......
  • K8S 集群架构
    K8S集群架构 master主节点,控制平台,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节点来提高集群可用度worker工作节点,可以是虚拟机或物理计算机,任务都在这......