MySQL Group Replication 简介及Single-Primary Mode 配置

MySQL Group Replication

对比

在介绍组复制之前,我们先简单介绍传统的异步复制和半同步复制:

传统复制

传统mysql复制是完全异步化的复制。有一个主和不等数量的从。主节点执行的事务会异步发送给从节点,在从节点重新执行。下图描述了传统复制的原理:
这里写图片描述
* master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不care。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。
* 假设master发生宕机并且binlog还没来得及被slave接收,而切换程序将slave提升为新的master,就会出现数据不一致的情况!另外,在高并发的情况下,传统的主从复制,从节点可能会与主产生较大的延迟(当然mysql后续版本陆续做了优化,推出了并行复制,以此降低异步复制的延迟)。

半同步复制

基于传统异步存在的缺陷,mysql在5.5版本推出半同步复制。可以说半同步复制是传统异步复制的改进,在master事务的commit之前,必须确保一个slave收到relay log并且响应给master以后,才能进行事务的commit。但是slave对于relay log的应用仍然是异步进行的,原理如下图所示:
这里写图片描述
* 因为slave接受relay log之后有可能apply失败。这个时候master其实不知道slave的失败,照常提交了这个事务。并且,半同步复制只确保一个slave能够收到relay log,多slave的场景下,不能保证其他节点正确收到relay log,由此,当发生master切换后,半同步复制一样也会出现数据不一致的情况。

组复制

基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。如下图所示,由3个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发生组间通讯,由2个节点决议(certify)通过这个事务,事务才能够最终得以提交并响应。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
一个复制组由若干个节点(数据库实例)组成,组内各个节点维护各自的数据副本(Share Nothing),通过一致性协议实现原子消息和全局有序消息,来实现组内实例数据的一致。
这里写图片描述

组复制介绍

MySQL Group Replication 基于分布式一致性协议Paxos实现数据最终一致性的高可用和高扩张的MySQL集群服务。

优点
  • 高一致性:基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证;
  • 高容错性:大多数服务正常就可继续工作,自动不同节点检测资源征用冲突,按顺序优先处理,内置自动防脑裂机制;
  • 高扩展性:自动添加移除节点,并更新组信息;
  • 高灵活性:单主模式和多主模式。单主模式自动选主,所有更新操作在主进行;多主模式,所有server同时更新。
限制条件
  • 存储引擎必须为innodb
  • 每个表必须提供主键
  • 只支持ipv4,网络需求较高
  • 一个group最多只能有9台服务器

两种模式

GR提供了single-primary和multi-primary两种模式。

  • single-primary模式下,组内只有一个节点负责写入,读可以从任意一个节点读取,组内数据保持最终一致;当primary节点意外宕机或者下线,在满足大多数节点存活的情况下,group内部发起选举,选出下一个可用的读节点,提升为primary节点。primary选举根据group内剩下存活节点的server_uuid按字典序升序来选择,即剩余存活的节点按server_uuid字典序排列,然后选择排在最前的节点作为新的primary节点。
    注意:在切换primary期间,mysql group不会处理应用重连接到新的主,这需要应用层自己或者由另外的中间件层(proxy or router)去保证。
  • multi-primary模式即为多写方案,即写操作会下发到组内所有节点,组内所有节点同时可读可写,该模式也是能够保证组内数据最终一致性。

注意,一个GR的所有节点必须配置使用同一种模式,不可混用。比如说A、B、C三个节点组成一个GR组,那么要么都运行在single-primary模式下,要么都运行在multi-primary模式下。

single-primary 模式部署

环境准备

三台已安装了MySQL的新环境(MySQL_5.7.19)

  • 修改三台机器的主机名分别为: db1 db2 db3
vi /etc/sysconfig/network  
HOSTNAME= db1
  • 分别在三台机器上设置/etc/hosts 映射,如下
192.168.17.111 db1
192.168.17.95 db2
192.168.17.75 db3
  • 重启机器使其生效:reboot

注意:由于在openstack上创建的三个MySQL实例的server-uuid都一样,因此需要做如下操作
找到MySQL的auto.cnf文件,将其删除,然后在重启MySQL服务即可。

配置组复制实例
复制框架

在MySQL配置文件中添加如下设置

[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
组复制设置

在MySQL配置文件只添加如下设置,为服务器配置组复制设置

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.17.111:24901"
loose-group_replication_group_seeds= "192.168.17.111:24901,192.168.17.95:24902,192.168.17.75:24903"
loose-group_replication_bootstrap_group= off
用户凭证
  • 启动MySQL服务
  • 创建拥有replication slave权限的mysql用户
mysql> SET SQL_LOG_BIN=0;  //不写入二进制日志,避免修改传递给其他实例,先关闭
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;  //开启二进制写入
  • 使用change master to语句将下一次需要从其他成员恢复其状态的服务器配置为使用group_replication_recovery复制通道的给定凭据。
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password'  FOR CHANNEL 'group_replication_recovery';
启动组复制
  • 安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

检查插件是否安装成功,发出show plugins;

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+-------------+
| Name                       | Status   | Type               | Library              | License     |
+----------------------------+----------+--------------------+----------------------+-------------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | PROPRIETARY |

(...)

| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | PROPRIETARY |
+----------------------------+----------+--------------------+----------------------+-------------+
  • 启动组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

一旦启动group_replication语句返回,该组就已启动。您可以检查该组是否已创建,并且该组中有一个成员:

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 | myhost      |       24801 | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
  • 测试
    为了证明服务器确实在一个组中并且它能够处理负载,创建一个表并向其添加一些内容。
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');

检查表t1和二进制日志的内容。

mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

mysql> SHOW BINLOG EVENTS;
添加实例到复制组中

为了添加第二个实例,服务器s2,首先为它创建配置文件。该配置与用于服务器s1的配置类似,s2要侦听的端口或其server_id等内容除外。
mysql.cnf配置文件如下

[mysqld]

# Replication configuration parameters
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

# Group Replication configuration
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.17.95:24902"
loose-group_replication_group_seeds= "192.168.17.111:24901,192.168.17.95:24902,192.168.17.75:24903"
loose-group_replication_bootstrap_group= off
  • 启动MySQL服务
  • 然后按如下方式配置
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  • 安装组复制插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
  • 将服务器s2添加到组中
START GROUP_REPLICATION;
  • 检查
SELECT * FROM performance_schema.replication_group_members;

两个实例都是online状态,则表示添加成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值