mysql数据库组复制(即全同步复制)

本文介绍了MySQL数据库的组复制(全同步复制)设置,包括实验环境、配置步骤和常见错误处理。在配置过程中,遇到服务器状态不正确(如RECOVERING)和导入数据错误,如1290和1840错误。解决方法包括调整服务器状态和重启MySQL服务。

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

1、基本知识:

组复制模型:
    单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点
    自动设置为read only
    多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念只要突然故障的节点数量
    不太多,这个多主模型就能继续可用
组复制原理:复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务
    但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即
    提交。
优点:MySQL 组复制提供了高可用性,高弹性,可靠的 MySQL 服务
缺点:组复制的效率很低当master节点写数据的时候,会等待所有的slave节点完成数据的复制,
然后才继续往下进行
组复制的每一个节点都可能是slave

2、实验环境

server1:172.25.26.101master节点
server2:172.25.27.102slave节点
server3:172.25.27.103slave节点

 

 

 

 

server1,server2,server3上边都需要安装这些包

    mysql-community-client-5.7.24-1.el7.x86_64.rpm
    mysql-community-common-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
##安装:
yum install -y *.rpm

##初始化:
systemctl start mysqld
cat /var/log/mysqld.log | grep password		//查看初始化密码

mysql_secure_installation	//使用初始化密码进行初始化
	    ZHAOjun@123		/新密码--剩下的直接回车


实验中:当初始化之后,如果删除数据文件/var/lib/mysql/*,只需要从新修改密码即可(也可以从新执行初始化)
    mysql -uroot -p						//使用初始化密码登陆
    alter user root@localhost identified by 'YLZ123+a';	//修改密码

3、server1配置

vim /etc/my.cnf
[mysqld]
    #新添加以下内容
    server_id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    binlog_checksum=NONE         #关闭binlog校验
    log_slave_updates=ON
    log_bin=binlog
    binlog_format=ROW            #组复制依赖基于行的复制格式

    transaction_write_set_extraction=XXHASH64
    loose-group_replication_group_name="可以使用uuidgen生成一个uuid,写在这里"
    loose-group_replication_start_on_boot=off
    loose-group_replication_local_address= "172.25.27.101:33061"    #当前节点的Ip
    loose-group_replication_group_seeds="172.25.27.101:33061,
                                         172.25.27.102:33061,172.25.27.103:33061"
    loose-group_replication_bootstrap_group=off      
    ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,
    并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
    loose-group_replication_ip_whitelist="127.0.0.1,172.25.20.0/24"
    loose-group_replication_enforce_update_everywhere_checks=ON #每个节点都可以向外更新数据
    loose-group_replication_single_primary_mode=OFF        #关闭单主模式

#修改数据库密码
systemctl restart mysqld        #重启数据库
cat /var/log/mysqld.log | grep password    #查看初始化密码
mysql -uroot -p            #使用初始化密码登录数据库
alter user root@localhost identified by 'ZHAOjun@123';    #修改数据库密码

#创建组复制用户,并授权
SET SQL_LOG_BIN=0;关闭二进制日志
CREATE USER rpl_user@'%' IDENTIFIED BY 'YLZ123+a';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;开启二进制日志
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yan+123kou' FOR CHANNEL 'group_replication_recovery';配置用户
INSTALL PLUGIN group_replication SONAME 'group_replication.so';安装组复制插件
SET GLOBAL group_replication_bootstrap_group=ON;在第一个节点上要先打开一次
START GROUP_REPLICATION;开启组复制
SET GLOBAL group_replication_bootstrap_group=OFF; 关闭组复制激活
SELECT * FROM performance_schema.replication_group_members;查看组的状态,当前只有一个节点在线

4、server2/server3

将server1上边的/etc/my.cnf文件复制过来只需要修改两处地方
vim /etc/my.cnf
    [mysqld]
    server_id=2/3
    loose-group_replication_local_address= "172.25.27.102/103:33061"	//本地ip,是什么就写什么

systemctl restart mysqld

mysql -uroot -pZHAOjun@123

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'ZHAOjun@123';	//创建复制用户
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';		    //给复制权限
FLUSH PRIVILEGES;			//刷新授权表
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='ZHAOjun@123' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';	//下载组复制插件
SHOW PLUGINS;			//查看
SHOW PLUGINS;
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;		//开启组复制

5、测试

#在任何一个节点上查看组成员
SELECT * FROM performance_schema.replication_group_members;    

å¨è¿éæå¥å¾çæè¿°

报错一:加入后状态不对(不是ONLINE,而是RECOVERING)

å¨è¿éæå¥å¾çæè¿°

解决办法:

cd /var/lib/mysql	//备份server1(发起组复制端)的数据
mysqldump --all-databases --single-transaction --routines --events \
--host=127.0.0.1 --port=3306 --user=root --password=YLZ123+a > dbdump.db

##发送给server2/3
scp dbdump.db 172.25.27.102:/root
scp dbdump.db 172.25.27.103:/root

##server2/3
mysql -p < dbdump.db		//导入数据库,如果出错,请阅读报错二

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='YLZ123+a' \
FOR CHANNEL 'group_replication_recovery';
start group_replication;
SELECT * FROM performance_schema.replication_group_members;

报错二:导入数据出错

a. ERROR 1290 (HY000) at line 31: The MySQL server is running with the --super-read-only option so it cannot execute this statement.    
(MySQL服务器使用–super-read-only选项运行,因此无法执行此语句) 解决办法:关闭mysql再开启就ok
 

b. ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.    (@@
GLOBAL.GTID_PURGED只能在@@ GLOBAL.GTID_EXECUTED为空时设置。)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值