MySQL多组复制

组复制原理:

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

在单主模式下部署组复制

组中的每个 server 实例可以在独立的物理机器上运行,也可以在同一台机器上运行。 如何在一台物理机上创建具有三个 MySQL Server 实例的复制组。这意味着需要三个数据目录,每个 server 实例一个,每个实例都需要单独配置。
组架构
MySQL多组复制_第2张图片


【server1】主机设置

1.组复制 server 设置

【server1】

[root@server1 ~]# /etc/init.d/mysqld stop
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# vim /etc/my.cnf
  删除之前加进去的所有行
[root@server1 mysql]# /etc/init.d/mysqld start

2.复制框架,组复制设置

[root@server1 mysql]# vim /etc/my.cnf
 29 server_id=1
 30 gtid_mode=ON
 31 enforce_gtid_consistency=ON
 32 master_info_repository=TABLE
 33 relay_log_info_repository=TABLE
 34 binlog_checksum=NONE
 35 log_slave_updates=ON
 36 log_bin=binlog
 37 binlog_format=ROW
......
 40 transaction_write_set_extraction=XXHASH64  #指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
 41 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"   
 42 loose-group_replication_start_on_boot=off  #设置为Server启动时不自动启动组复制
 43 loose-group_replication_local_address= "172.25.40.1:24901"   #本机IP
 44 loose-group_replication_group_seeds="172.25.40.1:24901,172.25.40.2:24901,172.25.40.3:24901"
 45 loose-group_replication_bootstrap_group=off   #配置是否自动引导组
[root@server1 mysql]# /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

MySQL多组复制_第3张图片
【server3】

mysql> select uuid();

MySQL多组复制_第4张图片

【server1】

[root@server1 mysql]# vim /etc/my.cnf
#加入任意一台mysql的uuid
 41 loose-group_replication_group_name="c125de12-9c7d-11e8-ba9d-525400ccfb41"
......
 46 loose-group_replication_single_primary_mode=off  #设置组自动选择一个 server 来处理读/写工作。
 47 loose-group_replication_enforce_update_everywhere_checks=on  #多主模式下为多主更新启用或禁用严格一致性检查。
 48 loose-group_replication_ip_whitelist="172.25.40.0/24,127.0.0.1/8"    #加入白名单
[root@server1 mysql]# /etc/init.d/mysqld restart
[root@server1 mysql]# grep password /var/log/mysqld.log   #查看初始化密码
  #复制日志下面的一个初始化密码

3.启动组复制

[root@server1 mysql]# mysql -p
Enter password:              #初始化密码
mysql> ALTER USER root@localhost identified by 'Westos.123';   #更改密码
mysql> show databases;
mysql> SET SQL_LOG_BIN=0;   #以下操作不写入日志
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Westos.123';   #创建用户 rpl_use
mysql> FLUSH PRIVILEGES;
mysql> reset master;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';  #将 rpl_user 和 rpl_pass 替换为创建用户时使用的值
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';  #安装组复制插件
mysql> show plugins;    #检查插件是否安插成功

MySQL多组复制_第5张图片

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;

这里写图片描述

【server2】主机设置

[root@server2 ~]# /etc/init.d/mysqld stop
[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# rm -fr *
[root@server2 mysql]# vim /etc/my.cnf
  删除之前加进去的所有行
[root@server2 mysql]# /etc/init.d/mysqld start

2.复制框架,组复制设置

[root@server2 mysql]# vim /etc/my.cnf
  29 server_id=1
 30 gtid_mode=ON
 31 enforce_gtid_consistency=ON
 32 master_info_repository=TABLE
 33 relay_log_info_repository=TABLE
 34 binlog_checksum=NONE
 35 log_slave_updates=ON
 36 log_bin=binlog
 37 binlog_format=ROW
......
 40 transaction_write_set_extraction=XXHASH64
 41 loose-group_replication_group_name="c125de12-9c7d-11e8-ba9d-525400ccfb41"   #uuid和server1写的一致
 42 loose-group_replication_start_on_boot=off
 43 loose-group_replication_local_address= "172.25.40.2:24901"   #本机IP
 44 loose-group_replication_group_seeds="172.25.40.1:24901,172.25.40.2:24901,172.25.40.3:24901"   #集群所有节点ip
 45 loose-group_replication_single_primary_mode=off
 46 loose-group_replication_enforce_update_everywhere_checks=on
 47 loose-group_replication_ip_whitelist="172.25.40.0/24,127.0.0.1/8"    #加入白名单

[root@server1 mysql]# /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

【server2】

[root@server1 mysql]# grep password /var/log/mysqld.log   #查看初始化密码
  #复制日志下面的一个初始化密码

3.启动组复制

[root@server2 mysql]# mysql -p
Enter password:              #初始化密码
mysql> ALTER USER root@localhost identified by 'Westos.123';   #更改密码
mysql> show databases;
mysql> SET SQL_LOG_BIN=0;
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Westos.123';   #创建用户 rpl_use
mysql> FLUSH PRIVILEGES;
mysql> reset master;
mysql> SET SQL_LOG_BIN=1;   #操作写入日志
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',MASTER_PASSWORD='Westos.123' FOR CHANNEL 'group_replication_recovery';  #将 rpl_user 和 rpl_pass 替换为创建用户时使用的值
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';  #安装组复制插件
mysql> show plugins;    #检查插件是否安插成功
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

这里写图片描述

【server3】主机设置操作和【server2】一样

测试:

【server1】 创建数据库

mysql> CREATE DATABASE test;
mysql> use test
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;

MySQL多组复制_第6张图片
【server2】

mysql> show databases;
mysql> use test
mysql> SELECT * FROM t1;

MySQL多组复制_第7张图片
可以看到server1主机上的数据库信息已经复制到server2主机上。

配置过程常见的错误:
1.来源IP没有在白名单列表中,所以连接拒绝
2.没有配置同步账号跟密码,使用的是空密码进行同步。 需要为复制通道group_replication_recovery设置同步信息:CHANGE MASTER TO MASTER_USER=’mysqlsync’, MASTER_PASSWORD=’mysqlsync_password’ FOR CHANNEL ‘group_replication_recovery’;
3.删除validate_password密码验证插件。

你可能感兴趣的:(MySQL多组复制)