带你走进MySQL全新高可用解决方案-MGR
一、初识MGR
相信很多人对MGR这个词比较陌生,其实MGR(全称 MySQL Group Replication 【MySQL 组复制】)是Oracle MySQL于2016年12月发布MySQL 5.7.17推出的一个全新高可用和高扩展的解决方案。具备以下特性:
高一致性,基于原生复制及Paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
高灵活性,有单主模式(图1)和多主模式(图2),单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
单主模式(图1)
多主模式(图2)
MGR架构图如下所示:主要包括APIs层,组件层,负责协议模块和API+Paxos引擎层构成。
二、MGR技术演进
2.1 主从复制
传统MySQL复制默认提供了一种简单的主从复制方法,这种架构有一个主,以及一个或者多个从,当主节点执行提交事务,然后异步的方式发送到其他从节点,从库重新执行relay log日志内容达到主副本一致的目的,在默认情况下集群所有节点数据都是一致的。
MySQL异步复制
2.2 半同步复制
异步复制存在一定的数据丢失风险,MySQL又在5.6版本中推出半同步复制,在同步数据协议中添加了一个同步操作,这样意味主节点在commit操作,需要确认最少一个从节点确认接收到并且返回ACK,只有这样主节点才能正确提交数据。
MySQL半同步复制
2.3 组复制
MySQL MGR 集群最少3个server节点共同组成的分布式集群,一种share-nothing复制方案,每个server节点都有完整的副本。
MySQL组复制协议
三、MGR技术特性
3.1 故障检测
组复制自带提供一种故障检测机制,这个机制能报告哪个组成员是无响应的,并且如何判断该成员是否排除集群组。在组复制中故障检测是一种分布式服务。假设服务器A在预定时间段内未收到来自服务器B的消息,如果组内其他成员也同样未收到来自服务器B的消息,那么确认判断B发生故障,这样由其他成员判定将失联组成员从集群中剔除。
此时服务器B与其他服务节点都无法联系。由于无法达成最小仲裁成员数,处于独立状态,无法对外提供服务。
3.2 容错
MySQL组复制构建在Paxos分布式算法基础上实现的,以提供不同server之间的分布式协调。因此,它需要大多数server处于活动状态以达到仲裁成员数,从而做出决定。这对系统可以容忍的不影响其自身及其整体功能的故障数量有直接影响。容忍f个故障所需的server数量(n)n = 2 * f + 1。
实践中,这意味着为了容忍一个故障,组必须有三个server。如果一个服务器故障, 仍然有两个服务器形成大多数(三分之二)来允许系统自动地继续运行。但是,如果第二个server意外地宕掉,则该组锁定(只有一个server),因为没有达到多数可以达成选举(不能自己选举自己)。以下是说明上述公式的小表:
3.3 成员管理
组复制以组视图(Group View,后续简称视图)为基础来进行成员管理,视图一般在Group在一段时间内的成员状态,如果这段时间没有成员变化,也就是说没有成员的加入和退出,一旦有成员加入或者退出组,则视图就发生变化,并且使用视图ID(view id)进行跟踪变化区分先后时间,下面我们来看一张图演示一下:
序号部分,初始化时,第一个视图的序号从1开始,成员只有引导主一个,为进行初始化节点,以后出现的任何成员的加入和退出这个序号都需要增加1,可以通过performance_schema系统库下的replication_group_member_stats表中查询当前视图。
四、MGR安装体验
了解任何一个新技术从部署开始,安装比较简单,我们准备如下测试节点:
10.10.1.214
10.10.1.217
10.10.6.91
安装版本均为最新版本8.0.24,将安装包解压后进行初始化:
su - mysql
wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-8.0/mysql-8.0.24-linux-glibc2.12-x86_64.tar
tar -xf mysql-8.0.24-linux-glibc2.12-x86_64.tar
cd mysql-8.0.24-linux-glibc2.12-x86_64
# 创建配置文件和数据目录
mkdir conf data
初始化数据库并且启动
./bin/mysqld --initialize --datadir=/home/mysql/mysql-8.0.24-linux-glibc2.12-x86_64/data --basedir=/home/mysql/mysql-8.0.24-linux-glibc2.12-x86_64
./bin/mysqld_safe --defaults-file=conf/my.cnf &
4.1 通用配置说明
配置代码
[mysqld]
bind-address=0.0.0.0
datadir=/home/mysql/mysql-8.0.24-linux-glibc2.12-x86_64/data
basedir=/home/mysql/mysql-8.0.24-linux-glibc2.12-x86_64
port=3306
socket=/home/mysql/mysql-8.0.24-linux-glibc2.12-x86_64/data/mysqld.sock
user=mysql
# 每个节点要求不一样
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
innodb_buffer_pool_size=1g
# 8.0 默认值XXHASH64,针对写事务进行哈希处理
transaction_write_set_extraction=XXHASH64
# 启动加载组复制插件
plugin_load_add='group_replication.so'
# 集群唯一ID
group_replication_group_name="8d3cebd8-b132-11eb-8529-0242ac130003"
# 是否启动MySQL服务时启动组复制,建议值:off
group_replication_start_on_boot=off
# 本地IP后面端口33061可自定义,集群通信端口,建议统一端口
group_replication_local_address= "10.10.1.214:33061"
# 初始化集群成员列表,可动态修改
group_replication_group_seeds= "10.10.1.214:33061,10.10.1.217:33061,10.10.6.91:33061"
# 判断是否为引导组
group_replication_bootstrap_group=off
# 设置白名单,这里特别注意,如果是同网段可以不用设置,如果是不同网段则需要修改否则通信端口不可访问
loose-group_replication_ip_whitelist='10.10.1.214,10.10.1.217,10.10.6.91'
4.2 单主模式部署
4.2.1 引导节点初始化
# 创建用户和安装插件
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SHOW PLUGINS;
+---------------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+----------------------+---------+
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+---------------------------------+----------+--------------------+----------------------+---------+
# 启动引导节点
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.33 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4cf69361-b22b-11eb-a2c9-fa163ebefc6a | 10-10-1-214 | 3306 | ONLINE | PRIMARY | 8.0.24 |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
4.2.2 加入从节点
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.03 sec)
mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (3.33 sec)
# 检查状态
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4cf69361-b22b-11eb-a2c9-fa163ebefc6a | 10-10-1-214 | 3306 | ONLINE | PRIMARY | 8.0.24 |
| group_replication_applier | 53f39dba-b22b-11eb-bfdb-fa163e42784d | 10-10-1-217 | 3306 | ONLINE | SECONDARY | 8.0.24 |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)
其他一个节点执行上述即可,执行完成后检查
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4cf69361-b22b-11eb-a2c9-fa163ebefc6a | 10-10-1-214 | 3306 | ONLINE | PRIMARY | 8.0.24 |
| group_replication_applier | 53f39dba-b22b-11eb-bfdb-fa163e42784d | 10-10-1-217 | 3306 | ONLINE | SECONDARY | 8.0.24 |
| group_replication_applier | 56779526-b22b-11eb-a28e-fa163e1f9809 | 10-10-6-91 | 3306 | ONLINE | SECONDARY | 8.0.24 |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)
4.3 多主模式部署
多主模式和单主部署方式差不多,只在加入集群时多执行:
set global group_replication_single_primary_mode=off;
单主的都是ON。
4.3.1 引导节点初始化
mysql> set global group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> start group_replication;
Query OK, 0 rows affected, 1 warning (2.16 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4cf69361-b22b-11eb-a2c9-fa163ebefc6a | 10-10-1-214 | 3306 | ONLINE | PRIMARY | 8.0.24 |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
1 row in set (0.00 sec)
4.3.2 加入其他节点
mysql> set global group_replication_single_primary_mode=off;
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (3.26 sec)
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4cf69361-b22b-11eb-a2c9-fa163ebefc6a | 10-10-1-214 | 3306 | ONLINE | PRIMARY | 8.0.24 |
| group_replication_applier | 53f39dba-b22b-11eb-bfdb-fa163e42784d | 10-10-1-217 | 3306 | ONLINE | PRIMARY | 8.0.24 |
| group_replication_applier | 56779526-b22b-11eb-a28e-fa163e1f9809 | 10-10-6-91 | 3306 | ONLINE | PRIMARY | 8.0.24 |
+---------------------------+--------------------------------------+-------------------------------------------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)
4.4 测试体验
# 在任意节点执行
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
# 任意节点查询
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
五、应用场景
MGR采用多副本模式,在2N+1个集群中,集群只要N+1个节点还存活,数据库就能稳定对外提供服务,适用于金融场景,因为这些场景数据必须零丢失,可用性在4个9甚至5个9。
适用于替代当前主从高可用版本,解决单点写入问题。
针对业务需要弹性扩展节点的基础架构环境,例如私有云。
六、总结
尽管MySQL在2016年就推出了MGR该功能,同时我们也知道有很多好处,并且有大胆的公司采用进行测试甚至部署线上环境,据公开资料网易、滴滴都有使用,国内部分商业银行也有使用,但仍然有不少人处于观望状态,主要有以下几点原因导致:
需求不是特别强烈
- 很多业务情况使用MySQL半同步和异步复制足够满足业务要求,配合MHA第三方组件满足了绝大部分场景需求。
分布式新事物
- 本身分布式这个概念已经存在多年,但是由于MGR推出年限较短,且我们搜索官方bug库任然存在较多未解决的bug。用户使用排查问题较为困难,且由于分布式设计导致问题复现难也是一种阻碍。
生态不成熟
- 官方几乎没有完全成熟用来构建整套高可用架构的解决方案,如果想要大规模使用还是需要更加成熟的生态。
任何新鲜事物都有一个被大众接受过程,只是需要时间筛选和磨砺。
参考文档
https://dev.mysql.com/doc/refman/8.0/en/group-replication.html
作者:vivo互联网数据库团队-Liu Shilin
带你走进MySQL全新高可用解决方案-MGR的更多相关文章
- Mycat高可用解决方案一(mysql安装)
Mycat高可用解决方案一(mysql安装) Mycat关键特性 关键特性 支持SQL92标准 支持MySQL.Oracle.DB2.SQL Server.PostgreSQL等DB的常见SQL语法 ...
- 常见的MYSQL高可用解决方案
MySQL 是一种关系数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL 软件采用了双授权政策(本词条"授权政策& ...
- MySQL高可用解决方案(MySQL HA Solution)
http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- (转)MySQL高可用解决方案
MySQL高可用解决方案 原文:http://www.ywnds.com/?p=5565 有这么两个概念,数据库的可靠性和数据库的可用性,可靠性指的是数据可靠,而可用性指的是服务可用.但是不管是可靠性 ...
- MySQL高可用解决方案MMM
一.MMM简介: MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控.故障转移和 ...
- mysql高可用解决方案
浅谈mysql主从复制的高可用解决方案 1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称 ...
- 分布式数据存储 - MySQL主从复制高可用方案
前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可 ...
- Mycat高可用解决方案三(读写分离)
Mycat高可用解决方案三(读写分离) 一.系统部署规划 名称 IP 主机名称 配置 192.168.199.112 mycat01 2核/2G Mysql主节点 192.168.199.110 my ...
随机推荐
- ls仅列出当前目录下的所有目录
ls -d */ -d仅列出目录本身,而不列出其中的内容 *通配符,所有的字符 /目录的标识
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【五】
BearPi-HM_Nano开发板鸿蒙OS内核编程开发--消息队列 什么是消息队列? 答:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能. ...
- n皇后问题(回溯法)——Python实现
八皇后问题 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
- HttpRunner3源码阅读:2. 模型定义
models.py 昨天体验的时候我们分别执行了httprunner -h,httprunner startproject demo, httprunner run demo,但是源码中其调用了其他文 ...
- 异地远程访问群晖NAS中的文件
异地远程访问群晖NAS中的文件 我以群晖DS720+网络存储服务器为例,介绍我是如何异地远程访问群晖NAS中的文件的. 此文章只介绍部署操作的大概步骤,具体的操作方法和技巧可以在西瓜视频.抖音 ...
- AndroidStudio 插件总结
工作中常用的插件备注如下: Alibaba Java Coding GuidelinesCheckStyle-IDEAAndroid Drawable PreviewGsonFormatTransla ...
- 高效JAVA之用静态工厂方法代替构造器
程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪 ...
- 音视频开发之H.264 入门知识
大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...
- 面试必备:Android Activity启动流程源码分析
最近大致分析了一把 Activity 启动的流程,趁着今天精神状态好,把之前记录的写成文章. 开门见山,我们直接点进去看 Activity 的 startActivity , 最终,我们都会走到 st ...
- java使用Selenium操作谷歌浏览器学习笔记(一)
下载安装 在淘宝镜像https://npm.taobao.org/mirrors/chromedriver/中下载与浏览器对应的版本 查看浏览器版本 点击查看谷歌浏览器版本 在IDEA项目中导入相关j ...