组复制
组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic
message)和完全有序信息交互等保障机制,实现了基于复制协议的多主更新复制组由多个 server成员构成,并且组中的每个 server成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。对于任何 (RW )事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server上,当事务准备好提交时,该server会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有server成员以相同的顺序接收同一组事务
因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致
MySQL组复制是Mysql 5.7.17开始引入的新功能,为主从复制实现高可用功能
它支持单主模型和多主模型两种工作方式(默认是单主模型)
单主模型
:从复制组中众多个Mysql节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master
多主模型
:复制组中的任何一个节点都可以写,因此没有master和slave的概念只要突然故障的节点数量不太多,这个多主模型就能继续可用
Mysql 组复制提供了高可用性,高弹性,可靠的 Myaql 服务
但是组复制的效率很低
当master节点写数据的时候,会等待所有的slave节点完成数据的复制,然后才继续往下进行
组复制的每一个节点都可能是slave
环境
ip:172.25.30.1/24
server1
ip:172.25.30.2/24
server2
ip:172.25.30.3/24
server3
server1、server2、server3、安装Mysqld服务
操作流程
组复制,互相为master和slave 相当于一个集群,都可以作为master和slave只需要在一个上面开启组复制即可,大家都是master
server1
vim /etc/mysql.cnf
server_id=1
第一个节点
gtid_mode=ON
gtid模块
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="系统生成的uuid"(cat/var/lib/mysql/auto.cnf)
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.30.1:3306"
当前节点的ip
loose-group_replication_group_seeds="172.25.30.1:3306,172.25.30.2:3306,172.25.30.3:3306"
loose-group_replication_bootstrap_group=off
插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
loose-group_replication_ip_whitelist="127.0.0.1,172.25.30.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF
开启多主模式的参数
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
修改密码
SET SQL_LOG_BIN=0
关闭二进制日志
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
创建用户
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
用户授权
FLUSH PRIVILEGES;
刷新用户授权表
SET SQL_LOG_BIN=1;
开启二进制日志
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' 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;
查看组的状态,当前只有一个节点在线
CREATE DATABASE test;
创建库
USE test;
进入库
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
插入数据
SELECT * FROM t1;
查看数据
/etc/my.cnf配置文件,使用scp /etc/my.cnf root@172.25.30.2:/etc
scp /etc/my.cnf root@172.25.30.3:/etc
给server2和server3传送my.cnf的配置文件
server2
vim /etc/my.cnf
只需要修改server_id等于2,local_address=172.25.30.2(本机ip)即可
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
C
HANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;
server3
vim /etc/my.cnf
只需要修改server_id等于3,local_address=172.25.30.3(本机ip)即可
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
C
HANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;
测试
server1
mysql -uroot -p*
SELECT * FROM performance_schema.replication_group_members;
查看三台server是否同时在线
server2
mysql -uroot -p*
insert into t1 valuse(2,'westos');
select * from t1;
server1 与 server3
mysql -uroot -p*
select * from t1;
组复制同步完成