组复制原理

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

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

配置环境

组复制中的每一个实例(MySQL服务器)可以运行在独立的物理机上或者在同一台机器上。此部分将讲述如何用三台 MySQL服务器建立一个组复制 。

server1(rhel6.5): 172.25.66.1,mysql-5.7
 server2(rhel6.5):172.25.66.2,mysql-5.7
 server3(rhel6.5):172.25.66.3,mysql-5.7

配置mysql组复制

1:在三个节点server1,2,3停掉之前的数据库服务,清空数据库数据目录(/var/lib/mysql)中所有的缓存记录。((server1、2、3都做)

/etc/init.d/mysqld stop
 cd /var/lib/mysql
 rm -fr *

mysql关闭组复制 组复制 mysql_mysql


2:修改三个节点的配置文件,(注意server-id和loose-group_replication_local_address对应每台主机)

vim /etc/my.cnf

server-id=1       # server-id三个节点保持不同
gtid_mode=ON      # gtid模式打开
enforce-gtid-consistency=true

master_info_repository=TABLE    # 把relay.info记录在slave_relay_log_info表里
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='d14fed72-9c7c-11e8-b20c-525400b41bb7' #uuid唯一标记一个组,可以使用uuidgen命令生成,然后复制到这里
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.25.66.1:24901"   # 自身的ip地址
loose-group_replication_group_seeds="172.25.66.1:24901,172.25.66.2:24901,172.25.66.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.66.0/24,127.0.0.1/8"

mysql关闭组复制 组复制 mysql_数据库_02


配置完成之后启动服务/etc/init.d/mysqld start

3:登录到mysql

以原始密码登录数据库并修改密码

[root@server1 mysql]# cat /var/log/mysqld.log | grep temp   ##查找原始密码
 
mysql> alter user root@localhost identified by 'Guodong+0306';  #用原始密码登录后,alter命令修改数据库密码
Query OK, 0 rows affected (0.05 sec)
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql关闭组复制 组复制 mysql_数据库_03


mysql关闭组复制 组复制 mysql_数据库_04


注意:用原始密码虽可以进入数据库,但不能对数据库进行操作的。需修改密码之后才可以。

4:在数据库里面进行具体操作

(1)不开启日志同步
 SET SQL_LOG_BIN=0; #
 (2)向repl用户授予所有权限,所有用户均可利用repl用户同步
 GRANT REPLICATION SLAVE ON * .* TO repl@’%’ IDENTIFIED BY ‘Guodong+0306’;
 (3)刷新授权表
 FLUSH PRIVILEGES;
 (4)reset master;
 (5)开启日志记录
 SET SQL_LOG_BIN=1;
 (6)CHANGE MASTER TO MASTER_USER=’repl’,MASTER_PASSWORD=’Guodong+0306’ FOR CHANNEL ‘group_replication_recovery’;
 (7)INSTALL PLUGIN group_replication SONAME ‘group_replication.so’;
 (8)SHOW PLUGINS;
 (9)SET GLOBAL group_replication_bootstrap_group=ON;
 (10)START GROUP_REPLICATION;
 (11)SET GLOBAL group_replication_bootstrap_group=OFF;
 (12)SELECT * FROM performance_schema.replication_group_members;

server1配置完成后处于online状态:

mysql关闭组复制 组复制 mysql_服务器_05


5:在server2和server3中修改完配置文件并且登录数据库修改密码

6:在server2和server3的数据库中执行以下操作

(1)不开启日志同步
SET SQL_LOG_BIN=0; #
(2)向repl用户授予所有权限,所有用户均可利用repl用户同步
GRANT REPLICATION SLAVE ON * .* TO repl@’%’ IDENTIFIED BY ‘Guodong+0306’;
(3)刷新授权表
FLUSH PRIVILEGES;
(4)reset master;
(5)开启日志记录
SET SQL_LOG_BIN=1;
(6)CHANGE MASTER TO MASTER_USER=’repl’,MASTER_PASSWORD=’Guodong+0306’ FOR CHANNEL ‘group_replication_recovery’;
(7)INSTALL PLUGIN group_replication SONAME ‘group_replication.so’;
(8)SHOW PLUGINS;
(9)START GROUP_REPLICATION;
(10)SELECT * FROM performance_schema.replication_group_members;

配置完成后,server2和server3处于online状态:

mysql关闭组复制 组复制 mysql_服务器_06

测试

1:在server1建数据库建表,检测server2和server3是否同步

在server1中:

mysql关闭组复制 组复制 mysql_数据库_07


在server2中:

mysql关闭组复制 组复制 mysql_服务器_08


在server3中:

mysql关闭组复制 组复制 mysql_数据库_09


2:在server2和server3中向数据库中插入数据,检测在各个节点是否同步

在server2中插入数据:

mysql关闭组复制 组复制 mysql_mysql关闭组复制_10


在server3中插入数据:

mysql关闭组复制 组复制 mysql_mysql_11


在三个节点中分别查看数据是否同步

server1:

mysql关闭组复制 组复制 mysql_mysql_12


server2:

mysql关闭组复制 组复制 mysql_mysql关闭组复制_13


server3:

mysql关闭组复制 组复制 mysql_mysql_14