一、组复制介绍

1.原理

        组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制。 这些是非常强大的功能,我们可以据此架构设计更高级的数据库复制解决方案。MySQL 组复制以这些功能和架构为基础,实现了基于复制协议的多主更新。
        复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的部术更改,以确保组内一致。

        在不同 server 上并发执行的事务可能存在冲突。 根据组复制的冲突检测机制,对两个不同的并发事务的写集合进行检测。如在不同的 server 成员执行两个更新同一行的并发事务,则会出现技库冲突。排在最前面的事务可以在所有 server 成员上提交,第二个事务在源 server 上回滚,并在组中的其他 server 上删除。 这就是分布式的先提交当选规则。

MySQL 开启了并行复制 mysql组提交 并行复制_sql

 

        最后,组复制是一种 share-nothing 复制方案,其中每个 server 成员都有自己的完整数据副本。上图描述了 MySQL 组复制协议,并通过将其与 MySQL 复制(MySQL 半同步复制)进行比较,可以看到一些差异。 需要注意的是,这个图片中不包含一些基本共识和 Paxos 相关的信息。

2.优点

  • 弹性复制 - 需要非常流畅的复制基础架构环境,其中 server 的数量必须动态增长或收缩,并尽可能减少副作用。 例如,云数据库服务 。
  • 高可用分片( Shards ) - 分片是实现写扩展的常用方法。 使用 MySQL 组复制实现高可用性分片,其中每个分片映射到一个复制组。
  • 替代主从复制 - 在某些情况下,使用单个主服务器会造成单点争用,写入整个组可能更具可扩展性。
  • 自动系统 - 此外,您可以将 MySQL 组复制直接部署到已有复制协议的自动化系统中(在本章和前面的章节中已经描述过) 。

二、部署组复制

1.sever1:

将软件使用scp传到server1和server2和server3

安装mysql软件

yum install mysql-community-common-5.7.24-1.el7.x86_64.rpm 
mysql-community-client-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm 
mysql-community-server-5.7.24-1.el7.x86_64.rpm -y

然后修改数据库设置文件

需要注意的是uuid必须是三台主机一致,可以通过命令uuidgen获取

vim /etc/my.cnf                    ##添加下面的语句

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

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="f56874d5-2c2c-4c10-84ae-2cf892ac5d58"  
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.1:24901"  //本机IP
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_ip_whitelist="172.25.1.0/24,127.0.0.1"

接下来进行mysql设置

systemctl start mysqld
cat /var/log/mysqld.log |grep password            ##查看初始化密码
mysql_secure_installation                         ##安全初始化,密码设置为了Mysql1994.
mysql -pMysql1994.                                ##登陆数据库
    
    mysql> SET SQL_LOG_BIN=0;    #禁用二进制日志
    mysql> CREATE USER rpl@'%' IDENTIFIED BY 'Mysql1994.';
    mysql> GRANT REPLICATION SLAVE ON *.* TO rpl@'%';  ##加用户权限
    mysql> FLUSH PRIVILEGES;    ##刷新策略
    mysql> SET SQL_LOG_BIN=1;    #启用二进制日志
    mysql> CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='Mysql1994.' FOR CHANNEL 'group_replication_recovery';
    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';    ##安装组插件
    mysql> SHOW PLUGINS;    ##查看安装的插件
    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;    ##查看组复制成员的状态

2.sever2:

安装mysql软件

yum install mysql-community-common-5.7.24-1.el7.x86_64.rpm 
mysql-community-client-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm 
mysql-community-server-5.7.24-1.el7.x86_64.rpm -y

然后修改数据库设置文件

vim /etc/my.cnf                    ##添加下面的语句

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

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="f56874d5-2c2c-4c10-84ae-2cf892ac5d58"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.2:24901"
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_ip_whitelist="172.25.1.0/24,127.0.0.1"

接下来进行mysql设置

systemctl start mysqld
cat /var/log/mysqld.log |grep password            ##查看初始化密码
mysql_secure_installation                         ##安全初始化,密码设置为了Mysql1994.
mysql -pMysql1994.                                ##登陆数据库
 
    mysql> SET SQL_LOG_BIN=0;
    mysql> CREATE USER rpl@'%' IDENTIFIED BY 'Mysql1994.';
    mysql> GRANT REPLICATION SLAVE ON *.* TO rpl@'%';
    mysql> FLUSH PRIVILEGES;
    mysql> SET SQL_LOG_BIN=1;
    mysql> CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='Mysql1994.' FOR CHANNEL 'group_replication_recovery';
    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    mysql> reset master;        ##slave要先reset,才能开启组复制成功,否则会报错
    mysql> START GROUP_REPLICATION;
    mysql> SELECT * FROM performance_schema.replication_group_members;

3.sever3:

安装mysql软件

yum install mysql-community-common-5.7.24-1.el7.x86_64.rpm 
mysql-community-client-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-5.7.24-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm 
mysql-community-server-5.7.24-1.el7.x86_64.rpm -y

然后修改数据库设置文件

vim /etc/my.cnf                    ##添加下面的语句

server-id=3
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

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="f56874d5-2c2c-4c10-84ae-2cf892ac5d58"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.1.3:24901"
loose-group_replication_group_seeds= "172.25.1.1:24901,172.25.1.2:24901,172.25.1.3:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_ip_whitelist="172.25.1.0/24,127.0.0.1"

接下来进行mysql设置

systemctl start mysqld
cat /var/log/mysqld.log |grep password            ##查看初始化密码
mysql_secure_installation                         ##安全初始化,密码设置为了Mysql1994.
mysql -pMysql1994.                                ##登陆数据库
 
    mysql> SET SQL_LOG_BIN=0;
    mysql> CREATE USER rpl@'%' IDENTIFIED BY 'Mysql1994.';
    mysql> GRANT REPLICATION SLAVE ON *.* TO rpl@'%';
    mysql> FLUSH PRIVILEGES;
    mysql> SET SQL_LOG_BIN=1;
    mysql> CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='Mysql1994.' FOR CHANNEL 'group_replication_recovery';
    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    mysql> reset master;        ##slave要先reset,才能开启组复制成功,否则会报错
    mysql> START GROUP_REPLICATION;
    mysql> SELECT * FROM performance_schema.replication_group_members;

三、测试

1.查看状态

MySQL 开启了并行复制 mysql组提交 并行复制_MySQL_02

如上图显示为online就是成功了,在这个过程中我遇到了错误,server2和server3的status为recovering,经过检查,发现是三台虚拟机的解析有问题,注意:这个实验一定要三台虚拟机全部都有解析,否则master用户无法远程登陆成功,所以就会出现上面的错误,还有可能就是你的远程登陆的用户密码设置错误,也会导致着一个错误。

2.实验

在server1插入数据

mysql> CREATE DATABASE xupt;
mysql> use xupt;
mysql> CREATE TABLE nelws (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO nelws VALUES (1, 'Lei');
mysql> SELECT * FROM nelws;

MySQL 开启了并行复制 mysql组提交 并行复制_sql_03

在server2和server3上查看

MySQL 开启了并行复制 mysql组提交 并行复制_mysql_04

ok~

组复制设置成功~