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. mac 系统安装VM虚拟机打开时报错,提示不是虚拟磁盘的解决方式。

    最近刚买的苹果系统,不太会用,装了个虚拟机vmware fusion,好不容易把需要的软件装好,然后不知道是我操作了哪里,今天再次打开虚拟机的时候打不开了,报错提示找不到磁盘文件(虚拟磁盘-00000 ...

  2. elasticsearch(四) 之 elasticsearch常用的一些集群命令

    目录 elasticsearch常用的一些集群命令 查看集群健康状态 查看集群的节点列表 查看所有的索引 删除索引 查询索引的某个文档内容 更新文档 删除文档 自动创建索引 定时删除索引 elasti ...

  3. 使用signtool.exe来验证程序的数字签名是否成功(命令行)

    signtool.exe是微软提供的数字签名工具,使用如下 signtool verify /pa YourApplicationName

  4. fiddler工作原理和设置代理问题

    1,什么是Fiddler Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的 ...

  5. Codeforces 960G. Bandit Blues

    Description 你需要构造一个长度为 \(n\) 的排列 , 使得一个数作为前缀最大值的次数为 \(A\) , 作为后缀最大值的次数为 \(B\) , 求满足要求的排列个数 . 题面 Solu ...

  6. ping过程详细解读

    0. 前言 在讲解ping过程之前,我们需要了解以下概念. 1). 何为ping   PING (Packet Internet Groper),因特网包探索器,用于测试网络连通性的程序.   Pin ...

  7. [转]WebForm中使用MVC

    本文转自:https://www.cnblogs.com/encoding/articles/3556046.html 前言 掐指一算,3年没写博了,好懒的说... 众所周知,MVC现在越来越火了,不 ...

  8. Ionic项目中如何使用Native Camera

    本文介绍如何在ionic项目中使用设备的camera. Ionic版本:v3.2.0 / 2017-05-10 / MIT Licensed / Release Notes ============= ...

  9. 【转】SpringBoot系列之—瘦身部署

    一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼: 编译出来的 Jar 包很大,如果工程引入了许多开源组件 ...

  10. THUSC2017 游记

    你若安好,便是晴天. Day 0 中午就要出发了,上午浮躁的不行,根本写不下题去. 到了火车站之后发现教练和lyc和ztc在4车靠近5车的那一边,然而我在5车靠近4车的那边,尴尬…… 本来是想着上了火 ...