MySQL组复制

一. 什么是MGR

MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主从复制高可用技术,它基于原生的主从复制,将各节点归入到一个组中,通过组内节点的通信协商(组通信协议基于Paxos算法),实现数据的强一致性,具有弹性复制、高可用、主从替换、自动加组等等功能。

1.1 MySQL组复制协议

这3个节点互相通信,每当有读写事件发生,都会向其他节点广播该事件,经过冲突检测后写入到binglog日志然后提交。

  • receiver的作用类似于io线程,用于接收组内个节点之间传播的消息和事务。也用于接收外界新发起的事务。
  • applier的作用类似于sql线程,用于应用relay log中的记录。不过,组复制的relay log不再是relay log,而是这里的组复制relay log:relay-log-group_replication_applier.00000N
  • certifier的作用在receiver接收到消息后,验证是否有并发事务存在冲突问题。冲突检测通过后,这条消息就会写入到组复制的relay log中,等待applier去应用。

这些节点可以是单主模型的(single-primary),也可以是多主模型的(multi-primary)。单主模型只有一个主节点可以接受写操作,主节点故障时可以自动选举主节点多主模型下所有节点都可以接受写操作,所以没有master-slave的概念。

1.2 组复制模式

MySQL的组复制可以配置为单主模型多主模型两种工作模式,它们都能保证MySQL的高可用。以下是两种工作模式的特性简介:

  • 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
  • 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

虽然多主模型的特性很诱人,但缺点是要配置和维护这种模式,必须要深入理解组复制的理论,更重要的是,多主模型限制较多,其一致性、安全性还需要多做测试。

二. 配置单主模式的组复制

2.1 实验环境

实验前请在hosts文件中设置好解析,或者局域网内搭建DNS服务器(推荐docker搭建dnsmasq)。当然也可以不设置解析,直接在my.cnf文件中使用IP地址即可。

系统 默认角色 主机名 IP MySQL版本
CentOS 7 Master d1.mgr.com 172.16.10.59 mysql 8.0.19
CentOS 7 Node1 d2.mgr.com 172.16.10.58 mysql 8.0.19
CentOS 7 Node2 d3.mgr.com 172.16.10.57 mysql 8.0.19

2.2 配置第一个节点d1.mgr.com

2.2.1 创建复制用户

