Mysql innodb cluster部署
InnoDB Cluster 组件介绍
InnoDB Cluster 组件
- MySQL Shell:是 MySQL 的高级客户端和代码编辑器。
- MySQL server 和 Group Replication:使一组 MySQL 实例能够提供高可用性。
- MySQL Router:一种轻量级中间件,可在应用程序和 InnoDB Cluster 之间提供透明路由。
功能
提供自动成员管理、容错、自动故障转移等功能。 InnoDB Cluster 通常以单主模式运行,具有一个主实例(读写)和多个辅助实例(只读)。高级用户还可以利用多主模式,其中所有实例都是主实例。您甚至可以在 InnoDB Cluster 在线时更改集群的拓扑,以确保尽可能高的可用性。
部署节点规划
示例部署
本示例使用 7 台虚拟机进行部署,部署架构如下:
- Host IP:192.168.72.50,操作系统:Ubuntu 22.04,角色:mysql innodb/mysql shell。
- Host IP:192.168.72.51,操作系统:Ubuntu 22.04,角色:mysql innodb/mysql shell。
- Host IP:192.168.72.52,操作系统:Ubuntu 22.04,角色:mysql innodb/mysql shell。
- Host IP:192.168.72.41,操作系统:Ubuntu 22.04,角色:mysql router/mysql client。
- Host IP:192.168.72.42,操作系统:Ubuntu 22.04,角色:mysql router/mysql client。
- Host IP:192.168.72.33,操作系统:Ubuntu 22.04,角色:haproxy/keepalived。
- Host IP:192.168.72.34,操作系统:Ubuntu 22.04,角色:haproxy/keepalived。
通用要求
- 至少三台 MySQL 服务器用于 mysql innodb 节点。
- 至少一台 MySQL Router 服务器。
- 可以用 ELB/SLB 替换 haproxy+keepalived。
部署步骤
1. 在所有 mysql-router 节点及 mysql-innodb 节点执行以下操作
- 配置主机名:
hostnamectl set-hostname mysql-innodb01hostnamectl set-hostname mysql-innodb02hostnamectl set-hostname mysql-innodb03hostnamectl set-hostname mysql-router01hostnamectl set-hostname mysql-router02
分别在每个节点配置主机名。 2. 配置 hosts 解析:
cat << EOF > /etc/hosts192.168.21.202 mysql-router01192.168.72.42 mysql-router02192.168.21.203 mysql-innodb01192.168.21.204 mysql-innodb02192.168.21.205 mysql-innodb03EOF
另一种配置示例:
cat << EOF > /etc/hosts10.10.3.35 mysql-router0110.10.3.189 mysql-router0210.10.3.168 mysql-innodb0110.10.3.182 mysql-innodb0210.10.3.248 mysql-innodb03EOF
分别在每个节点配置 hosts 解析。 3. 添加 mysql 官方软件源:https://dev.mysql.com/downloads/repo/apt/ 4. 安装软件包:
apt install gpg -y
mysql 版本建议大于 8.0.11 ,在 centos7 上使用 mysql5.7.44 。 5. 安装软件源配置包(不同版本示例): - 8.4 版本示例:
wget https://repo.mysql.com//mysql-apt-config_0.8.32-1_all.debdpkg -i mysql-apt-config_0.8.32-1_all.debapt update -y
- **5.7 debian10 版本示例**:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.debdpkg -i mysql-apt-config_0.8.24-1_all.deb
- **centos7 安装 5.7 版本示例**:
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmsudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
- 添加 key:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C
centos 示例:
sudo yum info mysql-community-server
cd /etc/apt;cp trusted.gpg trusted.gpg.d
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
- 更新和升级系统:
apt update;apt upgrade -y
debian/ubuntu 最大 5.7.42 ,推荐使用 centos7 系统安装 5.7.44 。 centos 另一种添加 key 示例:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
2. 在所有 innodb 节点执行以下操作
- 安装 innodb 集群:
apt update -yapt install -y mysql-server mysql-shell
centos 安装命令:
yum install mysql-community-server mysql-shell -y
- 修改配置文件:
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mysql.conf.d/mysqld.cnf
将 127.0.0.1 修改为 0.0.0.0 ,重要,必须修改。 3. 创建独立账号:
mysqlsh -uroot -pqwer1234 -h mysql-innodb01
dba.configureInstance()
选择 2 ,用户名 icadmin ,密码 hc123456 。 4. 重启 mysql 使配置生效:
systemctl restart mysql
- 查看生成的配置:
cat /etc/mysql/conf.d/mysql.cnf
- 创建数据库用户:
SET SQL_LOG_BIN=0;CREATE USER icadmin IDENTIFIED BY 'hc123456';GRANT ALL ON *.* TO icadmin WITH GRANT OPTION;SET SQL_LOG_BIN=1;
- 检查实例配置:
mysqlsh -uicadmin -phc123456 -h localhost --sql
\sselect @@gtid_mode, @@server_id;\jsdba.checkInstanceConfiguration()
确认 status 参数为 ok ,处理表的问题时,一定要先关 binlog 再执行 ddl/dml ,表必须要有主键,不然报错。 8. 确认参数:
cat /etc/mysql/conf.d/mysql.cnf
确认参数 gtid 和 server_id 。 9. 重置所有 gtid 同步日志:
mysqlsh -uicadmin -phc123456 -h localhost --sql
reset master;
重置所有 gtid 同步日志,不然在添加节点到集群时会报错,从已有数据恢复时一定要执行这个操作后才能建立集群。
3. 在 innodb01 节点执行以下操作
- 创建 innodb 集群:
mysqlsh -uicadmin -phc123456 -h mysql-innodb01
dba.createCluster('my_innodb_cluster')dba.getCluster()herc = dba.getCluster()herc.status()herc.rescan()herc.addInstance('admin2@mysql-innodb02')
添加 innodb02 节点到集群,报 gtid 错误执行 reset master 。 2. 查看集群状态:
herc.status()
如果添加失败,错误:ERROR: RuntimeError: The instance ‘mysql-innodb02:3306’ is already part of another Replication Group 。 处理方法:
vi /etc/mysql/conf.d/mysql.cnf删除掉自动增加的gtid等配置项systemctl restart mysqlmysqlsh -uroot -pqwer1234 -h mysql-innodb02dba.configureInstance()systemctl restart mysql
或
stop group_replication;
- 处理版本问题: 问题:WARNING: Instance ‘mysql-innodb01:3306’ cannot persist configuration since MySQL version 5.7.42 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes. 8.0.11 以下版本重启后,组复制信息会丢失,不能自动恢复到集群。必须执行下面本地文件持久化才能自动恢复。 处理,集群 3 个节点都添加好后,每个节点执行:
dba.configureLocalInstance()cat /etc/mysql/conf.d/mysql.cnf
- 添加 innodb03 节点到集群:
herc.addInstance('icadmin@mysql-innodb03')herc.status()\sql select @@super_read_only;
- 查看库及表:
\sqlshow schemas;use mysql_innodb_cluster_metadata;show tables;use performance_schema;show tables;select * from performance_schema.replication_group_members;
- 删除集群:
dba.dropMetadataSchema()cluster = dba.getCluster()dba.rebootClusterFromCompleteOutage()cluster.describe()dba.configureLocalInstance()cluster.status()
vi /etc/my.cnf删除集群配置systemctl restart mysqld
4. 部署 mysql-router
- 添加 key:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
- 安装 mysql-router:
apt install -y mysql-router mysql-client
centos 安装命令:
yum install -y mysql-router mysql
- 配置 apparmor:
nano /etc/apparmor.d/usr.bin.mysqlrouter
添加配置:
# Allow directory for MySQL InnoDB cluster /var/lib/mysqlrouter/ rw, /var/lib/mysqlrouter/** rw,}
systemctl reload apparmor
- 引导 mysql-router:
mysqlrouter --bootstrap icadmin@mysql-innodb01:3306 --directory /var/lib/mysqlrouter \--conf-bind-address 0.0.0.0 --user=mysqlrouter
连接 innodb 集群,MySQL Classic protocol :
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447
- Read/Write Split Connections: localhost:6450 MySQL X protocol :
- Read/Write Connections: localhost:6448
- Read/Only Connections: localhost:6449 另一种引导示例:
mysqlrouter --bootstrap admin2@mysql-innodb01:3306 --directory /var/lib/mysqlrouter \--conf-bind-address 0.0.0.0 --user=mysqlrouter --force
- 查看网络连接:
ss -antulp
- 配置 mysql-router 认证: 参考链接:https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-rest-api-setup.html
vi /var/lib/mysqlrouter/mysqlrouter.conf
添加配置:
[http_auth_backend:default_auth_backend]#backend=metadata_cachebackend=filefilename=/etc/mysqlrouter.pwd
修改最大连接数:
max_connections=10000 #修改最大连接数,默认512max_total_connections=20000 #默认512
参考:https://mysql.net.cn/doc/mysql-router/8.0/en/mysql-router-conf-options.html 7. 查看配置文件:
cat /var/lib/mysqlrouter/mysqlrouter.confcat /var/lib/mysqlrouter/data/state.json
- 禁用默认的 systemd 服务:
systemctl stop mysqlrouter.servicerm -rf /etc/init.d/mysqlroutersystemctl daemon-reload
- 配置 mysql-router 服务开机自启动:
cat >/etc/systemd/system/mysqlrouter.service<<EOF[Unit]Description=MySQL RouterAfter=network.targetAfter=syslog.target[Service]Type=notifyUser=mysqlrouterGroup=mysqlrouter# Start main serviceExecStart=/usr/bin/mysqlrouter -c /var/lib/mysqlrouter/mysqlrouter.conf --user=mysqlrouter# Sets open_files_limitLimitNOFILE = 10000Restart=on-failure[Install]WantedBy=multi-user.targetEOF
systemctl enable --now mysqlrouter.servicecat /var/lib/mysqlrouter/log/mysqlrouter.log
- 验证 reset api:
- 建立 reset api 账号:
mysqlrouter_passwd set /etc/mysqlrouter.pwd apiuser X9DGc6j0W4aUBiNmysqlrouter_passwd list /etc/mysqlrouter.pwdchmod a+r /etc/mysqlrouter.pwdsystemctl restart mysqlrouter
- **测试 api**:
curl -XGET -I -k https://localhost:8443/api/20190715/metadata --user apiuser X9DGc6j0W4aUBiN
5. 读写验证和故障自动切换
- 写入数据(主节点):
mysqlsh -uicadmin -phc123456 -h mysql-innodb01herc = dba.getCluster()herc.status()
CREATE DATABASE gaojinbo;CREATE TABLE t1(id int,name varchar(30),primary key (id));INSERT into gaojinbo.t1 VALUE(1001,'gaojinbo');select * from gaojinbo.t1;
其他节点也能查到数据,其他节点 insert 会报错。 2. 模拟故障切换:
关闭innodb01systemctl stop mysql
innodb02 会自动成为主节点。
mysqlsh -uicadmin -phc123456 -h mysql-innodb02INSERT into gaojinbo.t1 VALUE(1002,'gaojinbo');select * from gaojinbo.t1;
6. 连接数据库
- 创建示例用户:
mysql -uroot -p
create user app@'%' identified by 'App@123456';grant all on *.* to app@'%';flush privileges;
- 连接到读写数据库:
mysql -h127.0.0.1 -P 6446 -u app -p'App@123456'select @@hostname;create database mydb;
- 连接到只读数据库:
mysql -h127.0.0.1 -P 6447 -u app -p'App@123456'select @@hostname;create database mydb1; #报错select user, host from mysql.user;