MySQL的组复制

MySQL组复制从5.7.17版本开始提供,支持单主和多主模型,确保高可用性和一致性。在单主模型中,自动选举master节点,故障时自动切换;多主模型中,所有节点皆可写。通过冲突检测保证事务提交顺序,实现组内一致性。即使部分节点故障,系统仍能保持可用。配置过程包括节点的初始化、配置文件编辑和数据库配置等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、组复制

  • 组复制模型:

  • MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)。

  • 单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。

  • 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

  • 组复制原理:

  • 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。

  • 换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。

  • 组复制能够根据在一组 server 中复制系统的状态来创建具有冗余的容错系统。因此,只要它不是全部或多数 server 发生故障,即使有一些 server 故障,系统仍然可用,最多只是性能和可伸缩性降低,但它仍然可用。server 故障是孤立并且独立的。它们由组成员服务来监控,组成员服务依赖于分布式故障检测系统,其能够在任何 server 自愿地或由于意外停止而离开组时发出信号。

  • 总之,MySQL 组复制提供了高可用性,高弹性,可靠的 MySQL 服务。

  • 组复制的每一个节点都可能是slave

  • 实验环境:(一主多从模式)

主机名IP角色
server1172.25.19.1master
server2172.25.19.2slave
server3172.25.19.3slave

配置过程:

  • 准备工作:

1.向将要安装的包传输给server3

[root@server2 mysql]# cd
[root@server2 ~]# ls
[root@server2 ~]# scp * server3:/root/

在这里插入图片描述
2.server3安装数据库

[root@server3 ~]# ls
[root@server3 ~]# yum install -y *

在这里插入图片描述
3.server1和server2关闭mysql服务

[root@server1 mysql]# systemctl stop mysqld

[root@server2 ~]# systemctl stop mysqld

在这里插入图片描述
在这里插入图片描述
4.查看一下UUID备用

[root@server1 mysql]# ls
[root@server1 mysql]# cat auto.cnf 
[auto]
server-uuid=3783fde8-6c8a-11e9-b360-525400e566ef

在这里插入图片描述

  • 开始配置:

  • 节点1:

1.server1删除数据目录下的所有

[root@server1 mysql]# rm -fr *
[root@server1 mysql]# ls

在这里插入图片描述
2.编辑配置文件

[root@server1 mysql]# vim /etc/my.cnf

server-id=1   ##服务器的ID,是唯一的

gtid_mode=ON
enforce-gtid-consistency=true

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="3783fde8-6c8a-11e9-b360-525400e566ef"     
                                               ##组的名字
loose-group_replication_start_on_boot=off      ##制定插件在server启动时不自动启动组复制,
                                    不关闭的话每一次重启都会生成一个组名,和原来的冲突
loose-group_replication_local_address= "172.25.19.1:24901"
                                               ##告诉插件使用的本机IP地址,端口24901用于接受来自组中的其他成员
loose-group_replication_group_seeds= "172.25.19.1:24901,172.25.19.2:24901,172.25.19.3:24901"
loose-group_replication_bootstrap_group=off    ##配置是否自动引导组
loose-group_replication_ip_whitelist="127.0.0.1,172.25.19.0/24" 
                                               ##用户白名单,允许这个网段的来访问
loose-group_replication_enforce_update_everywhere_checks=ON
                                               ##多主模式下为多主更新启用或禁用严格一致性检查
loose-group_replication_single_primary_mode=OFF
                                               ##设置自动选择一个server来处理读/写操作

在这里插入图片描述
3.开启mysql服务

[root@server1 mysql]# systemctl start mysqld
[root@server1 mysql]# ls

在这里插入图片描述
4.查看临时密码

[root@server1 mysql]# grep password /var/log/mysqld.log 

在这里插入图片描述
5.配置数据库

