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