MySQL:3.MySQL Group Replication(MGR)集群


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 </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;

你可能感兴趣的:(MySQL)