MYSQL数据库的组复制

官方文档:https://dev.mysql.com/doc/refman/5.7/en/group-replication-deploying-in-single-primary-mode.html

一、Group Replication

组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的服务器组。通信层提供了很多保证,例如原子消息和总消息序号的传递。通过这些强大的特性,我们可以构建更高级的数据库复制解决方案。

MySQL组复制构建在这些属性和抽象之上,并实现多主复制协议的更新。实质上,复制组由多个数据库实例组成,并且组中的每个实例都可以独立地执行事务。但是所有读写(RW)事务只有在被组批准后才会提交。只读(RO)事务不需要在组内协调,因此立即提交。换句话说,对于任何RW事务,组需要决定是否提交,因此提交操作不是来自始发服务器的单向决定。准确地说,当事务准备好在始发服务器上提交时,该始发服务器原子地广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后为该事务建立一个全局总序号。最终,这意味着所有服务器以相同的顺序接收同一组事务。因此,所有服务器以相同的顺序应用相同的一组更改,因此它们在组内保持一致。
组复制原理图如下
这里写图片描述

二、实现组复制

server1:
编写my.conf

[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
loose-group_replication_group_name="de426da5-9c8e-11e8-95bb-5254000f5ade"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.62.1:24901"
loose-group_replication_group_seeds="172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901"
loose-group_replication_bootstrap_group=off

loose-group_replication_ip_whitelist='127.0.0.1/8,172.25.62.0/24'
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off
root@server1 mysql]# /etc/init.d/mysqld start
[root@server1 mysql]# cat  /var/log/mysqld.log |grep password  #查找密码
[root@server1 mysql]# mysql -p
 mysql> alter user root@localhost identified by 'Hello007=';
mysql>  CREATE USER rpl_user@'%' IDENTIFIED BY 'Hello007=';
mysql>  GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql>  FLUSH PRIVILEGES;
mysql> reset master;
mysql>  SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Hello007='  FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.23 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.61 sec)

这里写图片描述
新建数据库并插入数据

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');

这里写图片描述
对server2进行配置:

[root@server2 mysql]# 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="de426da5-9c8e-11e8-95bb-5254000f5ade"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.62.2:24901"
loose-group_replication_group_seeds= "172.25.62.1:24901,172.25.62.2:24901,172.25.62.3:24901"
loose-group_replication_bootstrap_group=off

loose-group_replication_ip_whitelist='127.0.0.1/8,172.25.62.0/24'
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off
[root@server2 mysql]# cat  /var/log/mysqld.log |grep password
[root@server2 mysql]# mysql  -p
mysql> alter user root@localhost  identified by 'Hello007=';
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Hello007=';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Hello007=' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (1.16 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.21 sec)
mysql> START GROUP_REPLICATION;

这里写图片描述
Server3和server2一样的配置,最后结果如下:
这里写图片描述
测试:再server3插入数据,server2查看

mysql> insert into t1 values ('2','kobe');
Query OK, 1 row affected (0.23 sec)

这里写图片描述
再server2也插入数据,server1查看

mysql> insert into t1 values  ('3','james');
Query OK, 1 row affected (0.33 sec)

这里写图片描述
之前在做的时候未设置reset master 一直是recovering 状态
这里总结一下:

Reset master的作用是:删除所有的binglog日志文件,并将日志索引文件清空,创建一个新的日志文件 起始值从000001 开始
使用场景:第一次搭建主从数据库时,用于主库的初始化binglog操作; RESET
SLAVE用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件;
使用场景:当原来的主从关系被破坏之后,从库经过重新初始化后直接连接会报 ERROR 1201的错误,运行reset
slave后,重新配置主从连接就可以了;

猜你喜欢

转载自blog.csdn.net/weixin_41476978/article/details/81709875