集群自身不提供VIP机制,也没有像MongoDB副本集那样提供JAVA/PHP客户端API接口实现故障切换(需要开发自己写,成本较高),需要结合第三方HaProxy软件(建议2块网卡做bond0)+自定义脚本实现秒级故障切换,另通过代理方式,性能会降低,因为多了一层网络转发。
MySQL Group Replication有两种模式,单主模式single-primary mode和多主模式multi-primary mode,在同一个group内,不允许两种模式同时存在,并且若要切换到不同模式,必须修改配置后重新启动集群
单主模式
在单主模式下,只有一个节点可以可以读写,其他节点只能提供读,在单主模式下,该参数 group_replication_enforce_update_everywhere_checks 必须被设置为 FALSE ,当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave谁作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,在group_replication_member_weight值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
多主模式
在多主模式下,在加入该群组的所有成员,所有服务器都设置为读写模式,在多主模式下,不支持SERIALIZABLE事务隔离级别,在多主模式下,不能完全支持级联外键约束
Group Replication的特性和注意事项
局限性:
优点:
缺点:
[root@centos181002 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@centos181002 ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
MGR 必须3节点以上
centos181001 11.11.11.61
centos181002 11.11.11.62
centos181003 11.11.11.63
setenforce 0
sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
which systemctl && systemctl stop firewalld
which systemctl && systemctl disable firewalld
which systemctl && systemctl stop iptables || service iptables stop
which systemctl && systemctl disable iptables || chkconfig iptables off
echo '11.11.11.61 centos181001' >> /etc/hosts
echo '11.11.11.62 centos181002' >> /etc/hosts
echo '11.11.11.63 centos181003' >> /etc/hosts
cat /etc/hosts
cat </etc/yum.repos.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
EOF
yum install -y mysql-community-server
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
## 编辑并增加以下内容
cp /etc/my.cnf /etc/my.cnf.bak
vi /etc/my.cnf
##################################### 唯一标识号,3台服务器要求不一样 #####################################
server_id=1
# 开启全局事务ID
# show variables like '%gtid%';
gtid_mode=ON
# 开启全局事务ID强一致性
enforce_gtid_consistency=ON
# 复制元数据存储在系统表而不是文件
master_info_repository=TABLE
# 中继日志信息写入到表而不是文件
relay_log_info_repository=TABLE
# 禁用二进制日志时间校验和
binlog_checksum=NONE
# 把relay-log里的日志内容再记录到slave本地的binlog里
# show variables like 'log_slave_updates';
log_slave_updates=ON
# 开启二进制日志
log_bin=binlog
# 基于行的二进制日志
binlog_format=ROW
# 指示服务器对于每个事务,它必须收集写集并使用XXHASH64散列算法将其编码为 散列。
transaction_write_set_extraction=XXHASH64
##################################### 需要使用``SELECT UUID()``命令生成 #####################################
loose-group_replication_group_name="6485a55e-4282-11e9-b311-000c29e93fe1"
# 指示插件在服务器启动时不自动启动操作。这在设置组复制时很重要,因为它确保您可以在手动启动插件之前配置服务器。
# 配置成员后,您可以设置 group_replication_start_on_boot 为on,以便在服务器引导时自动启动Group Replication。
loose-group_replication_start_on_boot=off
##################################### IP白名单 #####################################
loose-group_replication_ip_whitelist='11.11.11.61,11.11.11.62,11.11.11.63'
##################################### 与其他成员通讯用地址和端口 #####################################
loose-group_replication_local_address= "11.11.11.61:24901"
loose-group_replication_group_seeds= "11.11.11.61:24901,11.11.11.62:24901,11.11.11.63:24901"
# 此选项只能在任何时候在一个服务器实例上使用,通常是第一次引导组时(或者在整个组关闭并重新备份的情况下)。
# 如果多次引导组,例如当多个服务器实例设置了此选项时,则可以创建一个人工分裂脑情景,其中存在两个具有相同名称的不同组。在第一个服务器实例联机后禁用此选项
loose-group_replication_bootstrap_group=off
systemctl restart mysqld.service
mysql -uroot -pXiaoliu123!
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;
exit
## 将所有``loose-``去掉
vi /etc/my.cnf
systemctl restart mysqld.service
mysql -uroot -pXiaoliu123!
# 创建用户会在日志中记录,可以先关闭日志
SET SQL_LOG_BIN=0;
## 创建用户并授权
CREATE USER rpl_user@'%' IDENTIFIED BY 'Xiaoliu123!';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 创建用户完成以后打开日志
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xiaoliu123!' FOR CHANNEL 'group_replication_recovery';
set global group_replication_ip_whitelist="127.0.0.1/32,11.11.11.0/24";
## 启动GROUP_REPLICATION
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
## 待replication_group_members表查询结果MEMBER_STATE字段状态为ONLINE,再执行关闭初始化。
SET GLOBAL group_replication_bootstrap_group = OFF;
## 查看集群节点情况
SELECT * FROM performance_schema.replication_group_members;
## 查看事务复制信息
select * from performance_schema.replication_connection_status\G
mysql -uroot -pXiaoliu123!
# 创建用户会在日志中记录,可以先关闭日志
SET SQL_LOG_BIN=0;
## 创建用户并授权
CREATE USER rpl_user@'%' IDENTIFIED BY 'Xiaoliu123!';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 创建用户完成以后打开日志
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xiaoliu123!' FOR CHANNEL 'group_replication_recovery';
set global group_replication_ip_whitelist="127.0.0.1/32,11.11.11.0/24";
## 启动GROUP_REPLICATION
START GROUP_REPLICATION;
## 查看集群节点情况
SELECT * FROM performance_schema.replication_group_members;
## 查看事务复制信息
select * from performance_schema.replication_connection_status\G
1.节点1建表
CREATE TABLE t1(
id int not null default 0 primary key,
name char(20)
);
insert into t1(name) values ('xiaoliu');
2.节点2和节点3查询是否有通过过来
select * from test.t1;
select * from performance_schema.replication_group_member_stats \G ;
select * from performance_schema.replication_connection_status \G ;
select * from performance_schema.replication_applier_status \G ;
select *from performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
SHOW BINLOG EVENTS;