1. 登陆
[root@server1 mysql]# mysql -p
2. 修改密码
ALTER USER root@localhost IDENTIFIED BY 'Yjy+123+mm';
3. 可以查看数据库
SHOW DATABASES;
4. 关闭二进制日志
SET SQL_LOG_BIN=0;
5. 创建用户
CREATE USER rpl_user@'%' IDENTIFIED BY 'Yjy+123+mm';
6. 用户授权
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
7. 刷新用户授权表
FLUSH PRIVILEGES;
8. 开启二进制日志
SET SQL_LOG_BIN=1;

9. 配置用户
CHANGE MASTER TO MASTER_USER='rpl_user',
 MASTER_PASSWORD='Yjy+123+mm' FOR CHANNEL 'group_replication_recovery';
10. 安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
11. 在第一个节点上要先打开一次
SET GLOBAL group_replication_bootstrap_group=ON;
12. 开启组复制
START GROUP_REPLICATION;
13. 关闭组复制激活
SET GLOBAL group_replication_bootstrap_group=OFF;
14. 查看组的状态,当前只有一个节点在线
SELECT * FROM performance_schema.replication_group_members;
15. 创建库
mysql> CREATE DATABASE test;
16.进入库
mysql> USE test;
17.创建表
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
18.插入数据
mysql> INSERT INTO t1 VALUES (1, 'Luis');
19.查看数据
mysql> SELECT * FROM t1;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 第二个节点:(server2)

1.关闭mysql服务

[root@server2 ~]# systemctl stop mysqld

2.删除数据目录的内容

[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# ls
[root@server2 mysql]# rm -fr *
[root@server2 mysql]# ls

在这里插入图片描述
3.编辑配置文件,开启服务
修改的只有一个地方

[root@server2 mysql]# vim /etc/my.cnf
[root@server2 mysql]# systemctl start mysqld

在这里插入图片描述
在这里插入图片描述
4.查看临时密码

[root@server2 mysql]# grep password /var/log/mysqld.log 

在这里插入图片描述
在这里插入图片描述
5.登陆数据库,配置

[root@server2 mysql]# mysql -p
1. mysql> ALTER USER root@localhost IDENTIFIED BY 'Yjy+123+mm';

2. mysql> SHOW DATABASES;

3. mysql> SET SQL_LOG_BIN=0;
4. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yjy+123+mm';

5. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

6. mysql> FLUSH PRIVILEGES;
7. mysql> SET SQL_LOG_BIN=1;
8. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', 

MASTER_PASSWORD='Yjy+123+mm' FOR CHANNEL 'group_replication_recovery';

9. mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

开启组复制,报错,因为节点1已经写入数据,两端数据不一致
10. mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active 
member of the group. Please see more details on error log.

强制
11. mysql> SET GLOBAL group_replication_allow_local_disjoint_gtids_join=on;
开启组复制
mysql> START GROUP_REPLICATION;

12.查看组的状态
mysql> SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 第三个节点:

1.编辑配置文件,开启服务

[root@server3 ~]# vim /etc/my.cnf
[root@server3 ~]# systemctl start mysqld
[root@server3 ~]# 
[root@server3 ~]# ls /var/lib/mysql

在这里插入图片描述
在这里插入图片描述
2.过滤临时密码

[root@server3 ~]# grep password /var/log/mysqld.log

在这里插入图片描述
3.登陆数据库,配置
server2相同

[root@server3 ~]# mysql -p
mysql> ALTER USER root@localhost IDENTIFIED BY 'Yjy+123+mm';
mysql> SHOW DATABASES;
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yjy+123+mm';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user',
 MASTER_PASSWORD='Yjy+123+mm' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SET GLOBAL group_replication_allow_local_disjoint_gtids_join=on;
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 测试:

节点2上传数据

mysql> SHOW DATABASES;
mysql> USE test
mysql> SHOW TABLES;
mysql> SELECT * FROM t1;
mysql> INSERT INTO t1 VALUES (2,'Yan');
mysql> SELECT * FROM t1;

在这里插入图片描述
在这里插入图片描述
节点3查看,可以查看到

mysql> SELECT * FROM test.t1;

节点1同样:

mysql> mysql> SELECT t1;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值