MySQL 9 INNODB Cluster部署
1. InnoDB集群概述
MySQL InnoDB Cluster为MySQL提供了一个完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI,您可以轻松配置和管理一组至少三个MySQL服务器实例,使其作为InnoDB集群运行。
InnoDB集群使用以下MySQL技术:
MySQL Shell是MySQL的高级客户端和代码编辑器。
MySQL服务器和组复制,使一组MySQL实例能够提供高可用性。InnoDB Cluster提供了一种易于使用的编程方式来处理组复制。
MySQL Router,一个轻量级的中间件,在应用程序和InnoDB Cluster之间提供透明的路由。
下图显示了这些技术如何协同工作的概述:
2. 部署规划
本过程演示了使用多台主机部署实例,这些实例分别命名为dbserver01、dbserver02和dbserver03。假设每台主机上都已安装MySQL Serve。
实例 | ip | OS | 描述 |
dbserver01 | 192.168.1.10 | CentOS Stream release 9 | 主节点 |
dbserver02 | 192.168.1.13 | CentOS Stream release 9 | 从节点 |
dbserver03 | 192.168.1.15 | CentOS Stream release 9 | 从节点 |
部署架构图
3. 修改服务器配置
在三台服务器上分别修改服务器名称为dbserver01,dbserver02,dbserver03
hostnamectl set-hostname dbserver01
hostnamectl set-hostname dbserver02
hostnamectl set-hostname dbserver03
在三台服务器上修改
vi /etc/hosts
192.168.1.10 dbserver01
192.168.1.13 dbserver02
192.168.1.15 dbserver03
禁止selinux
vi /etc/sysconfig/selinux
禁止防火墙
systemctl stop firewalld
systemctl disable firewalld
4. 安装mysql
Mysql安装方法有好多种,本案为了实现MGR,采用基于RPM的Linux发行版上安装MySQL,使用下载的Oracle提供RPM包。以下步骤需要在3台服务器上执行。
(1)首先下载mysql-9.4.0-1.el9.x86_64.rpm-bundle.tar, mysql-shell-9.4.0-1.el9.x86_64.rpm, mysql-router-community-9.4.0-1.el9.x86_64.rpm,到本地服务器。
(2)解压安装文件
tar xvf mysql-9.4.0-1.el9.x86_64.rpm-bundle.tar
(3)安装
安装mysql服务及组件
yum install mysql-community-common-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-icu-data-files-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-client-plugins-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-libs-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-client-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-devel-9.4.0-1.el9.x86_64.rpm
yum install mysql-community-server-9.4.0-1.el9.x86_64.rpm
安装mysql-shell
yum install mysql-shell-9.4.0-1.el9.x86_64.rpm
安装mysql-router
yum install mysql-router-community-9.4.0-1.el9.x86_64.rpm
启动数据库
systemctl start mysqld
5. 创建账号
mysql> create user 'mgradmin'@'%' identified by 'c';
mysql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO 'mgradmin'@'%';
mysql> GRANT CONNECTION_ADMIN ON *.* TO mgradmin@'%';
mysql> GRANT all privileges on *.* TO mgradmin@'%' with grant option;
mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO mgradmin@'%';
mysql> flush privileges;
6. 通过 MySQLShell 搭建 MGR
下面步骤每个节点都执行
mysqlsh --mysql -umgradmin -h127.0.0.1 -P 3306 -p
先配置实例.
MYSQL 127.0.0.1:3306 ssl SQL>\js #进入is 运行环境.
检查实例是否满足组复制要求
MySQL 127.0.0.1:3306 ssl JS > dba.checkInstanceConfiguration()
MYSQL 127.0.0.1:3306 ssl SQL JS> dba.configurelnstance();
如果数据库参数不满足复制要求,会自动修改,然后重新启动数据库,所以不用提前配置复制参数。
第一个节点创建集群实例(192.168.1.10)
JS> var cluster= dba.createCluster('TestCluster')
--添加其他节点 192.168.1.13/15,此时会进行数据库克隆,把节点1的数据库复制到其它数据库,同时进行同步。。
MYSQL 127.0.0.1:3306 ssl SQL JS>var cluster=dba.getCluster()
JS >cluster.addInstance('mgradmin@192.168.1.13:3306')
JS>cluster.addInstance('mgradmin@192.168.1.15:3306')
7. MySQLShell集群管理
7.1 集群重新配置.
如果遇到主备库故障导致同步无法进行,则需要重新配置集群。
删除集群元数据.
MYSQL 127.0.0.1:3306 ssl SQL JS>dba.dropMetadataSchema()
检查集群条件。
MYSQL 127.0.0.1:3306 ssl SQL JS>dba.configureInstance();
7.2 查看集群状态。
MYSQL 127.0.0.1:3306 ssl SQL JS> var cluster=dba.getCluster()
MYSQL 127.0.0.1:3306 ssl SQL JS > cluster.status();
8. 配置 MySQLRouter 路由
路由初始化,MySQLRouter主备节点都执行配置(myroute目录提前创建)。
mkdir -p /home/mysql9/myrouter
chown -R mysql.mysql /home/mysql9/myrouter
mysqlrouter --bootstrap mgradmin@127.0.0.1:3306 --directory /home/mysql9/myrouter --conf-use-sockets --user mysql
注意: --directory /home/mysql9/myrouter 这个参数会把路由需要用的配置文件放在这个目录
下。
---启动路由。
cd /home/mysql9/myroute
./start.sh.
生成的 MySQL Router 配置会创建用于连接到群集的 TCP 端口,包括使用经典 MySQL 协议和 X 协议与群集通信的端口,缺省值如下:
6446-对于传统 MySQL协议读写会话,MySQL路由器将传入连接重定向到Primary服务器实例。"
6447-对于传统 MySQL协议只读会话,MySQL路由器将传入连接重定向到其中一个从服务器实例。。
64460-对于X协议读写会话,MySQL路由器将传入连接重定向到Primary服务器实例。。
测试配置
--连接测试:。
mysql -uroot -p -hlocalhost -P6446
--建库。
create database testdb;
--建表,必须要有主键,否则插入失败
use testdb;
create table t1 (id int primary key); #必须有主键
insert into t1 values(1);
其它节点登录
[root@DBSERVER02 myrouter]# mysql -uroot -p -hlocalhost -P6447
mysql> use testdb;
mysql> select * from t1;
数据同步过来。
9. Innodb 集群维护
(1)主机异常重启,导致原主库变成只读模式,原因是 mysqld-auto.cnf里面添加了super read only,解决办法:.
需要启动主库,执行如下命令:。
set persist super read only=off ;.
查看状态:
show variables like '%read%only' ;
重启主机后 MGR 没有启动时解决办法
重启 mgr 即可.
JS >dba.rebootClusterFromCompleteOutage();
(2)MGR 关闭和启动顺序.
集群关闭顺序.
先查看当前主库位置.
mysqlsh--mysql -mgradmin -h 127.0.0.1 -P 3306 -p.
JS > var cluster=dba.getCluster().
JS > cluster.status();
查看所有节点的状态.
SHOW STATUS LIKE 'group_replication %';
把主库设置为只读,避免备库关闭后主库数据改变无法同步
SET GLOBAL read only = ON;
关闭所有备库.
systemctl stop mysqld
或者
mysqladmin -u root -p shutdown.
关闭主库.
systemctl stop mysqld
或者
mysqladmin -u root -p shutdown.
关闭mgr
mgr无需单独关闭,单主备库都关闭时,其进程自动关闭。
数据库集群启动顺序.
先启动所有备库,再启动主库.
systemctl stop mysqld
主库启动后要把只读给关闭:。
SET GLOBAL read only = off;.
(3)启动 mgr
mysqlsh --mysql -mgradmin -h 127.0.0.1 -P 3306 -p
JS>dba.rebootClusterFromCompleteOutage();
JS > var cluster=dba.getCluster().
JS > cluster.status();
(4)启动mysql-router
cd myrouter.
./start.sh.
或者:。
mysqlrouter -c /home/mysql9/myrouter/mysqlrouter.conf.
mysqlrouter--report-host dbserver03 --bootstraproot@localhost
Please enter MysoL password for root: