MySQL Group Replication简述

MySQL 组复制实现了基于复制协议的多主更新(单主模式)。

复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。

对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。

组复制使您能够根据在一组 server 中复制系统的状态来创建具有冗余的容错系统。因此,只要它不是全部或多数 server 发生故障,即使有一些 server 故障,系统仍然可用,最多只是性能和可伸缩性降低,但它仍然可用。server 故障是孤立并且独立的。它们由组成员服务来监控,组成员服务依赖于分布式故障检测系统,其能够在任何 server 自愿地或由于意外停止而离开组时发出信号。

他们是由一个分布式恢复程序来确保当有 server 加入组时,它们会自动更新组信息到最新。并且多主更新确保了即使在单个服务器故障的情况下也不会阻止更新,不必进行 server故障转移。因此,MySQL 组复制保证数据库服务持续可用。

值得注意的一点是,尽管数据库服务可用,但当有一个 server 崩溃时,连接到它的客户端必须定向或故障转移到不同的 server。 这不是组复制要解决的问题。连接器,负载均衡器,路由器或其他形式的中间件更适合处理这个问题。MySQL 组复制提供了高可用性,高弹性,可靠的 MySQL 服务。 MySQL组复制的一些限制:

1 不支持XA事务
2 表需要有主键
3 采用GTID+binlog的方式进行复制
4 只支持IPV4的网络
5 网络性能对于集群影响很大 ,需要低延迟,高带宽
6 多主不支持同一对象但是不同实例的并发的DDL+DML混合操作
7 不支持串行化操作 不支持RR模式的间隙锁,最好采用RC模式配合组复制
8 多主不支持外键约束
9 不支持事务保存点
10 集群性能取决于最差的硬件机器,所以推荐所有硬件统一配置
11 mysqldump无法备份GR实例
12 目前集群限制最多允许9个节点。

以上参考了网络上一些博客,原理的东西网上东西还是很多的,大家可以自行百度。

关于组复制的一些详细加强,可以看一下我们星耀队的译文MySQL 8.0.2复制新特性(翻译)

1:安装环境
机器 IP
SERVER1 172.16.16.31
SERVER2 172.16.16.34
SERVER3 172.16.16.35

MySQL的版本是5.7.20,我们先在三台主机安装好MySQL并且启动,详细安装参考MySQL5.7.20编译安装,基本环境搭建完成以后我们来看一下MySQL Group Replication的配置

2:配置安装MySQL Group Replication

我们现在三台机器上已经配置好了三台MySQL服务,我们要在我们当前配置文件的基础上加上GR的一些参数,我们以SERVER1为例:

# GR 配置项 其中loose前缀表示若Group Replication plugin未加载 mysql server仍继续启动
binlog_checksum=NONE #MGR本身不支持binlog的checksum校验
transaction_write_set_extraction=XXHASH64
group_replication_group_name="00e575aa-0cc0-11e8-9186-0050569341db" # 组名
group_replication_start_on_boot=off # 在mysqld启动时不自动启动组复制
group_replication_local_address="172.16.16.35:24901"
group_replication_group_seeds="172.16.16.34:24901,172.16.16.35:24901,172.16.16.31:24901"
group_replication_bootstrap_group=off

我们之前已经加过一些必须的参数了,我们看看GR需要的其他参数:

gtid-mode=on
enforce_gtid_consistency = ON #GTID模式是组复制的基础技术
master_info_repository = TABLE
relay_log_info_repository = TABLE #管理复制的元数据和恢复用,记录同步的信息,便于管理和恢复
log-bin=row #必须是ROW格式
log_slave_updates = ON #需要记录事务的binlog,用作以后的恢复用,哪怕不是写入点,也需要

接下来我们要创建GR所使用的账号:

set sql_log_bin=0;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY '';
flush privileges;
set sql_log_bin=1;

我们先在主库执行:

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;

然后在SERVER2,和server3上执行:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;

然后去看一下节点:

mysql> select * from performance_schema.replication_group_members;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 145
Current database: mxq +---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 096769f1-de4e-11e7-bc85-0050569355e1 | sdw1 | 3306 | ONLINE |
| group_replication_applier | 6899e4bf-de91-11e7-a3bb-005056930bed | sdw2 | 3306 | ONLINE |
| group_replication_applier | c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

我们可以通过查看MEMBER_STATE来确认节点的状态:

online
offline 离线
recoving 恢复中
unreachable 不可到达,查看错误日志
error 同步发生错误,查看错误日志

查看一下主节点是那个:

mysql> SELECT b.member_id, b.member_host, b.member_port  FROM performance_schema.global_status a   JOIN performance_schema.replication_group_members b
-> ON a.variable_value = b.member_id WHERE a.variable_name= 'group_replication_primary_member';
+--------------------------------------+-------------+-------------+
| member_id | member_host | member_port |
+--------------------------------------+-------------+-------------+
| c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw | 3306 |
+--------------------------------------+-------------+-------------+
1 row in set (0.00 sec)

我们可以看到现在主节点是SERVER1,GR当中所有的从节点都是默认为read_only的。我们也可以通过以下系统表来检测GR的信息:

mysql> select * from performance_schema.replication_group_member_stats\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
VIEW_ID: 15181587863063562:15
MEMBER_ID: c6b0f3b3-de40-11e7-9dbd-0050569341db
COUNT_TRANSACTIONS_IN_QUEUE: 0
COUNT_TRANSACTIONS_CHECKED: 0
COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 0
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 00e575aa-0cc0-11e8-9186-0050569341db:1-17
LAST_CONFLICT_FREE_TRANSACTION:
1 row in set (0.00 sec)

我们可以看到现在的三台机器是单主模式的,我们把他修改为多主模式的话怎么改呢,但是我们强烈建议不要使用多主模式 ,因为多主模式下很容易hang住整个集群,而且很多的限制都是限制多主模式,如果我们要把单主修改为多主,只用做如下操作就好:

SERVER2,SERVER3:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_single_primary_mode=FALSE;
SET GLOBAL group_replication_enforce_update_everywhere_checks=TRUE;

SERVER1:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_single_primary_mode=FALSE;
SET GLOBAL group_replication_enforce_update_everywhere_checks=TRUE;
SET GLOBAL group_replication_bootstrap_group=on;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=off;

然后SERVER2,SERVER3:

START GROUP_REPLICATION;

我们在查看一下节点信息:

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 096769f1-de4e-11e7-bc85-0050569355e1 | sdw1 | 3306 | ONLINE |
| group_replication_applier | 6899e4bf-de91-11e7-a3bb-005056930bed | sdw2 | 3306 | ONLINE |
| group_replication_applier | c6b0f3b3-de40-11e7-9dbd-0050569341db | mdw | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

发现三个节点已经全部OK了,做一下测试:

SERVER1:

mysql> use mxq;
Database changed
mysql> create table gr(id int ,name varchar(10),primary key(id));
Query OK, 0 rows affected (0.06 sec) mysql> insert into gr(1,'a');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1,'a')' at line 1
mysql> insert into gr values(1,'a');
Query OK, 1 row affected (0.05 sec)

SERVER2:

mysql> insert into gr values(2,'a');
Query OK, 1 row affected (0.01 sec)

SERVER3:

mysql> insert into gr values(3,'a');
Query OK, 1 row affected (0.04 sec)

然后查看数据:

mysql> select * from gr;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | a |
| 3 | a |
+----+------+
3 rows in set (0.00 sec)

这样就OK了。

从多主模式修改为单主模式

SERVER2,SERVER3:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_enforce_update_everywhere_checks=OFF;
SET GLOBAL group_replication_single_primary_mode=TRUE;

SERVER1:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_enforce_update_everywhere_checks=OFF;
SET GLOBAL group_replication_single_primary_mode=TRUE;
SET GLOBAL group_replication_bootstrap_group=on;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=off;

然后SERVER2,SERVER3:

START GROUP_REPLICATION;

这样就OK了。

MySQL Group Replication配置的更多相关文章

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

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

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

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

  3. MySQL Group Replication 技术点

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

  4. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集

             本文主要描述 MySQL Group Replication的简易原理.搭建过程以及故障维护管理内容.由于是新技术,未在生产环境使用过,本文均是虚拟机测试,可能存在考虑不周跟思路有误 ...

  5. MySQL Group Replication 动态添加成员节点

    前提: MySQL GR 3节点(node1.node2.node3)部署成功,模式定为多主模式,单主模式也是一样的处理. 在线修改已有GR节点配置 分别登陆node1.node2.node3,执行以 ...

  6. Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication

    Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication Overview Galera Cluster 由 Coders ...

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

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

  8. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集(转)

    如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 

  9. MySQL group replication介绍

    “MySQL group replication” group replication是MySQL官方开发的一个开源插件,是实现MySQL高可用集群的一个工具.第一个GA版本正式发布于MySQL5.7 ...

随机推荐

  1. 使用epublib解析epub文件(章节内容、书籍菜单)

    链接地址https://blog.csdn.net/sonnyching/article/details/47407549

  2. Django如何让未登录的用户自动跳转至登录页

    有多种方法可以实现: 使用Django自带的用户认证 from django.contrib.auth.decorators import login_required @login_required ...

  3. 在Linux系统安装Nodejs最简单步骤

    一.去官网下载和自己系统匹配的文件 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过  uname -a ...

  4. [笔记] Python 图片转字符画

    一.介绍 用Python 代码完成图片转字符画 二.python 环境 Python 3.6.6 pillow 5.1.0  Python 图像处理库, 需要另外安装 三.原理 gray = 0.21 ...

  5. .Net Core全球化多语言

    参照:ASP.NET Core 全球化和本地化 步骤如下: 后台中的本地化. Startup.cs中注册服务并制定Resource文件的位置.注意:这里的位置不仅仅应用到Web层,如Infrastru ...

  6. APS审核经验+审核资料汇总——计算机科学与技术专业上海德语审核

    1.APS是什么 德国驻华使馆文化处留德人员审核部(简称APS)成立于2001年7月,是由德国驻华使馆文化处和德意志学术交流中心(DAAD)在北京共同合作成立的服务机构. APS是中国学生前往德国留学 ...

  7. 不会几个框架,都不好意思说搞过前端: React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  8. c#socket TCP同步网络通信

    一.socket简介 socket就是套接字,它是引用网络连接的特殊文件描述符,由三个基本要素组成: 1: AddressFamily(网络类型) 2: SocketType(数据传输类型) 3:Pr ...

  9. dll(动态链接库)的编写

    很可能有人会困惑dll究竟是什么,又改如何编写dll呢?今天,我就记录下编写以及调用动态链接库的步骤吧. 1.启动visuanl 6.0,新建工程 dll,如上图 2.在Source File中新建一 ...

  10. [javaSE] 单例设计模式

    四人帮设计了23中设计模式 单例设计模式:解决一个类在内存中只存在一个对象 构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取该对象 class Single{ private static ...