组复制原理

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

mysql组复制切换 mysql组复制原理_mysql组复制切换

1.组复制 server 设置

[root@server1 mysql]# /etc/init.d/mysqld stop
[root@server1 mysql]# cd /var/lib/mysql
[root@server1 mysql]# ls
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# vim /etc/init.d/mysqld 
删除113-118行

mysql组复制切换 mysql组复制原理_冲突检测_02

添加脚本

[root@server1 mysql]# 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   #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="a39d50a7-9ca4-11e8-a9db-525400ab018e"    #UUID(可以在server2或者server3中查看)
loose-group_replication_start_on_boot=off    #设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "172.25.71.1:24901"  #本机IP
loose-group_replication_group_seeds="172.25.71.1:24901,172.25.71.2:24901,172.25.71.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.71.0/24,127.0.0.1/8"   #白名单
[root@server1 mysql]# /etc/init.d/mysqld start
[root@server1 mysql]# /etc/init.d/mysqld restart

mysql组复制切换 mysql组复制原理_Server_03

2.启动组复制

[root@server1 ~]# grep password /var/log/mysqld.log     ##查看初始化密码
[root@server1 ~]# mysql -p
mysql> alter user root@localhost identified by 'Redhat!123';   #更改密码
mysql> set sql_log_bin=0;
mysql> grant replication slave on *.* to rpl_user@'%' identified by 'Redhat!123';
mysql> flush privileges;     #刷新
mysql> reset master;     #重置master
mysql> set sql_log_bin=1;     #操作写入日志
mysql> change master to master_user='rpl_user', master_password='Redhat!123' for channel 'group_replication_recovrey';    #连接   
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';   #安装组复制插件
mysql> SHOW PLUGINS;   #要检查插件是否已成功安装,并检查输出
mysql> STOP GROUP_REPLICATION;     
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

查看server1的状态是ONLINE

mysql组复制切换 mysql组复制原理_Server_04

在server3中同样的步骤,在/etc/my.cnf 文件中需要更改server-id和IP

在server3中,加载完插件后,直接执行START GROUP_REPLICATION;

要都是ONLINE

mysql组复制切换 mysql组复制原理_冲突检测_05

3.测试:

在server1中建立表,添加用户

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,'111');
mysql> select * from t1;

mysql组复制切换 mysql组复制原理_mysql_06

在server3添加用户

mysql组复制切换 mysql组复制原理_冲突检测_07


在server1查看,会同步复制

mysql组复制切换 mysql组复制原理_冲突检测_08