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