连接donor(加组连接对象,由种子节点提供)的通道凭据(channel credentials

mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';

2.2.2 修改配置文件

vim /etc/my.cnf

server-id=10                       # 必须
gtid_mode=ON                       # 必须,开启GTID模式
enforce_gtid_consistency=ON        # 必须,不允许事务违背GTID的一致性
binlog_format=ROW                  # 必须,以行方式记录
binlog_checksum=NONE               # 必须,关闭事件校验
master_info_repository=TABLE       # 必须,记录加入master服务器信息到mysql.slave_master_info
relay_log_info_repository=TABLE    # 必须,记录节点中继日志的位置到mysql.slave_relay_log_info
log_slave_updates=ON               # 必须,更新节点中继日志
sync_binlog=1                      # 建议,事务同步到binlog日志
group_replication_recovery_get_public_key=ON      # 授权使用caching_sha2_password插件时启用,8.0版本默认使用此插件

transaction_write_set_extraction=XXHASH64         # 必须,事务写入算法
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #必须,或使用uuidgen命令生成
loose-group_replication_start_on_boot=OFF         # 建议,关闭启动自开启复制
loose-group_replication_local_address="d1.mgr.com:20001"   # 必须,组复制本机地址及端口
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003" # 必须,组复制种子地址及端口
loose-group_replication_ip_whitelist="172.16.10.0/24"   #建议,加组白名单

重启服务

systemctl restart mysqld

重启服务后生成通道的relay log文件,group_replication_recovery通道的relay log用于新节点加入组时,当新节点联系上donor后,会从donor处以异步复制的方式将其binlog复制到这个通道的relay log中,新节点将从这个recovery通道的relay log中恢复数据。

2.2.3 配置加组通道

mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';

2.2.4 安装插件并启用组复制

mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> set @@global.group_replication_bootstrap_group=ON;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=OFF;

reset master清空binlog.index索引日志并新建binlog.000001

reset slave 清空relay-bin-group_replication_applier.index索引日志并新建relay-bin-group_replication_applier.000001

reset masterreset slave 通常用于第一次创建或加入数据库集群时使用

是为了避免下次重启组复制插件功能时再次引导创建一个组,group_replication_bootstrap_group变量临时启用。当启动组复制功能后,将生成通道的binloggroup_replication_applier(类似中继日志)相关文件。

2.2.5 查看组复制成员情况

mysql> select * from performance_schema.replication_group_members;

2.3 配置第二个节点d2.mgr.com

在新节点加入组之前,应该先通过备份恢复的方式,从组中某节点上备份目前的数据到新节点上,然后再让新节点去加组,这样加组的过程将非常快,且能保证不会因为purge的原因而加组失败。

2.3.1 创建复制用户

连接donor(加组连接对象,由种子节点提供)的通道凭据(channel credentials

mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';

2.3.2 修改配置文件

vim /etc/my.cnf

#### Group Replication d2.mgr.com ####
server-id=20                     
gtid_mode=ON                       
enforce_gtid_consistency=ON       
binlog_format=ROW                  
binlog_checksum=NONE               
master_info_repository=TABLE       
relay_log_info_repository=TABLE    
log_slave_updates=ON               
sync_binlog=1                      
group_replication_recovery_get_public_key=ON

transaction_write_set_extraction=XXHASH64         
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" 
loose-group_replication_start_on_boot=OFF        
loose-group_replication_local_address="d2.mgr.com:20002"   
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003"
loose-group_replication_ip_whitelist="172.16.10.0/24"   

重启服务

systemctl restart mysqld

2.3.3 配置加组通道

mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';

2.3.4 安装插件并加入到复制组

mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
mysql> start group_replication;

2.3.5 查看组复制成员情况

mysql> select * from performance_schema.replication_group_members;

2.4 添加第三个节点d3.mgr.com

2.4.1 创建复制用户

连接donor(加组连接对象,由种子节点提供)的通道凭据(channel credentials

mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';

2.4.2 修改配置文件

#### Group Replication d3.mgr.com ####
server-id=30                     
gtid_mode=ON                       
enforce_gtid_consistency=ON        
binlog_format=ROW                 
binlog_checksum=NONE              
master_info_repository=TABLE       
relay_log_info_repository=TABLE    
log_slave_updates=ON               
sync_binlog=1                      
group_replication_recovery_get_public_key=ON

transaction_write_set_extraction=XXHASH64        
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" 
loose-group_replication_start_on_boot=OFF       
loose-group_replication_local_address="d3.mgr.com:20003"   
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003"
loose-group_replication_ip_whitelist="172.16.10.0/24"   

重启服务

systemctl restart mysqld

2.4.3 配置加组通道

mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';

2.4.4 安装插件并加入到复制组

mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
mysql> start group_replication;

2.4.5 查看组复制成员情况

mysql> select * from performance_schema.replication_group_members;

三. 参考

【1】MySQL高可用之组复制技术(2):配置单主模型的组复制

【2】Chapter 18 Group Replication

【3】MySQL 8.0.13 Group Replication Recovery Error MY-002061

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • 前言 环境 : CentOS 7.7 丶Docker 19.03.4丶MySQL 8.0.16本教程仅用于对MyS...
    x0e阅读 1,091评论 0 1
  • 1 安装mysql5.72 配置hosts映射cat /etc/hosts172.19.84.44 mgr1...
    羽霖z阅读 1,094评论 0 0
  • 风起于青萍之末,止于草莽之间。人生短短不过数十寒暑。就像这风说起就起。说止则止。人生虽短却不乏精彩。俗话说的好啊:...
    冷月霜天阅读 547评论 6 34
  • 刚入班时的模样还在眼前 你、你、还有你 花儿般,扎着辫的,短发的 爱说话的,叽叽喳喳像是精灵 沉默寡言的,静静坐着...
    荷塘恋雨阅读 306评论 0 4
  • 《稻盛哲学学习会》打卡第132天 姓名:严娜 部门:分水碶 组别:待定 【知~学习】 诵读《京瓷哲学》 6 思考人...
    NinaYanWellin阅读 495评论 0 0