4.Mysql之MGR

Mysql Version:5.7.31
MGR > Mysql Group Replication

1、初步了解

1.1 对比主从复制

主节点执行事务,提交方式按照配置可分为异步和半同步;
异步方式:主节点的binlog由io线程写入到relay log后就提交事务
半同步方式:等待至少一个(数量可配置)从节点重放relay log后再提交事务

  • 异步模式
    异步模式
  • 半同步模式
    半同步模式
  • MGR
    MGR 由多个可以独立执行事务的server组成,读写事务在异步提交和回滚之前需要多数派统一决定,只读事务则不需要。读写事务在提交前,其修改的内容和修改标识符会被自动广播到其他节点上,其他节点接受后,会按照既定的顺序依次执行。冲突检测certification针对的是,不同节点上可能对同一对象有并发操作,先提交的事务会被保留,后进行的会被回滚。
    在这里插入图片描述
  • 使用场景
    1)动态扩缩容
    2)高性能写入
    3)不存在单点故障问题
    4)集成度高

2、细节探索

2.1 MGR架构

在这里插入图片描述
顶层API是插件和mysql服务进行交互的接口,起到隔离的效果。传递mysql的启停、恢复、连接到插件,同样事务的提交和回滚也通过此类接口传递之mysql服务。下一层的Capture模块是收集正在执行的事务,Applier模块响应远程数据库上执行的事务,Recovery模块主要负责新节点的加入,数据的追溯,以及于之关联的donor相关操作。Replication Protocol Logics模块主要负责冲突的检测,和传递事务至Group。最底层两个模块以Paxos协议为基础,进行内部的通信。

2.2 伸缩

当一个新节点加入Group时,一般会经历两个阶段
1)阶段:首先选出一个志愿者用来和新节点建立连接,通过复制建立的复制通道,同步新节点加入之前的所有的binlog数据操作文件。在此之间的事务会被缓存起来。
2)阶段:将第一阶段缓存的事务,进行追溯。

伸缩时需要依靠 view view change view identifier这三个点
view: 实时的记录当前以加入group的节点
view change: 当节点加入或者剔除的时候会产生日志记录
view identifier: 变化的唯一标识符 random:incnum

过程图如下
s1~s3为原始状态

在这里插入图片描述
当新节点s4加入的时候,选取出志愿这s2,并将变化标记写入binlog日志
在这里插入图片描述
s2和s4建立连接,并将加入之前,vc4之前的binlog操作日志同步至s4,于此同时将随后的事务缓存起来
在这里插入图片描述
在这里插入图片描述
最后将缓存起来的事务进行追溯
在这里插入图片描述

3、实操构建

准备同一版本的mysql节点3个,并配置/etc/hosts文件
默认为单主模式,多主模式可通过 super_read_only控制

3.1 配置文件

[mysqld]
#storage设置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#环境设置
basedir=/root/mysql/mysql-5.7.31-el7-x86_64 #安装目录
datadir=/opt/mysql/data #数据目录
plugin-dir=/opt/mysql/plugins #插件目录
socket=/opt/mysql/mysql.sock
symbolic-links=0 
secure_file_priv= #数据导入导出安全参数设置,为空不限制

#replication设置
server_id=1 #指定master的id标示
gtid_mode=ON #gtid主从开关
enforce_gtid_consistency=ON # gtid一致性
binlog_checksum=NONE #binlog校验
log_slave_updates=ON #记录binlog
binlog_format=ROW #存储格式为row格式
log_bin=/opt/mysql/data/binlogs/host-bin #binlog开启,设置binlog文件名
binlog_row_image=full # binlog记录变换数据的方式
master_info_repository=TABLE # 以下这两个参数为master和slave状态信息表
relay_log_info_repository=TABLE
expire_logs_days=7 # 过期时间,0为不限制,99为最大值
max_binlog_size=536870912 # 每个logbin文件的大小设置,最大为1G,设置为512m
sync_binlog=1 # 更新操作记录logbin时的效率选择,0为commit后更新,1记录具体的事物操作,N为多少个事物后提交到logbin·

#group设置
plugin_load_add='group_replication.so' # 生产不推荐此方式加载
transaction_write_set_extraction=XXHASH64
group_replication_group_name="6a560efc-6ea3-11eb-a412-00163e010b81" # group标识符,可通过select uuid();方式生成
group_replication_start_on_boot=off #后期手动启动插件
group_replication_local_address= "db1:33061" #内部通信地址
group_replication_group_seeds= "db1:33061,db2:33061,db3:33061" # 集群设置
group_replication_bootstrap_group=off # 集群初始化

#启动参数设置
[mysqld_safe]
log-error=/opt/mysql/log/mysqldb.log # mysql的运行日志
pid-file=/opt/mysql/mysqld_safe.pid

3.2 创建同步基础

  • 创建用户
set SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'abc123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
set SQL_LOG_BIN=1;
  • 更改通道
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='abc123'
FOR CHANNEL 'group_replication_recovery';
  • 安装插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;

3.3 开启MGR

  • 主节点
--初始化mgr,并开启mgr
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
--创建测试数据
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
select * from t1;
show binlog events;
  • 从节点
--关注从节点加入时,关注view的变化,查看是否有 view identifier的产生
START GROUP_REPLICATION;
select * from performance_schema.replication_group_members;
show binlog events;

可以看出新节点已经上线,并且和主节点数据保持一致
在这里插入图片描述

4、前提和限制

前提条件
限制条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值