作者: | 来源:互联网 | 2023-09-25 10:47
最近到处查资料的时候,发现MySQL5.7终于实现了原生的基于InnoDB的集群功能,于是在此写一篇文章介绍如何配置。我在数据库领域见识尚浅,本文只解释如何配置和使用,不涉及和其他
最近到处查资料的时候,发现MySQL 5.7 终于实现了原生的基于InnoDB的集群功能,于是在此写一篇文章介绍如何配置。
我在数据库领域见识尚浅,本文只解释如何配置和使用,不涉及和其他方案的对比和调优。
核心架构
- MySQL 5.7 引入了 Group Replication 功能,可以在一组 MySQL 服务器之间实现自动主机选举,形成一主多从结构。经过高级配置后,可以实现多主多从结构。
- MySQL Router 是一个轻量级透明中间件,可以自动获取上述集群的状态,规划 SQL 语句,分配到合理的 MySQL 后端进行执行。
- MySQL Shell 是一个同时支持 Javascript 和 SQL 的交互程序,可以快速配置 InnoDB Cluster。
以上三个组件构成了 MySQL InnoDB Cluster
配置演示
1) 创建环境
使用 VirtualBox 创建三个 CentOS 7.4 服务器,命名为 db1,db2,db3,并配置为 “NAT 网络”(而非 “网络地址转换(NAT)”)。
# 安装 mysql.com yum 源
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 安装 mysql-community-server、mysql-shell
yum install mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server mysql-shell
# 启动 mysqld
systemctl enable mysqld
systemctl start mysqld
# 找到随机密码
cat /var/log/mysqld.log | grep password
# 配置,注意允许 remote root 访问
mysql_secure_installation
# 允许 root 远程访问
echo "UPDATE mysql.user SET host = '%' WHERE user = 'root';FLUSH PRIVILEGES;" | mysql -u root -p
# firewalld 配置
firewall-cmd --add-service=mysql --permanent
firewall-cmd --add-port=13306/tcp --permanent
firewall-cmd --reload
# selinux 配置
yum install policycoreutils-python
semanage port -a -t mysqld_port_t -p tcp 13306
以上配置了三个独立的 MySQL 服务器,互相可以通过内网访问,并可以互相使用 root 用户。
生产环境上不建议直接使用 root 用户,如何配置专用用户权限,参见官方文档 20.2.5 Production Deployment of InnoDB Cluster
然后配置 hosts 表,使得这三台服务器互相可以使用 db1, db2, db3 解析到对方内网地址。
配置每台服务 my.cnf 中 report_host
字段,为自己的 hostname
2) 检查 MySQL 配置
在任一台服务器上启动 mysql-shell
mysqlsh
使用JS命令,检查每台服务器的配置。
dba.checkInstanceConfiguration('root@db1:3306') // 生产模式下此处使用专用用户
上述命令会执行一系列检查,列出有问题的配置,比如:
+----------------------------------+---------------+----------------+--------------------------------------------------+
| Variable | Current Value | Required Value | Note |
+----------------------------------+---------------+----------------+--------------------------------------------------+
| binlog_checksum | CRC32 | NONE | Update the server variable or restart the server |
| enforce_gtid_consistency | OFF | ON | Restart the server |
| gtid_mode | OFF | ON | Restart the server |
| log_bin | 0 | 1 | Restart the server |
| log_slave_updates | 0 | ON | Restart the server |
| master_info_repository | FILE | TABLE | Restart the server |
| relay_log_info_repository | FILE | TABLE | Restart the server |
| transaction_write_set_extraction | OFF | XXHASH64 | Restart the server |
+----------------------------------+---------------+----------------+--------------------------------------------------+
3)修正 MySQL 配置
此时,可以在各台服务器自己的 mysqlsh 上执行
dba.configureLocalInstance('root@localhost:3306') // 此处必须使用 root 用户
可以自动修复配置并写入 my.cnf
也可以按照给出的建议,手工修改各个服务器 my.cnf 中的配置。注意,在启用 binlog 的时候,需要额外增加 server_id 选项,分别设置为 1, 2, 3
自动配置或手动配置后,重启MySQL,并重新执行 dba.checkInstanceConfiguration,当输出
{
"status": "ok"
}
的时候,表示该服务器检查通过。按上述步骤,完成三台服务器的配置
3) 创建集群
以 db1 为起始主节点,在上面运行 mysqlsh
mysqlsh --uri root@db1:3306 // 生产模式下,此处使用专用用户
执行命令,完成集群创建和子节点添加
// 创建集群
var cluster = dba.createCluster('main')
// 添加子节点
cluster.addInstance('root@db2:3306') // 生产模式下,此处使用专用用户
cluster.addInstance('root@db3:3306') // 生产模式下,此处使用专用用户
// 查看节点信息
cluster.status()
至此,一个3节点,一主多从节点创建完成
创建节点后,在两个子节点上执行 dba.configureLocalInstance,更新 METADATA
4) MySQL Router 的配置
假设将 mysqlrouter 安装在 db2 上,实际生产中可以安装在其他的服务器上。
yum install mysql-router
使用主节点获取配置
mysqlrouter --bootstrap root@db1:3306 --user mysqlrouter #生产模式下,此处使用专用用户
此命令会更新 /etc/mysqlrouter/mysqlrouter.conf 中的配置信息
启动 mysqlrouter
systemctl start mysqlrouter
systemctl enable mysqlrouter
查看日志,就能看到 mysqlrouter 已经启动并准备就绪。
此时尝试连接 6446 端口(读/写)
mysql -u root -h 127.0.0.1 -P 6446 -p
执行命令
SELECT @@port;
就能够看到输出的结果是 3306,也就是已经经由 SQL Router 负载给后端 MySQL 服务器了。
当主节点失效的时候,集群会自动重新选举主节点,SQL Router 也会自动感知这一过程,更新路由。
更多详细信息,诸如多主节点配置,请参阅 http://mysql.com 上的官方文档 MySQL 5.7 Reference Manual :: 20 InnoDB Cluster