本文将从0到1讲述在centos7通过mysql-shell部署MGR
前言
1、什么是mysql-shell
MySQL Shell 是 MySQL 的高级客户端和代码编辑器,除了提供的 SQL 功能外,与 mysql 类似,MySQL Shell 还提供脚本 JavaScript 和 Python 的功能,包括 API 使用 MySQL。
2、什么是MGR
MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。
文件主要介绍通过mysql-shell部署MGR,而关于MGR本身,将在后续文章中为大家介绍。
部署流程
1、关闭防火墙、关闭防火墙、关闭防火墙
如果忘记关闭防火墙后续操作会遇到重重坎坷。
2、上传mysql-shell软件包、修改环节变量
这里用的是
mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
解压重命名后配置环节变量(/etc/profile中添加)
export PATH=/opt/mysqlsh/bin:$PATH
3、生成uuid(用于MGR配置)
[root@mgr1 bin]# cat /proc/sys/kernel/random/uuid
7b180eea-76b6-4fc1-8dd6-7c30557491f6
4、安装mysql(添加MGR重要参数),其他参数根据大家情况来
mysql同样安装8.0.26版本
这里为大家提供MGR重要参数,其他参数可自定义
##########################MGR####################
#通过ip来配置MGR,所以这里禁用dns解析
skip_name_resolve
master_info_repository=TABLE
relay_log_info_repository=TABLE
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
#加载MGR插件
plugin_load_add=‘group_replication.so’
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
#刚刚生成的uuid,所有节点相同
loose-group_replication_group_name=“c357ce5e-4666-4921-b1ef-b1a24c0bbdf2”
#故障后是否自动拉起
loose-group_replication_start_on_boot=OFF
#MGR内部通信端口
loose-group_replication_local_address= “192.168.14.11:33061”
loose-group_replication_group_seeds= “192.168.14.11:33061,192.168.14.12:33061,192.168.14.13:33061”
#是否自动初始化组复制
loose-group_replication_bootstrap_group=OFF
loose-group_relication_ip_whitelist=“192.168.14.11,192.168.14.12,192.168.14.13”
report_host=192.168.14.11
report_port=3306
disabled_storage_engines=“MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY”
5、此时部署MGR的初始条件已经完成
- 各个服务器节点都安装并启动好了mysql
- my.cnf配置好了MGR相关参数
- 各个服务器节点网络通信正常,防火墙关闭
6、通过mysql-shell登录mysql(所有节点执行)
注意:如果各个节点上都装了mysql-shell则可以同时执行,如果仅在一个节点装了mysql-shell也可以依次在同一节点执行。
使用root用户登录mysql-shell
mysqlsh -S /data/soft/mysql/tmp/mysql.sock root@localhost
第一次登陆后会询问“是否记住密码”,我们选择记住,下次登录不用输密码
7、MGR先前准备(所有节点)
JS > dba.configureInstance()
该步骤目的主要是为了创建一个最小化用户,用于MGR工作
这里选择【2】会自动完成创建,完成后可直接通过mysql.user表查看
注意!再说一遍,该操作需要在每个MGR节点执行,也就是说每个mysql单实例上都需要创建这个最小化用户。
8、MGR引导检查(所有节点)
退出该会话,并使用刚刚新注册的用户登录
登录
mysqlsh --uri mgr@192.168.14.11:3306
校验
JS > dba.checkInstanceConfiguration()
该步骤的目的是通过检查配置文件来校验是否符合MGR的部署条件。
如果出现端口错误,节点配置错误等,这里都会提示错误内容。
返回“ok”表示正常。
9、通过mysql-shell创建MGR集群(选择任意一个节点执行,该节点将成为主节点)
登录
mysqlsh --uri mgr@192.168.14.11@3306
创建名为test的集群
JS > var cluster = dba.createCluster(‘test’)
检查集群状态
JS > cluster.status()
可以看到,此时MGR的主节点已经创建好了
10、添加节点
如果此时退出了刚刚的会话则需要重新进入集群,否则省略该步骤
mysqlsh --uri mgr@192.168.14.11@3306
JS > var cluster = getCluster(‘test’)
添加节点
JS > cluster.addInstance(‘mgr@192.168.14.12’)
这里添加的方式选择clone,相当于直接全量克隆主节点的数据,然后加入集群。
需要注意的是:如果被添加的节点中本身有数据,则会被覆盖掉。
再次查看MGR状态
JS > cluster.status()
可以看到已经变成一主一从的MGR集群了
以同样的方式再添加一个节点
JS > cluster.addInstance(‘mgr@192.168.14.13’)
到此,一主两从的MGR就搭建完成了
模拟主节点宕机
kill 主节点数据库
查看MGR状态
看到,主节点宕机后,其中一个从节点自动升为了主,而另一个从节点变成了新主的从
节点恢复
当主节点恢复运行后,他将以新的从节点身份加入原MGR集群,同时会自动重构缺失的数据
彩蛋
使用mysql-shell构建MGR集群时,在创建集群、节点加入集群后会根据mysql-shell内部的规则改变MGR的通信端口。忽略配置文件的通信端口,变成默认的33061端口。
示例:
如果部署MGR时没有使用默认的33061端口
查看MGR集群内节点
mysql [(none)]>select @@group_replication_group_seeds;
±------------------------------------------------ --------------------------------+
| @@group_replication_group_seeds |
±------------------------------------------------ --------------------------------+
| 192.168.14.11:33069,192.168.14.12:33062,192.168.14.13:33063
实际本节点的端口情况
mysql [(none)]>SELECT @@group_replication_local_address;
±---------------------------------+
| @@group_replication_local_address |
±---------------------------------+
| 192.168.14.11:33061 |
±---------------------------------+
猜测是mysql-shell忘记更新启动节点(第一次构建时的主节点)group_replication_group_seeds的参数内容,导致查询出来的结果看起来有歧义。
目前已经向官方提供了bug,收到回复后会跟大家分享