MGR基本要求:

1、InnoDB存储引擎

2、主键,每个表必须具有已定义的主键或等效的主键,其中等效项是非null唯一键

3、IPv4网络

4、网络性能

5、开启二进制日志并开启GTID模式

6、mysql版本在5.7.17以上

MGR限制:

1、组复制不支持mysiam引擎

2、不支持binlog的checksum校验

3、并发DDL与DML操作。  使用多主模式时,不支持针对同一对象但在不同服务器上执行的并发数据定义语句和数据操作语句,因为锁不共享

4、具有级联约束的外键

5、非常大的事务,即超过5S的事物,都会自动驱逐出集群,设置group_replication_transaction_size_limit参数限制事物大小,如果超过则回滚

6、最多包含9个服务器

开启replication配置:

所有的实例中必须包含以下参数配置:

server-id=1                                      #标识服务器唯一

log-bin=mysql-bin                           #二进制日志开启

enforce_gtid_consistency = ON          #GTID模式

binlog-format=row                           #必须是ROW模式

gtid-mode=ON                                  #GTID保证事物编号全局唯一   (Global Transaction ID)

master-info-repository=TABLE

relay-log-info-repository=TABLE           #记录同步的信息,便于管理和恢复

log-slave-update = ON                         #需要记录事务的binlog,用作以后的恢复用,哪怕不是写入点,也需要

binlog-checksum=NONE                      #MGR本身不支持binlog的checksum校验

 slave-parallel-workers=8

 slave-preserve-commit-order=1    #GTID配置,SQL线程按照顺序重放事物

slave-parallel-type=LOGICAL_CLOCK.   #SQL线程工作模式。有两种。

#组复制配置:

  transaction_write_set_extraction=XXHASH64    #指示服务器对于每个事务,它必须收集写集并使用XXHASH64散列算法将其编码为 散列

  loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"    #命名格式,每个实例必须完全相同

  loose-roup_replication_start_on_boot=off        #插件在服务器启动时不自动启动操作

 loose-group_replication_local_address =“127.0.0.1:24903”     #指定本机地址及端口,是通信端口,不是实例端口

 loose-group_replication_group_seeds= "127.0.0.1:24903,127.0.0.1:24903,127.0.0.1:24903"    #设置组成员的主机名和端口,端口使用的是通信端口,不是实例端口

 loose-group_replication_bootstrap_group=off        #引导是否开启,选择关闭,手动引导

loose-group_replication_auto_increment_increment=7      #指定自增量,默认为7

 loose-group_replication_single_primary_mode = off    #关闭单主模式的参数
loose-group_replication_enforce_update_everywhere_checks = on #开启强制检查

创建复制账号:

SET SQL_LOG_BIN=0;      #不写入二进制日志,避免扩散到其他机器
grant replication slave on *.* to 'backup'@'%' identified by '123456';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

主执行:

CHANGE MASTER TO MASTER_USER='stemp', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';      #加入组
INSTALL PLUGIN group_replication SONAME 'group_replication.so';      #安装组复制插件。mysql自带有这个插件
SHOW PLUGINS;    #查看插件是否安装成功
SET GLOBAL group_replication_bootstrap_group = ON;      #开始引导组
START GROUP_REPLICATION;                 #开启组复制
SET GLOBAL group_replication_bootstrap_group = OFF;  #关闭引导
查看:
SELECT * FROM performance_schema.replication_group_members;      #查看是否加入成功
其他机器执行(加入组复制):
SET SQL_LOG_BIN=0;      #不写入二进制日志,避免扩散到其他机器
grant replication slave on *.* to 'backup'@'%' identified by '123456';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='stemp', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME'group_replication.so';
START GROUP_REPLICATION;
这里和第一台机器不同的是不执行引导组的语句。
查看:SELECT * FROM performance_schema.replication_group_members;
MGR使用paxos算法来解决一致性的问题,自己的理解:
比如一场法庭审判:
底下的人都是提议者,可以提出自己的意见和建议,但是,最后做出决定的是法官,这个法官可以是一个或者多个。
提出提议的众人争先和法官联系。每一个提议者都会提出一个意见,这个意见会生成一个唯一的ID。如果有一个提议者和大多数法官(半数以上)取得的联系,那么这个提议就会被接受 法官就会记录这个提议生成的唯一ID,和上一个ID进行对比,如果现在的这个ID大于旧ID,那么这个意见就会被接收,然后法官们一起决定这个意见,以少数服从多数的方式决定。 如果这个ID小于或者等于旧ID,那么法官就会拒绝这个提议,拒绝后,提议者会将这个ID号增加,然后继续向法官提出提议,直到被接受。 在同一时间,只有一个提议能被接受。
												

