如何优雅的添加MGR节点?

导读

作者:田帅萌

知数堂MySQL DBA班第9期优秀学员,Python运维开发班第5期学员,现任职知数堂助教

邮箱:tplinux@163.com,欢迎交流、拍转


引言

MySQL Group Replication(简称MGR)是MySQL官方于2016年12月份推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务,是MySQL数据库未来发展的一个重要方向。

场景描述

操作系统 MySQL版本
CentOS Linux release 7.3.1611MySQL5.7.20 二进制
  • ip地址规划

IP地址 hosts port
192.168.74.134mgr-node1.up.com3306\23306
192.168.74.135mgr-node2.up.com3306\23306
192.168.74.136mgr-node3.up.com3306\23306

一个已经运行很久的MGR集群,以single-master模式运行(单主模式),binlog过期策略为7天。

  • 参数设置

Key Value
enforce_gtid_consistencyON
master_info_repositoryTABLE
relay_log_info_repositoryTABLE
binlog_checksumNONE
log_slave_updatesON
binlog_formatROW
==expire_logs_days==7


  • 需求描述

因为不可抗力的因素,mgr-node3.up.com 节点永久性的down,并且无法恢复,或者mgr-node3.up.com 宕机超过时间7days, 或需要快速添加节点,那么该如何快速添加或扩容呢?

猜想

1.如果这个问题发生在Percona XtraDB Cluster(pxc)或者Mariadb Galera Cluster,那解决方案就是通过SST(全量)或者IST(增量)来实现,那么MGR是否有相关的解决方案呢?

2.假设MGR也是通过SST或者IST来的解决方案,加入MGR是否可以使用MySQLdump 或者rsync来获得一份全量?

3.假设是通过MySQLdump来实现传递增量。是否可以用xtrabackup来替换呢?

下面根据上述的猜想和假设来求证,如何优雅地添加MGR节点。

验证

猜想一:在MySQL官方文档中没有找到关于SST或IST的描述,既然官方文档没有写,那么在实验环境中能否模拟出来呢?

  • 实验:在mgr-node1.up.com主节点创建一张表

"root@localhost:mysql3306.sock  [aa]>show create table aa;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| aa    | CREATE TABLE `aa` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
"root@localhost:mysql3306.sock  [aa]>select * from aa;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | a    |
|  3 | a    |
|  4 | a    |
|  5 | a    |
+----+------+
5 rows in set (0.00 sec)

加入新的节点mgr-node4.up.com并初始化,开启现有环境所有节点的general_log,并观察general的输出mgr-node1.up.com 节点。

2017-11-16T15:38:52.818216Z       32 Connect    slave@mgr-node4.up.com on  using TCP/IP
2017-11-16T15:38:52.829195Z       32 Query    SELECT UNIX_TIMESTAMP()
2017-11-16T15:38:52.829836Z       32 Query    SELECT @@GLOBAL.SERVER_ID
2017-11-16T15:38:52.835000Z       32 Query    SET @master_heartbeat_period= 30000001024
2017-11-16T15:38:52.842449Z       32 Query    SET @master_binlog_checksum= @@global.binlog_checksum
2017-11-16T15:38:52.843032Z       32 Query    SELECT @master_binlog_checksum
2017-11-16T15:38:52.843355Z       32 Query    SELECT @@GLOBAL.GTID_MODE
2017-11-16T15:38:52.843529Z       32 Query    SELECT @@GLOBAL.SERVER_UUID
2017-11-16T15:38:52.843726Z       32 Query    SET @slave_uuid= '5d03ede3-cae1-11e7-9319-000c299354d5'
2017-11-16T15:38:52.844093Z       32 Binlog Dump GTID    Log: '' Pos: 4 GTIDs: ''
2017-11-16T15:39:52.972984Z       33 Connect    slave@mgr-node4.up.com on  using TCP/IP

从general_log中找到了蛛丝马迹,目前版本的MGR,不支持SST或IST,实现的方式是根据GTID的方式来实现的。

同时在general_log中也发现,目前版本的MGR也不支持MySQLdump或者rsync方式来给新加入的节点传递全量。如果binlog被清空的话 则显示为空,新的节点无法加入集群,但

"root@localhost:mysql3306.sock [aa]>start group_replication; 会提示成功。

正确姿势

1.首先,需要手动在MGR集群中获得一致性备份。

2.初始化新节点,并应用备份。 注意如下操作,否则无法正常启动集群。

"root@localhost:mysql3306.sock  [aa]>reset master;
Query OK, 0 rows affected (0.00 sec)

"root@localhost:mysql3306.sock  [aa]>SET @@GLOBAL.GTID_PURGED='3db33b36-0e51-409f-a61d-c99756e90155:1-14,
    '> ecf5373e-cad7-11e7-b854-000c293dbc8e:1'
    -> ;
Query OK, 0 rows affected (0.00 sec)

3.安装官方文档正常初始化集群

步骤略

4.验证

"root@localhost:mysql3306.sock  [aa]>start group_replication;
Query OK, 0 rows affected (3.16 sec)

"root@localhost:mysql3306.sock  [aa]>select * from aa;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | a    |
|  3 | a    |
|  4 | a    |
+----+------+

总结

1.如果需要添加一个节点

添加节点 需要自己手动在MGR集群中备份,MGR集群不存在SST和IST概念,而是完全通过GTID和binlog来实现“追数据”的一个操作。

2.节点宕机

如果MGR集群中某个节点宕机,宕机节点会询问存活集群,是否能补全binlog?如果能补齐,那么就会正常传输,进行追数据 ;如果宕机节点需要的日志不存在了,则该节点无法正常加入到集群环境中。

对于MGR一个建议

在宕机节点加入MGR集群中,如果发现需要的binlog日志不存在,则无法启动集群start group_replication。

题外话:

据说,知数堂“大数据班”已在筹划中,师兄弟们为了能当上001号的大师兄正“”的不可开交呢~欢迎大家私撩助教妹纸们预定课程,首期开班一般有特惠哦!

附赠大数据准讲师的公开课资料,公开课发布《大数据与Hadoop入门指引》by晓伟,内含讲义、视频,电子书,论文等等,干货满满哦~


作者投稿的其他文章

老司机带你体验SYS库多种新玩法

阿里云数据库挑战赛"SQL优化大师"获奖案例

MySQL巡检怎么做




扫码加入知数堂技术交流QQ群

(群号:579036588)

群内可@各位助教了解更多课程信息




知数堂

叶金荣与吴炳锡联合打造

领跑IT精英培训

行业资深专家强强联合,倾心定制

MySQL实战/MySQL优化 / Python/ SQL优化

数门精品课程

紧随技术发展趋势,定期优化培训教案

融入大量生产案例,贴合企业一线需求

社群陪伴学习,一次报名,可学3期

DBA、开发工程师必修课

上千位学员已华丽转身,薪资翻番,职位提升

改变已悄然发生,你还在等什么?

扫码下载知数堂精品课程试听视频

或点击“阅读原文”直达下载地址

(MySQL 实战/优化、Python开发,及SQL优化等课程)

密码:hg3h



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值