MySQL Innodb Cluster配置

配置规划

本篇文章中MySQL使用编译安装

主机名 角色 安装软件
348aeb8077a8 主节点 Mysql8.0.30, mysql-shell, mysql-router
7ff037fcf001 从节点 Mysql8.0.30, mysql-shell, mysql-router
fc7b8078d23b 从节点 Mysql8.0.30, mysql-shell, mysql-router

三台实例分别创建’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
4
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz
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协议端口,然后连接的时候指定正确的端口就可以成功>

参考文档:mysql - 如何为 mysql 8 docker 容器启用 x 协议_Stack Overflow中文网

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

1
2
3
4
5
6
7
8
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.30-linux-glibc2.12-x86_64.tar.xz
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.4,此时会进行数据库克隆,
#把节点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
#创建路由数据目录
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;

故障测试

手动HA

1
2
cluster.setPrimaryInstance('mingliang 192.168.3.3:3306')

关闭和重启集群

关闭的时候必须先关闭2个slave节点,然后再关闭master节点,重启也是一样

然后在master节点使用mysqlshell连接mysql然后重启集群

1
dba.rebootClusterFromCompleteOutage()