组复制有两种模式:单主模式和多主模式。

1.在单主模式下,组复制具有自动选主功能,每次只有一个 server成员接受更新。
2.在多主模式下,所有的 server 成员都可以同时接受更新。

MGR的限制:
仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
目前一个MGR集群最多支持9个节点
不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
二进制日志不支持binlog event checksum
环境:

在三台db服务器上面配置映射/etc/hosts:

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.91.21 master
192.168.91.26 node2
192.168.91.27 node1

数据库配置文件(三台服务器):

# Group Replication

server_id = 100  #服务ID
gtid_mode = ON  #全局事务
enforce_gtid_consistency = ON  #强制GTID的一致性
master_info_repository = TABLE  #将master.info元数据保存在系统表中
relay_log_info_repository = TABLE  #将relay.info元数据保存在系统表中
binlog_checksum = NONE  #禁用二进制日志事件校验
log_slave_updates = ON  #级联复制
log_bin = binlog   #开启二进制日志记录
binlog_format= ROW  #以行的格式记录
transaction_write_set_extraction = XXHASH64 #使用哈希算法将其编码为散列
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的组名
loose-group_replication_start_on_boot = off #为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_local_address = 'master:33061' #以本机端口33061接受来自组中成员的传入连接   根据实际情况填写
loose-group_replication_group_seeds ='master:33061, node1:33062, node2:33063' #组中成员访问表    根据实际情况填写
loose-group_replication_bootstrap_group = off #不启用引导组             
loose-group_replication_single_primary_mode = off  #关闭单master模式
loose-group_replication_enforce_update_everywhere_checks = ON  #多主一致性检查
重启数据库:

[root@master ~]# systemctl restart mysqld
[root@node1 ~]# systemctl restart mysqld
[root@node2 ~]# systemctl restart mysqld

安装插件(三台都需要安装):

mysql> install PLUGIN group_replication SONAME 'group_replication.so';

-- 查看group replication组件

mysql> show plugins;

master操作:

mysql> set SQL_LOG_BIN=0;   #停掉日志记录

mysql> grant replication slave on *.* to repl@'192.168.91.%' identified by 'kavl7kAkkle!';

mysql> flush privileges;

mysql> set SQL_LOG_BIN=1;  #开启日志记录

mysql> change master to master_user='repl',master_password='kavl7kAkkle!'  for channel 'group_replication_recovery';  #构建group replication集群

mysql> SET GLOBAL group_replication_bootstrap_group=ON;    
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 775dec89-ac6e-11e9-bfe6-000c29de2cf7 | master      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
node1和node2上操作:

mysql> set SQL_LOG_BIN=0;   #停掉日志记录

mysql> grant replication slave on *.* to repl@'192.168.91.%' identified by 'kavl7kAkkle!';

mysql> flush privileges;

mysql> set SQL_LOG_BIN=1;  #开启日志记录

mysql> change master to master_user='repl',master_password='kavl7kAkkle!'  for channel 'group_replication_recovery';  #构建group replication集群

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> reset master;
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.02 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;    查看模块是否完成
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 775dec89-ac6e-11e9-bfe6-000c29de2cf7 | master      |        3306 | ONLINE       |
| group_replication_applier | cb087360-ac2c-11e9-9d6c-000c29cf4f9a | node2       |        3306 | ONLINE       |
| group_replication_applier | e919c066-ac2c-11e9-be9e-000c29f2dbd7 | node1       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

至此组搭建完成,组中有三个成员。

测试:

在三个成员上分别创建master、node1、node2库。

初始库:

库已经同步了。

在master上创建数据:

