MySQL8 InnoDB 集群

MySQL8 InnoDB 集群,MySQL8教程,介绍 MySQL8 InnoDB 集群和示例等。

【全栈教程】:https://try8.cn/article
教程目录:
教程内容:
最近更新:2023-04-17

一、MySQL8 InnoDB 集群介绍

MySQL InnoDB Cluster 为 MySQL 提供了完整的高可用解决方案,通过集成API,您可以轻松的配置和管理一组集群。MySQL8 InnoDB 集群不依赖外部工具,可以解决数据一致性、故障监测与恢复、读写分离、负载均衡等问题。


1.1、InnoDB 集群要求

  • 服务器实例的服务器ID必须唯一;
  • 服务器实例需要相同的版本和环境;
  • 服务器实例必须采用 InnoDB 和开启性能模式。


1.2、InnoDB 集群限制

  • 服务器实例不支持手动配置异步复制通道;
  • 推荐局域网使用,广域网要求网络稳定且低延迟;
  • 仅支持TCP/IP或 MySQL 协议连接集群中的服务器实例。


1.3、InnoDB 集群账号

InnoDB 集群服务器使用三种类型的账号,同一类型的每个账号必须使用相同的用户名和密码。

  • 服务器配置账号:创建和配置集群服务器,每个集群服务器只有一个该账号;
  • 管理员账号:管理集群服务器,每个集群服务器可以设置多个该账号;
  • 路由器账号:用于连接到 InnoDB Cluster 中的服务器实例,每个集群服务器可以设置多个该账号。


二、MySQL8 InnoDB 集群服务

MySQL8 InnoDB 集群主要由 MySQL Shell、MySQL Router 和 MySQL Servers 三部分组成,三者协同工作,共同为 MySQL 提供完整的高可用解决方案。本教程采用生产环境实战,您需要准备好至少五台虚拟机或云服务器作为集群实例使用。

  • MySQL Shell:用于管理和配置集群,建议至少 1 台;
  • MySQL Router:业务流量入口,用于流量对外转发,建议至少 1 台;
  • MySQL Servers:用于服务器集群节点,建议至少 3 台。


三、MySQL8 InnoDB 集群实战

我们准备五台全新环境的虚拟机用于本次集群实战,MySQL Shell 和 MySQL Router 各一台,MySQL Servers 用三台。其中 MySQL Servers 服务器推荐软硬件配置一致,否则集群的性能由最低配决定。

  • 192.168.80.80:搭建 MySQL Shell;
  • 192.168.80.10:搭建 MySQL Router;
  • 192.168.80.11:搭建 MySQL Servers;
  • 192.168.80.12:搭建 MySQL Servers;
  • 192.168.80.13:搭建 MySQL Servers。


修改五台服务器的主机IP解析记录,添加如下:

vim /etc/hosts
192.168.80.80 debx
192.168.80.10 deb0
192.168.80.11 deb1
192.168.80.12 deb2
192.168.80.13 deb3


小提示:您还可能需要禁用或设置防火墙、SELinux 等,在与本实战不相关的其它内容一律采用默认的数据库配置。


3.1、MySQL Servers 搭建

我们选择在 192.168.80.12、192.168.80.11、192.168.80.11 安装 MySQL Servers ,三台安装步骤一致。

# 创建文件夹用于下载
mkdir -p /data/project && cd /data/project
# 下载指定版本
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
dpkg -i mysql-apt-config_0.8.24-1_all.deb
# 更新索引
apt update -y
# 开始安装
apt install mysql-server -y
# 查看状态
systemctl status mysql


设置默认管理员账号支持局域网内登录:

mysql -uroot -p
use mysql;
# 内部管理账号
update user set Host='192.168.80.%' where User = 'root';
grant clone_admin, connection_admin, group_replication_admin, persist_ro_variables_admin, replication_applier, replication_slave_admin, role_admin, system_variables_admin on *.* to 'root'@'192.168.80.%' with grant option;
flush privileges;


小提示:关于 MySQL Servers 实例数量,官方推荐 3-9 台为佳,过多过少会影响服务性能和可用性。


3.2、MySQL Shell 搭建

首先,我们选择在 192.168.80.80 上安装 MySQL Shell ,用于管理 MySQL Servers。

# 创建文件夹用于下载
mkdir -p /data/project && cd /data/project
# 下载指定版本
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
dpkg -i mysql-apt-config_0.8.24-1_all.deb
# 更新索引
apt update -y
# 开始安装
apt install mysql-shell -y
# 进入控制台
mysqlsh
# 退出控制台
\q


然后,依次连接,并为 MySQL Servers 设置默认值:

# 第 1 个示例:
mysqlsh -hdeb1 -P3306 -uroot -p
dba.configureInstance();
\q
# 第 2 个示例:
mysqlsh -hdeb2 -P3306 -uroot -p
dba.configureInstance();
\q
# 第 3 个示例:
mysqlsh -hdeb3 -P3306 -uroot -p
dba.configureInstance();
\q


返回 MySQL Shell,检测已安装的 MySQL Servers 是否符合集群标准:

# 进入控制台
mysqlsh
# 依次检测是否符合标准
dba.checkInstanceConfiguration('root@deb1:3306')
dba.checkInstanceConfiguration('root@deb2:3306')
dba.checkInstanceConfiguration('root@deb3:3306')


