美文网首页
MySQL组复制

MySQL组复制

作者: shuhanghang | 来源:发表于2020-04-09 17:01 被阅读0次

    一. 什么是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

    相关文章

      网友评论

          本文标题:MySQL组复制

          本文链接:https://www.haomeiwen.com/subject/sancmhtx.html