mysql> use master;
Database changed
mysql> create table t1 (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(1,'master');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values(2,'node1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values(3,'node3');
Query OK, 1 row affected (0.01 sec)

在另外两台数据库上查看,数据已经同步了。

模拟一个人节点宕机:

[root@master ~]# systemctl stop mysqld
在node1上查看组成员信息发现master节点已经不再组中了:

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | cb087360-ac2c-11e9-9d6c-000c29cf4f9a | node2       |        3306 | ONLINE       |
| group_replication_applier | e919c066-ac2c-11e9-be9e-000c29f2dbd7 | node1       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)

在node1上写入数据:

mysql> insert into t1 values(4,'test1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | master |
|  2 | node1  |
|  3 | node3  |
|  4 | test1  |
+----+--------+
4 rows in set (0.00 sec)

启动master节点的数据库:

[root@master ~]# systemctl start mysqld
mysql> use master;
Database changed

查看数据此时数据没有同步过来
mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | master |
|  2 | node1  |
|  3 | node3  |
+----+--------+
3 rows in set (0.00 sec)
加入组中:
mysql> start group_replication;
Query OK, 0 rows affected (3.22 sec)
mysql> select * from performance_schema.replication_group_members; 此时master节点已经加入到组中了。
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 775dec89-ac6e-11e9-bfe6-000c29de2cf7 | master      |        3306 | ONLINE       |
| group_replication_applier | cb087360-ac2c-11e9-9d6c-000c29cf4f9a | node2       |        3306 | ONLINE       |
| group_replication_applier | e919c066-ac2c-11e9-be9e-000c29f2dbd7 | node1       |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

查看数据,此时已经同步了。
mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | master |
|  2 | node1  |
|  3 | node3  |
|  4 | test1  |
+----+--------+
4 rows in set (0.00 sec)

MGR---mysql组复制多主模式的更多相关文章

  1. Mysql组复制之单主模式(一)

    环境 系统:CentOS release 6.9 (Final) Mysql:5.7 机器: S1 10.0.0.7 lemon S2 10.0.0.8 lemon2 S3 10.0.0.9 lemo ...

  2. MySQL中间件之ProxySQL(15):ProxySQL代理MySQL组复制

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL+组复制前言 在以前的ProxySQL版本中,要支 ...

  3. 【MySQL 组复制】1.组复制技术简介

    组复制有两种模式 单主模式(single-primary/single-master)下自动选举出一个主节点,从而只允许在同一时刻只有该主节点可以更新数据. 对于MySQL的高级使用人员,可以通过复制 ...

  4. mysql组复制集群简介

    mysql组复制集群拓扑: 环境: centos6.5 mysql5.7.19 一.组复制搭建: 配置hosts文件 再三台服务器上分别启动一个mysql实例,共三个. 参考配置文件如下: serve ...

  5. 使用MySQL组复制的限制和局限性

    本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...

  6. MySQL组复制MGR(四)-- 单主模式与多主模式

    (一)概述 组复制可以运行在单主模式下,也可以运行在多主模式下,默认为单主模式.组的不同成员不能部署在不同模式下,要切换模式,需要使用不同配置重新启动组而不是单个server. 相关参数如下: # 该 ...

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

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

  8. MySQL组复制MGR(二)-- 组复制搭建

    (一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...

  9. mysql组复制安装

    参考文档 https://blog.csdn.net/li123128/article/details/80744568 https://www.cnblogs.com/ctulzq/p/863109 ...

随机推荐

  1. CentOS7/RHEL6下,如何查看目录与子目录大小

    原文:CentOS7/RHEL6下,如何查看目录与子目录大小 通过强大的[du]命令,可以帮助我们快捷的查看目录的大小,非常实用. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du ...

  2. linux 用户切换组

    问题: 因为默认的的网站路径 /var/www/html 是root 用户 root组的, 想要修改什么的需要用sudo 很麻烦. 解决: 将当前用户 hehecat加入至root组,使之有权限对目录 ...

  3. JDBC 学习复习8 C3P0数据源使用

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. c3p0与dbcp区别 dbcp ...

  4. Asp.Net Core 轻松学系列-3项目目录和文件作用介绍

    目录 前言 结语 前言     上一章介绍了 Asp.Net Core 的前世今生,并创建了一个控制台项目编译并运行成功,本章的内容介绍 .NETCore 的各种常用命令.Asp.Net Core M ...

  5. [转载]三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法

    [转载]三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法 来源:https://blog.csdn.net/xbinworld/article/details/656 ...

  6. Go 字符串使用

    Go语言中的字符串 Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码,这样每一个Unicode字符根据代码点的大小使用1.2.3或4个字节表示代码点.Go 语言中的字符串 ...

  7. Array + two points leetcode.15-3Sum

    题面 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Fi ...

  8. OpenCV手工实现灰度及RGB直方图

    手工实现灰度及RGB直方图 !库 1. 灰度图像直方图 算法 1. 图片灰度化: 2. 遍历Mat,统计各灰度级的像素个数: 3. 根据opencv画点线函数,绘制坐标轴及像素分布图 源码(编译环境: ...

  9. Image Processing and Analysis_8_Edge Detection:Local Scale Control for Edge Detection and Blur Estimation——1998

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  10. 11_Azkaban案例实践4_Command操作MapReduce

    MAPREDUCE任务 Mr任务依然可以使用command的job类型来执行 1.创建job描述文件,及mr程序jar包(示例中直接使用hadoop自带的example jar) # mrwc.job ...