最后,检测没有问题之后,我们需要使用管理命令创建服务器集群:

# 在第一个节点执行,或任选一个
mysqlsh -hdeb1 -P3306 -uroot -p
# 使用主-主模式,主-从模式需修改该参数为 false
var cluster = dba.createCluster('try8Cluster',{multiPrimary: true})
# 添加更多集群
cluster.addInstance('root@deb2:3306');
cluster.addInstance('root@deb3:3306');
# 查看状态
cluster.status();
# 创建路由账号名:try8,由 MySQL Router 使用
cluster.setupRouterAccount('try8');
# 退出控制台
\q


小提示:一旦实例属于一个集群,就只能使用 MySQL Shell 和 AdminAPI 管理,不支持手动更改配置。在该示例中,我们使用主-主模式,全部可读可写、数据自动同步,您也可以通过更改参数实现一主多从。


MySQL8 数据库主-主集群模式:

  • 三个服务器实例节点均可读可写,所有的数据全部保持强一致性;
  • 三个服务器实例节点只有同时故障,集群才会停止服务;
  • 任一服务器节点故障恢复后,会自动同步和恢复数据;
  • 新增服务器节点,自动同步数据提供服务。


3.3、MySQL Router 搭建

首先,在 192.168.80.10 上安装 MySQL Router ,推荐与应用(如 PHP / JAVA / PYTHON 等)位于同一主机。

# 创建文件夹用于下载
mkdir -p /data/project && cd /data/project
# 下载指定版本
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
dpkg -i mysql-apt-config_0.8.24-1_all.deb
# 更新索引
apt update -y
# 开始安装
apt install mysql-router -y
# 查看状态
systemctl status mysqlrouter


然后,建立路由连接到三个 MySQL Servers:

# 在第一个节点执行,或任选一个
mysqlrouter --bootstrap root@deb1:3306 --account=try8 --user=root
# 重启服务
systemctl restart mysqlrouter


最后,返回 MySQL Shell, 执行以下命令查看集群相关的状态:

# 进入 MySQL Shell 控制台
mysqlsh -hdeb1 -P3306 -uroot -p
# 定义JS对象,查看指定集群
var cluster = dba.getCluster('try8Cluster');
# 查看集群被哪些路由连接
cluster.listRouters();
# 查看集群的详细信息
cluster.describe();
# 查看集群状态
cluster.status();


四、MySQL8 InnoDB 集群测试

按照上述步骤,十分钟不到便可以完成全部集群的建设,这是因为为了帮助大家快速入门,很多都是采用默认的数据库配置,当然最主要还是因为满满的干货没有任何废话。紧接着我们可以做一些简单测试,来检验整体的高可用是否有效。


4.1、检测集群一致性

检测 MySQL8 InnoDB 集群一致性和读写同步是否有效的方法比较简单,此处不再提供代码、您可以自行操作。首先选择任意服务器节点,然后创建库表并对其进行增删改查,最后查看其它节点数据是否同步改变即可。


4.2、检测集群可用性

为模拟真实场景,您可以手动关机一台节点服务器,或者直接将一台节点服务器的 MySQL 服务停止,然后通过 MySQL Shell 的管理命令查看当前路由的节点服务器是否是在线状态。


首先,执行以下命令后,我们可以看到三台的运行状态均为: "status": "online"。

# 进入 MySQL Shell 控制台
mysqlsh -hdeb1 -P3306 -uroot -p
# 定义JS对象,查看指定集群
var cluster = dba.getCluster('try8Cluster');
# 查看集群状态
cluster.status();


然后,我们进入第 3 台节点服务器,执行相关命令将 MySQL 服务停止:

# 停止服务
systemctl stop mysql


最后,再次返回 MySQL Shell 控制台,查看集群运行状态:"status": "(missing)"。

# 查看集群状态
cluster.status();


小提示:状态 status = online 代表该节点正常运行,status = missing 代表该节点异常,需要您尽快检查故障。


4.3、检测客户端连接

客户端是指运行 PHP / JAVA / PYTHON... 等代码的应用程序,例如,您的 PHP 代码可能需要配置 MySQL 数据库连接, 此时你只需要连接 MySQL Router 账号即可,而无需提供 MySQL Servers 内部账号。


首先,进入 MySQL Router 服务器,确认 Router 服务正常运行:

# 启动 mysqlrouter 服务
mysqlrouter &
# 查看端口占用
lsof -i:6446


然后,进入 MySQL Shell 服务器,测试 Router 账号是否可以正常连接:

# 你可以使用代码连接、或使用官方客户端 MySQL Workbench 连接,此处我们使用 MySQL Shell 命令方式连接
mysqlsh -hdeb0 -P6446 -utry8 -p
# 切换 sql 模式
\sql
# 查看当前连接的主机名称
select @@hostname;


最后,您可以将当前连接的节点服务器关机或直接停止 MySQL 服务,再次返回 MySQL Shell 服务器,重复上述操作,此时查看当前连接的主机名称已经变化,说明 MySQL Router 已经成功将故障机自动下线。


五、MySQL8 InnoDB 集群 总结

MySQL8教程 - MySQL8 InnoDB 集群,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 InnoDB 集群介绍开始,逐步到 MySQL8 InnoDB 集群实战与测试等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。