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 <<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;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,833评论 0 5
  • Group Replication [TOC] 关于 Group Greplication 异步复制 半同步复制 ...
    saup007阅读 5,763评论 0 4
  • 找工作,总得在“找”吧。我没有,我一直在稳稳地等待,那么,我在等待什么呢?我不知道。那么,我就这么一直白吃白喝地呆...
    木子骙骙阅读 326评论 0 0
  • 1.UNIX时间戳转换为日期 FROM_UNIXTIME() 2.日期转换为UNIX时间戳 UNIX_TIMEST...
    jsjack_wang阅读 137评论 0 0