MySQL Group Replication(组复制MGR)的更多相关文章

  1. Mysql 5.7 基于组复制(MySQL Group Replication) - 运维小结

    之前介绍了Mysq主从同步的异步复制(默认模式).半同步复制.基于GTID复制.基于组提交和并行复制 (解决同步延迟),下面简单说下Mysql基于组复制(MySQL Group Replication ...

  2. MySQL Group Replication 介绍

    2016-12-12,一个重要的日子,mysql5.7.17 GA版发布,正式推出Group Replication(组复制) 插件,通过这个插件增强了MySQL原有的高可用方案(原有的Replica ...

  3. Mysql Group Replication 简介及单主模式组复制配置【转】

    一 Mysql Group Replication简介    Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务.    高一致性,基于原生复制及p ...

  4. MySQL高可用架构之MySQL5.7组复制MGR

    MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...

  5. MySQL组复制MGR(一)-- 技术概述

    (一)复制技术的发展 MySQL的复制技术主要经历了异步主从复制,半同步复制,组复制(Group Replication)3个阶段. (1)传统的异步主从复制 传统的MySQL提供了一种简单的主从复制 ...

  6. mysql group replication观点及实践

    一:个人看法 Mysql  Group Replication  随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...

  7. MySQL Group Replication配置

    MySQL Group Replication简述 MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事 ...

  8. mysql group replication 安装&配置详解

    一.原起: 之前也有写过mysql-group-replication (mgr) 相关的文章.那时也没有什么特别的动力要写好它.主要是因为在 mysql-5.7.20 之前的版本的mgr都有着各种各 ...

  9. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  10. MySQL Group Replication 技术点

    mysql group replication,组复制,提供了多写(multi-master update)的特性,增强了原有的mysql的高可用架构.mysql group replication基 ...

随机推荐

  1. 慕课笔记-Java入门第三季

    1.自定义异常 自定义异常必须继承Exception类或者其子类. 2.字符串 String对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象. 多次创建的字符常量,Java编译程序只 ...

  2. Tyvj1474 打鼹鼠

    Description 在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……).洞口都在一个大小为n(n<=1024)的正方形中.这个正方形在一个平面直角坐标 ...

  3. iOS开发 - 多线程实现方案之NSOperation篇

    NSOperation简介 1.实现多线程编程步骤: 配合使用NSOperation和NSOperationQueue实现多线程编程,我们不用考虑线程的生命周期.同步.加锁等问题,如下: 先将需要执行 ...

  4. [題解/狀壓dp]POJ_2411_Mondriaan's dream

    关于“我读过很多书,到后来大部分都被我忘记了,那阅读的意义是什么?”的疑问,我看过最巧妙的一个回答:当我还是个孩子的时候,我吃过很多的食物,大部分已经一去不复返而且被我忘记了,但可以肯定的是,它们中的 ...

  5. python 基础(十一) pickle 序列化

    一.pickle序列化的操作 使用说明:可以将数据 转换成2进制 写入到文件中 或者之间返回 做到将数据原样写入 原样取出 import pickle (1) dump 写入文件中 pickle.du ...

  6. 洛谷 P1578 奶牛浴场

    https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...

  7. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  8. php 几个比较实用的函数

    最近在看代码,发现以下是几个比较实用的函数. 1,取客户端IP 查看复制打印? function getOnlineIp() { $strOnlineIp = ""; if(get ...

  9. Java编程基础-字符串

    在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...

  10. calendar.getTimeInMillis() 和 System.currentTimeMillis() 的区别

    @Test public void test01(){ Calendar calendar=Calendar.getInstance(); // calendar.set(2019,06,04,16, ...