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;
可以看出新节点已经上线,并且和主节点数据保持一致