MySQL InnoDB Cluster 为 MySQL 提供了完整的高可用解决方案,通过集成API,您可以轻松的配置和管理一组集群。MySQL8 InnoDB 集群不依赖外部工具,可以解决数据一致性、故障监测与恢复、读写分离、负载均衡等问题。
InnoDB 集群服务器使用三种类型的账号,同一类型的每个账号必须使用相同的用户名和密码。
MySQL8 InnoDB 集群主要由 MySQL Shell、MySQL Router 和 MySQL Servers 三部分组成,三者协同工作,共同为 MySQL 提供完整的高可用解决方案。本教程采用生产环境实战,您需要准备好至少五台虚拟机或云服务器作为集群实例使用。
我们准备五台全新环境的虚拟机用于本次集群实战,MySQL Shell 和 MySQL Router 各一台,MySQL Servers 用三台。其中 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 等,在与本实战不相关的其它内容一律采用默认的数据库配置。
我们选择在 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 台为佳,过多过少会影响服务性能和可用性。
首先,我们选择在 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 数据库主-主集群模式:
首先,在 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 集群一致性和读写同步是否有效的方法比较简单,此处不再提供代码、您可以自行操作。首先选择任意服务器节点,然后创建库表并对其进行增删改查,最后查看其它节点数据是否同步改变即可。
为模拟真实场景,您可以手动关机一台节点服务器,或者直接将一台节点服务器的 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 代表该节点异常,需要您尽快检查故障。
客户端是指运行 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教程 - MySQL8 InnoDB 集群,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 InnoDB 集群介绍开始,逐步到 MySQL8 InnoDB 集群实战与测试等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。