三台服务器编辑host文件:
vi /etc/hosts
192.168.137.10 node1
192.168.137.20 node2
192.168.137.30 node3
分别初始化3台实例,或者准备好三台已有数据的实例,无需提前在配置文件中添加MGR相关选项。
以下操作只在node1上操作即可:
安装mysql-shell
安装mysql-router
mysql -uroot -p123456 -S /data/3306/mysql/mysql3306.sock
>create user zy@'%' identified by '123456';
>grant all on *.* to zy@'%' with grant option;
这里一定加上with grant option,不然后续步骤会失败。
登录mysqlshell执行检查:
cd /usr/local/mysql-shell/bin/
./mysqlsh
>\c zy@127.0.0.1:3306
>dba.checkInstanceConfiguration()
根据提示进行整改,对于已有数据的数据库而言,一般是要补充主键,对于参数的一些适配根据提示执行下面的命令修复。
>dba.configureInstance()
整改完毕后重新执行检查,通过为止。
在mysqlshell里面执行:
JS > var cluster=dba.createCluster('zy_cluster')
JS > cluster.status()
JS > cluster.addInstance('192.168.137.20:3306')
添加节点时,发现即将加入的节点存在缺乏主键以及replica_preserve_commit_order为off的相同问题,用mysqlshell链接上去执行修改:
>\c zy@192.168.137.20:3306
>dba.checkInstanceConfiguration()
修复问题后。
JS > cluster.addInstance('192.168.137.20:3306')
JS > cluster.addInstance('192.168.137.30:3306')
我在部署时碰到一个问题,当添加节点时,选择clone plugin选项后,报错:
[ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error connecting to all peers. Member join failed. Local port: 33061'
2022-03-08T11:36:21.353880+08:00 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33061'
仔细排查时发现,当初引导第一个节点时,有如下提示:
Threads: 5 Questions: 3165 Slow queries: 11 Opens: 901 Flush tables: 4 Open tables: 602 Queries per second avg: 0.002
MySQL 127.0.0.1:3306 ssl JS > dba.checkInstanceConfiguration()
Validating local MySQL instance listening at port 3306 for use in an InnoDB cluster...
This instance reports its own address as localhost.localdomain:3306
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
Checking whether existing tables comply with Group Replication requirements...
注意上面黑体字部分,节点把自己认为成了localhost.localdomain:3306。而不是我们希望的node1,这个原因我推测是当时我们mysqlshell中连接时使用的是zy@127.0.0.1这个地址,而host文件默认对127.0.0.1的地址认为是localhost.localdomain。我当时删除了元数据,然后重启了一下数据库,再create cluster时变成node1了,但是其实不用重启,退出mysqlshell然后连接时换成IP地址(不用127.0.0.1)就可以了。
JS > dba.dropMetadataSchema()
JS > \sql
SQL> restart;
也可以退出mysqlshell然后如下连接:
JS > \c zy@192.168.137.10:3306
部署mysql-router:
cd /usr/local/mysql-router/bin
./mysqlrouter -B zy@192.168.137.10:3306 --directory=/data/6033/ -u root --force
发现自动创建了/data/6033目录,并在目录/data/6033下面自动建立了配置文件和启停脚本等文件。
cd /data/6033/
vi mysqlrouter.conf
./start.sh
mysql -uzy -P6446 -p123456 -h192.168.137.10 (可写端口)
mysql -uzy -P6447 -p123456 -h192.168.137.10 (只读端口)
当使用6447只读端口登录时,每次登入的是不同的secondary库(轮询),可以如下这样查看:
>select @@hostname;