title: MySQL:3.MySQL Group Replication(MGR)集群
categories: 数据库
tags:
- MySQL
timezone: Asia/Shanghai
date: 2019-03-10
简介
集群自身不提供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的特性和注意事项
- 全同步复制,事务要么在所有节点都提交,要么都回滚;
- 多主复制,可以在任意节点进行写操作;
- 在从服务器上并行应用事件,真正意义上的并行复制;
- 节点自动配置–故障节点自动从集群中移除,当故障节点再次加入集群,无需手工备份当前数据库并拷贝至故障节点;
- 应用程序的兼容性:无需更改应用程序,原生的MySQL接口;
- 生产环境上集群推荐配置3个节点; 每个节点都包含完整的数据副本;
- 各个节点的同步复制,通过GTID binlog ROW实现。
局限性:
- 目前的复制仅仅支持InnoDB存储引擎
- 每张表必须有主键
- 只支持ipv4网络
- 集群最大支持9个节点
- 不支持Savepoints
- 不支持SERIALIZABLE隔离级别在Multi-Primary多主模式
- 不支持外键在Multi-Primary多主模式
- 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,比如硬盘故障(RAID10坏了一块盘),那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
优点:
- 真正的多主架构,任何节点都可以进行读写,无需进行读写分离;(注:生产环境建议只在一台机器上写,由于集群是乐观锁并发控制,事务冲突的情况会在commit阶段发生。如果有两个事务在集群中不同的节点上对同一行写入并提交,失败的节点将回滚,客户端返回报错,作为DBA你不想被一群开发投诉的话,还是默默的开启Single-Primary写入模式)
- 无集中管理,可以在任何时间点失去任何一个节点,集群将正常工作不受影响;
- 节点宕机不会导致数据丢失;
- 对应用透明。
缺点:
- 加入新节点,开销大,需要复制完整的数据。
- 不能有效的解决写扩展问题,磁盘空间满了,无法自动扩容,不能像MongoDB分片那样自动移动chunk做balance
- 有多少个节点就有多少份重复的数据
- 由于事务提交需要跨节点通讯(分布式事务),写入会比主从复制慢
- 对网络要求非常高,如果网络出现波动或机房被ARP攻击,造成两个节点失联,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
第零步:初始环境准备(by all)
1.关闭系统默认防火墙(by all)
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
2.写入HOSTS(by all)
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
第一步:安装MySQL并设置开机自动启动(by all)
1.安装MySQL(by all)
cat <<EOF >/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
2.启动和初始化(by all)
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
第二步:配置MGR
1.编辑my.cnf(请注意有4个地方的IP需要修改)(by all)
## 编辑并增加以下内容
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
2.重启服务并安装组复制插件
systemctl restart mysqld.service
mysql -uroot -pXiaoliu123!
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;
exit
3.编辑my.cnf并重启服务
## 将所有``loose-``去掉
vi /etc/my.cnf
systemctl restart mysqld.service
4.节点1执行
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
5.节点2和节点3执行
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
第三步:测试MGR
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;