MySQL InnoDB Cluster 高可用集群部署与应用实践(下)
MySQL InnoDB Cluster 高可用集群部署与应用实践(上)-CSDN博客https://blog.csdn.net/xiaochenXIHUA/article/details/153044212?spm=1001.2014.3001.5501
一、安装部署MySQL Router并测试
1.1、安装与配置MySQL Router
MySQL :: MySQL Router 8.0https://dev.mysql.com/doc/mysql-router/8.0/en/
#安装与配置MySQL Router路由的实战流程(需要在每个mysql服务器上都安装)#1-下载mysql router的二进制安装包到/data并解压到/usr/local/mysqlrouter目录下修改名称为mysql-router-8.4.6
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.4.6-linux-glibc2.28-x86_64.tar.xz -c o -P /datamkdir -p /usr/local/mysqlroutercd /datatar -xvf mysql-router-8.4.6-linux-glibc2.28-x86_64.tar.xz -C /usr/local/mysqlrouter/cd /usr/local/mysqlrouter/mv mysql-router-8.4.6-linux-glibc2.28-x86_64 mysql-router-8.4.6cd mysql-router-8.4.6/mkdir myrouterchown -R mysql:mysql /usr/local/mysqlrouter#2-切换到mysql用户下,配置mysqlrouter在mysql用户下全局可用
su - mysql
vi /home/mysql/.bashrc
#添加内容【/usr/local/mysqlrouter/mysql-router-8.4.6/bin】该文件的完整内容是
export PATH=/usr/local/mysql-shell/mysql-shell-8.4.6/bin:/usr/local/mysqlrouter/mysql-router-8.4.6/bin:$PATH
#让修改的环境生效
source ~/.bashrc#3-在mysql用户下初始化所有的mysql节点(主备节点都需要执行)
#注意:当我们初始化时若提示“Error: The provided server is currently not an ONLINE member of a InnoDB cluster.”错误则需要到mysqlsh配置的主节点(192.168.1.40)重启MGR集群,并查看MGR集群状态是否正常
mysqlrouter --bootstrap ckadmin@127.0.0.1:13337 --directory /usr/local/mysqlrouter/mysql-router-8.4.6/myrouter --conf-use-sockets --user mysql#3.1-只在MGR集群的主库(192.168.1.40)切换到mysql用户下使用mysqlsh登录mysql查看MGR集群并重启MGR集群
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
\js
dba.configureInstance();
#若执行获取MGR集群时报51314错误则需要重启MGR集群
var cluster=dba.getCluster()
#重启MGR集群
dba.rebootClusterFromCompleteOutage()
#集群重启成功后再次查看MGR集群状态
var cluster=dba.getCluster()
cluster.status();#3.2-查看MGR集群状态成功后退出【按下Ctrl+d】,并切换到mysql用户下重新初始化mysqlrouter
mysqlrouter --bootstrap ckadmin@127.0.0.1:13337 --directory /usr/local/mysqlrouter/mysql-router-8.4.6/myrouter --conf-use-sockets --user mysql
注意:当我们查看MGR集群状态时显示“Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance belongs to that metadata, but GR is not active) (MYSQLSH 51314)”错误时,需要重启集群,重启集群命令是【dba.rebootClusterFromCompleteOutage()】
1.2、启动并MySQL Router
#启动并测试MySQL Router路由实操流程(每个mysql节点都需要执行如下操作)#1-进入mysql router路由的配置目录
cd /usr/local/mysqlrouter/mysql-router-8.4.6/myrouter/#2-启动mysql router
./start.sh #3-查看当前mysql router占用的网络端口信息
netstat -antlp | grep mysqlrouter
序号 | mysqlrouter占用端口 | 说明 |
1 | 6446 | 对应传统 MySQL协议读写会话,MySQL路由器将传入连接重定向到Primary服务器实例 |
2 | 6447 | 对应传统MySQL协议只读会话,MySQL路由器将传入连接重定向到其中一个从服务 器实例。实现读负载均衡。 |
3 | 6448 | 对应X协议读写会话,MySQL路由器将传入连接重定向到Primary服务器实例。 |
4 | 6449 | 对应X协议只读会话,MySQL路由器将传入连接重定向到其中一个从服务器实例。实现读负载均衡。 |
5 | 6450 | 对应传统MySQL协议只读会话,MySQL路由器将传入连接重定向到主或者从服务 器实例,实现读写分离和读负载均衡。 |
1.3、测试MySQL Router
1.3.1、复制同步测试
选择任意一个客户端(192.168.1.9)或者程序连接mysql集群任意一个节点(如:192.168.1.42)访问6450端口后,执行写操作会自动调度到主节点,数据写入完成后,看看从库是否实现自动同步。
#我们在192.168.1.9的mysql客户端连接MGR集群中的任意节点(如:192.168.1.42)#1-进入192.168.1.9的mysql客户端路径开启连接MGR的(192.168.1.42)创建ckdb数据库及其在该数据库下创建cktest表和给该表插入一条数据
cd /usr/local/mysql/mysql-8.4.6/bin
./mysql -h 192.168.1.42 -P 6450 -u ckadmin -pshow databases;
create database ckdb;
show databases;
use ckdb;
show tables;
create table cktest(id int not null primary key auto_increment,name nvarchar(12) not null,sex int not null);
insert into cktest(name,sex)values("张三",1);
select * from cktest;#2-分别在MGR的主节点(192.168.1.40)和从节点(192.168.1.41)使用root用户登录查看是否有刚创建的ckdb数据库和cktest表和查看cktest表的数据【有该数据库则表示复制同步正常】
cd /usr/local/mysql/mysql-8.4.6/bin
./mysql -uroot -p
show databases;
use ckdb;
show tables;
select * from cktest;
注意:若在任意客户端(如:192.168.1.9)连接MGR集群中的任意节点(如:192.168.1.42)时显示“ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.42:6450' (113)”错误,则我们需要检查192.168.1.42的防火应该是没有关闭,则需要放开6450端口。
#若Linux的防火墙是开启的则需要将对应的端口永久放开(如:这里永久放开6446、6447、6540端口)
firewall-cmd --zone=public --add-port=6446/tcp --permanent
firewall-cmd --zone=public --add-port=6447/tcp --permanent
firewall-cmd --zone=public --add-port=6450/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port
1.3.2、读写分离与负载均衡测试
《1》选择任意一个客户端(192.168.1.9)或者程序连接mysql集群任意一个节点(如:192.168.1.42)访问6447端口(只读)后,看是否可以创建数据库、表等操作,不能创建则表示正常;而刚才主从复制同步测试使用的6450端口则是读写分离可以创建数据库、表等操作。
《2》选择任意一个客户端(192.168.1.9)或者程序连接mysql集群任意一个节点(如:192.168.1.42)访问6447端口(只读)后查看当前的主机名称;然后在退出重新登录后再次查看当前的主机名称;可以发现每次登录显示的主机名称是不一样的则体现了负载均衡。
1.3.3、故障转移测试
我们使用mysqlsh登录MGR的任意从库(192.168.1.41或192.168.1.42)上查看当前MGR集群的状态信息,我们可以观察MGR集群的主节点会发生改变(比如:我们将主库的mysql服务停止后再次去查看MGR集群的状态可以发现主库在MGR集群中已经下线,且从库会自动转为主库),详细操作如下所示:
#测试MGR集群故障转移实操流程#1-使用mysqlsh工具登录任意MGR从库查看当前集群状态
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
\js
var cluster=dba.getCluster()
cluster.status();#2-到MGR主库上切换到root用户停止mysql服务来模拟故障
systemctl stop mysqld.service
systemctl status mysqld.service#3-回到刚才使用mysqlsh工具登录到的MGR从库再次查看当前集群状态(此时MGR集群中mysql-master(192.168.1.40y)自动切换为从库且下线,而另外的从库mysql-slave1(192.168.1.41)已经切换为主库)
var cluster=dba.getCluster()
cluster.status();#若要将离线的mysql-master重新加入MGR集群,则只用重启该mysql服务即可(注意:即使该离线的mysql-master节点重新加入后也不会切换为主库了)
systemctl start mysqld.service
二、InnoDB Cluster集群维护
2.1、InnoDB Cluster集群的基础操作
#InnoDB Cluster集群的基础操作(注意:以下操作都是在脚本模式【\js】下执行)#1-查看集群状态
var cluster = dba.getCluster('mysqlcluster');
cluster.status();#2-显示集群结构
cluster.describe();#3-显示集群配置选项
cluster.options();#4-移除集群成员
cluster.removeInstance('ckadmin@192.168.1.42:13337');
cluster.status();#5-添加集群成员(注意:若添加集群成员提示:Cluster.addInstance: error uninstalling plugin 'clone': mysql02:3306: Plugin 'clone' is force_plus_permanent and can not be unloaded (RuntimeError)则将三个节点中的MySQL配置文件中clone=FORCE_PLUS_PERMANENT注释掉,然后重启MySQL即可)
cluster.addInstance('ckadmin@192.168.1.42:13337');
cluster.status();#6-手动切换主节点
cluster.setPrimaryInstance('ckadmin@192.168.1.40:13337');
cluster.status();#6.1再次切换主节点
cluster.setPrimaryInstance('ckadmin@192.168.1.41:13337');
cluster.status();#7-切换成多主模式
cluster.switchToMultiPrimaryMode();
cluster.status();#8-切换成单主模式
cluster.switchToSinglePrimaryMode('ckadmin@192.168.1.40:13337');
cluster.status();#9-列出和集群相关的Router实例
var cluster = dba.getCluster();
cluster.listRouters();
#InnoDB Cluster集群的基础操作(注意:以下操作都是在脚本模式【\sql】下执行)#1-显示复制统计信息
SELECT * FROM performance_schema.replication_group_member_stats\G;#2-关闭组复制
STOP GROUP_REPLICATION;#3-启动组复制
START GROUP_REPLICATION;#4-查询元数据表
SELECT * FROM performance_schema.replication_group_members\G;
2.2、InnoDB Cluster集群异常解决
《1》原主库变成只读模式,原因是mysqld-auto.cnf里面添加了super read only,解决办法: 需要启动主库,执行如下命令:" set persist super read only=off ;. 查看状态:
#查看mysql节点的只读状态
show variables like '%read%only';
《2》InnoDB Cluster集群的所有主机都关机后,再次重启后,InnoDB Cluster集群并没有启动,则需要使用mysqlsh命令登录主库节点后重启集群
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
\js
dba.configureInstance();
#若执行获取MGR集群时报51314错误则需要重启MGR集群
var cluster=dba.getCluster()
#重启MGR集群
dba.rebootClusterFromCompleteOutage()
#集群重启成功后再次查看MGR集群状态
var cluster=dba.getCluster()
cluster.status();
2.3、InnoDB Cluster集群的关闭顺序
#InnoDB Cluster集群的关闭顺序#1-先查看集群的状态
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
\js
var cluster=dba.getCluster()
cluster.status();#2-把主库设置为只读(主要是为了避免备库关闭后,主库数据改变无法同步)
\sql
SET GLOBAL read_only = ON;
SHOW VARIABLES LIKE 'read_only';#3-关闭所有备库
systemctl stop mysqld#4-关闭主库
systemctl stop mysqld
2.4、InnoDB Cluster集群的启动顺序
#InnoDB Cluster集群的启动顺序#1-先启动所有备库,再启动主库
systemctl start mysqld
systemctl status mysqld#2-【主库启动后,要把只读给关闭】
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
SET GLOBAL read_only = off;#3-只用在主库上启动 MGR 集群即可
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p
\js
dba.rebootClusterFromCompleteOutage();
var cluster=dba.getCluster();
cluster.status();#4-启动 mysqlroute
cd /usr/local/mysqlrouter/mysql-router-8.4.6/myrouter/
./start.sh
#4.1-也可以直接使用如下命令直接启动mysqlrouter
mysqlrouter -c /usr/local/mysqlrouter/mysql-router-8.4.6/myrouter/mysqlrouter.conf#5-查看读写分离路由端口配置情况
mysqlrouter --report-host mysql-master --bootstrap root@localhost:13337
2.5、InnoDB Cluster集群的重新配置
如果遇到主备库故障导致同步无法进行,则需要重新配置集群:
#-InnoDB Cluster集群的重新配置流程#0-切换到mysql用户使用mysqlshell工具登录各个mysql节点
su - mysql
mysqlsh --mysql -h 127.0.0.1 -P 13337 -uckadmin -p#1-在【主库】上使用mysqlsh登录后删除已有集群元数据
\js
dba.dropMetadataSchema();#2-检查集群条件,在每个集群节点执行一遍(若有报告显示不满足MGR集群要求的则统一输入y自动配置符合要求)
dba.configureInstance();3-创建集群(默认为单主模式,且第一个加入的为写节点,在第一个节点创建集群实例(192.168.1.40))
var cluster= dba.createCluster('mysql8.4.6cluster')#4-查看MGR集群状态并添加节点(添加其他节点 192.168.1.41/42,此时会进行数据库克隆,把节点1的数据库复制到其它数据库,同时进行同步)
var cluster=dba.getCluster();
cluster.status();
cluster.addInstance('ckadmin@192.168.1.41:13337')
cluster.addInstance('ckadmin@192.168.1.42:13337')#5-查看集群状态
var cluster=dba.getCluster();
cluster.status();
三、其他资料
MySQL :: MySQL Shell 8.0 :: 7 MySQL InnoDB Clusterhttps://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html