InnoDB Cluster部署
部署一个MySQL 8.0.25 InnoDB Cluster集群
InnoDB Cluster集群简介
![InnoDB Cluster架构](InnoDB Cluster架构.jpg)
环境信息
准备三台虚拟机
服务器1 | 服务器2 | 服务器3 | 端口 | |
---|---|---|---|---|
操作系统 | CentOS7 | CentOS7 | CentOS7 | / |
IP | 192.168.165.156 | 192.168.165.157 | 192.168.165.225 | / |
主机名 | db156 | db156 | db225 | / |
MySQL Server 8.0.25 | MGR 节点一 | MGR 节点二 | MGR 节点三 | 3306 |
MySQL Shell 8.0.25 | MySQL Shell节点一 | MySQL Shell节点二 | MySQL Shell节点三 | / |
MySQL Router 8.0.25 | MySQL Router节点一 | MySQL Router节点二 | MySQL Router节点三 | 6446(写)、6447(读) |
部署说明
安装顺序
安装MySQL Server—>启用组复制—>安装MySQL Shell —> 创建InnoDB Cluster集群—> 安装MySQL Router
安装包
安装包名 | MD5值 | 下载连接 |
---|---|---|
mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz | a12142a969531cebd845844620bb44a4 | https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz |
mysql-shell-8.0.25-linux-glibc2.12-x86-64bit.tar.gz | 9192ea694ac97a5c5715806ddcf84932 | https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.25-linux-glibc2.12-x86-32bit.tar.gz |
mysql-router-8.0.25-linux-glibc2.12-x86_64.tar.xz | bcd9b81f422667dbabd0a5d7bbf7638a | https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.25-linux-glibc2.12-x86_64.tar.xz |
安装MySQL Server
安装依赖包
创建相关用户
1 | [root@db156 ~]# groupadd mysql && useradd -r -g mysql -s /bin/false mysql |
下载并解压安装包
1 | [root@db156 opt]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz |
创建相关目录
1 | [root@db156 opt]# mkdir -p /data/mysql/{data,binlog,relay} |
准备配置文件
1 | [mysqld] |
初始化MySQL Server
1 | [root@db156 opt]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure |
配置启动文件并启动MySQL
1 | [root@db156 opt]# vi /usr/lib/systemd/system/mysqld.service |
在执行systemctl start mysqld
如果报错Failed to start mysqld.service: Unit not found.
,可以执行systemctl daemon-reload
解决。
修改本地账号密码并设置不过期
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -e "SET SQL_LOG_BIN=0;SET global super_read_only=OFF; SET global read_only=OFF; alter user 'root'@'localhost' password expire never; set password for 'root'@'localhost'='123456';flush privileges; SET SQL_LOG_BIN=1;" |
创建复制账号并授权
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
创建管理账号并授权
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
安装组复制插件
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
设置复制通道
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
查看MySQL进程
1 | [root@db156 opt]# ps -ef | grep mysql |
说明:其他两个节点也按照以上步骤部署
启用MGR组复制
三个MySQL Server实例部署完成之后,就可以启用组复制了。
对于组复制,数据必须存储在InnoDB事务存储引擎中,使用其他存储引擎(包括临时 MEMORY存储引擎)可能会导致组复制中的错误。disabled_storage_engines 如下设置 系统变量以防止其使用:
disabled_storage_engines=”MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY”
修改配置文件,添加上面的配置并重启即可:
1 | [root@db156 opt]# vi /etc/my.cnf |
首次启动组复制的过程称为引导,,可以使用group_replication_bootstrap_group系统变量来引导组,且只能在一个实例上执行并只能执行一次。
我们选择节点一上执行:
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
节点二及节点三:
1 | [root@db225 opt]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -p |
在将其他节点添加至复制组时,如果报一下错误:
1 | mysql> START GROUP_REPLICATION USER='repl', PASSWORD='123456'; |
查看到日志如下:
1 | 2021-06-10T10:42:54.535154Z 10 [System] [MY-010597] [Repl] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_applier' executed'. Previous state master_host='', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. |
则在该节点上执行reset master
可以解决。
查看组复制状态(任何一个实例均可查询):
1 | mysql> select * FROM performance_schema.replication_group_members; |
至此,MGR三节点的组复制搭建完成。
安装MySQL Shell
安装过程如下:
1 | [root@db156 opt]# tar -xf mysql-shell-8.0.25-linux-glibc2.12-x86-64bit.tar.gz |
三个节点均执行以上步骤安装。
创建InnoDB Cluster集群
通过mysqlsh命令使用安装MySQL Server时创建的管理账号连接到MySQL 实例,执行dba.createCluster()
创建集群,并过过dba.getCluster("testCluster").status()
查看集群状态:
1 | [root@db225 opt]# mysqlsh icadmin@192.168.165.156:3306 |
其中:
- “status”: “OK” 表示集群状态是正常的
- “topologyMode”: “Single-Primary” 表示是单主模式
- “mode”: “R/W” 表示可读可写
- “mode”: “R/O” 表示只读
安装MySQL Router
安装:
1 | [root@db156 opt]# tar -xf mysql-router-8.0.25-linux-glibc2.12-x86_64.tar.xz |
bootstrap引导:
1 | [root@db156 opt]# /usr/local/mysqlrouter/bin/mysqlrouter --bootstrap icadmin@192.168.165.156:3306 --directory /data/mysqlrouter --conf-use-sockets --user=mysql --name=mysql_router_13306 --conf-bind-address=192.168.165.156 --account-host="192.168.165.%" |
引导成功后会在/data/mysqlrouter目录下生成所需的数据文件,目录结构如下:
1 | [root@db156 opt]# tree /data/mysqlrouter/ |
生成的MySQL Router配置文件如下:
1 | [root@db156 opt]# cat /data/mysqlrouter/mysqlrouter.conf |
启动MySQL路由:
1 | [root@db156 opt]# bash /data/mysqlrouter/start.sh 2>&1 > /dev/null & |
读写分离测试:使用不同的端口
1 | [root@db156 opt]# /usr/local/mysql/bin/mysql -uicadmin -p -h 192.168.165.156 -P 6446 |
可以看到使用读写端口6446时连接的是主节点,而使用只读端口6447连接时是在两个从节点之间切换操作。