MySQL Innodb Cluster配置

配置规划

本篇文章中MySQL服务采用编译安装

ip地址 主机名 角色 安装软件
192.168.3.2 348aeb8077a8 主(初始化) Mysql8.0.30
mysql-shell
mysql-route
192.168.3.2 7ff037fcf001 备(初始化) Mysql8.0.30
mysql-shell
mysql-route
192.168.3.4 fc7b8078d23b 备(初始化) Mysql8.0.30
mysql-shell
mysql-route

三台主机分别创建‘mingliang‘@’%’ 用户并授权

1
2
create user 'mingliang'@'%' identified with mysql_native_password by '123456';
grant all on *.* to 'mingliang'@'%' with grant option;

安装mysql shell(三台机器必须全部安装)

1
2
3
tar -xzvf mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-shell-8.0.30-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
chown mysql8:mysql8 -R /usr/local/mysqlsh

在mysql8用户中配置环境变量

1
2
3
4
5
6
7
su - mysql8
vim .bash_profile /添加下述内容

export PATH=$MYSQL_HOME/bin:/usr/local/mysqlsh/bin:$PATH

#使文件生效
source .bash_profile

使用mysql shell登录测试

1
mysqlsh --mysqlx -h 192.168.3.2 -P 33060 -umingliang -p

这里登录测试的时候出现了一个这样的错误

MySQL Error 2027: Requested session assumes MySQL X Protocol but ‘192.168.3.2:3306’ seems to speak the classic MySQL protocol (Unexpected response received from server, msg-id:10)

这个是因为上面连接的时候X协议的端口没有指定正确,可以使用mysql -u root -p -e “select @@mysqlx_port”查看X协议端口,然后连接的时候指定正确的端口就可以成功登录了

参考文档:https://stackoverflow.org.cn/questions/64326446

安装mysql router(三台主机必须全部安装)

1
2
3
4
5
6
7
tar -xvf mysql-router-8.0.30-linux-glibc2.12-x86_64.tar.xz

#没有xz的话需要安装下
yum install -y xz

mv mysql-router-8.0.30-linux-glibc2.12-x86_64 /usr/local/mysqlrouter
chown mysql8:mysql8 /usr/local/mysqlrouter

在MySQL8用户中配置环境变量

1
2
3
4
5
6
7
su - mysql8
vim .bash_profile /添加下述内容

export PATH=$MYSQL_HOME/bin:/usr/local/mysqlsh/bin:/usr/local/mysqlrouter/bin:$PATH

#使文件生效
source .bash_profile

通过MySQLShell搭建MGR,下面步骤每个节点都执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#192.168.3.2 root@348aeb8077a8  master
su - mysql8
mysqlsh --mysqlx -h 192.168.3.2 -P33060 -umingliang -p
dba.configureInstance();
dba.configureInstance();

#192.168.3.3 root@7ff037fcf001 slave1
su - mysql8
mysqlsh --mysqlx -h 192.168.3.3 -P33060 -umingliang -p
dba.configureInstance();
dba.configureInstance();

#192.168.3.4 root@fc7b8078d23b slave2
su - mysql8
mysqlsh --mysqlx -h 192.168.3.4 -P33060 -umingliang -p
dba.configureInstance();
dba.configureInstance();

创建集群实例(在master执行即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#默认为单主模式,第一个加入为写节点
#---第一个节点创建集群实例(192.168.3.2)

var cluster = dba.createCluster('DemoCluster')

#添加其他节点192.168.3.3和192.168.3.3,此时会进行数据库克隆,
#把节点1的数据库复制到其它数据库,同时进行同步。

var cluster=dba.getCluster()
cluster.addInstance('mingliang@192.168.3.3:3306')
cluster.addInstance('mingliang@192.168.3.4:3306')

#查看集群状态
var cluster=dba.getCluster()
cluster.status();

这里由于3个节点的UUID相同导致,添加集群节点的没有添加进去

Cluster.addInstance: Cannot add an instance with the same server UUID (1d6dd7c2-5ff7-11f0-bb22-0242c0a80302) of an active member of the cluster ‘348aeb8077a8:3306’. Please change the UUID of the instance to add, all members must have a unique server UUID. (RuntimeError)

更新uuid后,master节点执行了克隆恢复,但是发现一直处于* Waiting for server restart… 状态,直至超时,去slave查看error.log发现发生了crash,导致启动失败

最后重新配置了一次,在添加节点恢复的时候选择了增量恢复后,成功添加

#添加slave1

#添加slave2

配置MySQLRouter路由

1
2
3
4
5
6
7
8
9
10
11
#创建路由文件
su - mysql8
mkdir myroyter


#路由初始化
#master
mysqlrouter --bootstrap mingliang@172.0.0.1:3306 --directory /home/mysql8/myrouter --conf-use-sockets --user mysql8

#启动路由
.myrouter/star.sh

测试配置

连接测试

1
mysql -u mingliang -p -P6446

数据同步测试

1
create database demo1;

故障测试

主备切换

1
cluster.setPrimaryInstance('192.168.3.2:3306')

关闭集群

1
2
3
#先关闭2个从节点,然后在关闭主节点

#Mgr无需单独关闭,单主备库都关闭时,其进程自动关闭

重启集群

1
2
3
4
#先启动2个从节点,然后再启动主节点

#启动mgr
dba.rebootClusterFromCompleteOutage()