美团点评基于MGR的CMDB高可用架构搭建之路【转】

王志朋

美团点评DBA

曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维。

MySQL Group Replication(以下简称MGR),于5.7.17版本正式GA,由Oracle官方出品,为MySQL的高可用方案注入了新血液。其一致性,以及不依赖外部组件实现的自动切换、多点写入,给DBA带来了不少期待。

一、背景

以MHA作为切换工具,CMDB管理元数据,结合中间件的高可用方案在MySQL生态中是比较常见的架构。在这个体系中,CMDB作为基础组件之一,不能再依赖这个架构实现自身的高可用,而需要一套自成体系的高可用架构保障。

美团点评基于MGR的CMDB高可用架构搭建之路

2017年下半年开始,美团点评数据库计划全面升级上线5.7版本,也正是这个契机,基于MGR的CMDB高可用想法应运而生。

二、关于MGR

MGR是以Plugin的形式嵌入在MySQL实例中,插件内部实现了冲突检测、Paxos协议通信等。

美团点评基于MGR的CMDB高可用架构搭建之路

可能有同学了解它与PXC很像,社区中关于二者的口水战也非常的热闹,具体二者的优劣与争端此处不表,但有一点值得说明,MGR集群当中,仍然是通过binlog实现节点同步的。这一点对DBA很友好,意味着我们可以很轻易的找回熟悉的主从的感觉(Still A MySQL)。

美团点评基于MGR的CMDB高可用架构搭建之路

三、解决方案

MGR包括多主与单主两个模式,出于多主模式的一些已知问题以及实际业务场景的考虑,我们决定选择单主模式作为主要方案,即当主节点故障后,集群自动选举新的主节点,应用将写访问指向新的主节点。

美团点评基于MGR的CMDB高可用架构搭建之路

那么具体的解决方案还有哪些需要考虑呢?

  • MGR的限制;

  • 相关测试;

  • 合理的参数。

1.MGR的限制

  • 只支持InnoDB存储引擎;

  • 必须有主键;

  • binlog_format只支持ROW格式;

  • 不支持save point(后修复);

  • ……

官方给出了一些明确的要求及限制。针对这些限制我们要对线上要接入的数据库进行排查,调研可行性,规范其满足MGR的要求。包括收敛MyISAM存储引擎的表、无主键的表,应用逻辑中去除save point(新版本去掉此限制)等。

此外我们生产关心的问题,如网络抖动对MGR的影响、备份恢复工具可用性、Online-DDL可用性等,同样需要考虑在内。对此我们做了系统性的功能测试:

美团点评基于MGR的CMDB高可用架构搭建之路

同时在测试中也对MGR的行为有了一些新的认识,比如MyISAM引擎、无主键的表等MGR明确不支持的场景,都是以一种“乐观”的方式处理,即允许你创建、Alter,但不允许写入数据。

2.MGR的参数

同时在上面提到的测试中,我们也遇到了几个重要参数不同值的不同行为。比如group_replication_unreachable_majority_timeout这个参数,它真正的含义是MGR节点由ONLINE状态进入UNREACHABLE状态后(一般是由于网络抖动、节点异常等引起),等待相应的时间,如果仍保持UNREACHABLE,则将节点置为ERROR状态,即这个参数是UNREACHABLE状态的一个timeout,单位秒。

美团点评基于MGR的CMDB高可用架构搭建之路

(MGR节点的几个状态)

该参数默认值为0,含义是无timeout,即无限等待,这在实际的生产环境中,如发生网络的异常,是个不可接受结果。

以下是我们根据官方的文档,以及实践过程中的一些问题,总结的参数,可作为一个参考:

美团点评基于MGR的CMDB高可用架构搭建之路

3.最终架构

最后我落实了三机房三节点MGR集群,作为高可用方案主体,同时向下扩展了一套主从集群,作为不可挽回问题的灾备。毕竟MGR作为新生儿,可靠性还有待验证,相信不远的将来我们也有足够的信心放弃回滚到主从的方案。

美团点评基于MGR的CMDB高可用架构搭建之路

四、上线历程

美团点评从2018年以来,总共将三个系统迁移上线了MGR,包括流程系统、报表系统以及CMDB。

美团点评基于MGR的CMDB高可用架构搭建之路

五、典型问题

在几个集群上线的过程中,我们也积累了一些问题,其中典型的几个在这里简单回顾一下:

1.大事务

在报表系统上线后,集群出现了一点诡异的状况:在某些时间点,节点不定时会出现UNREACHABLE的状态,严重时直接导致集群选主切换,而在此期间,机房机器网络并没有什么异常。

美团点评基于MGR的CMDB高可用架构搭建之路

这个问题最初困扰了我们一段时间,通过对之前流程系统的对比,我们发现两个集群网卡的流量大小有些区别,且报表系统有比较明显的尖刺:

美团点评基于MGR的CMDB高可用架构搭建之路

从这个分析角度出发,我们查阅文档,发现有参数可以做相关的优化,即group_replication_compression_threshold,含义是事务超过相应大小则在传输前进行压缩处理。下图为参数调整后的对比,由1.5M减少到15K。实际场景中异常状态发生次数确实减少了,但没有根除。

美团点评基于MGR的CMDB高可用架构搭建之路

顺着这个思路我们做了一些测试,定位到了根本问题:大事务。

需要说明的是MGR的大事务有自己的“定义”,它的大事务与网络的传输时间有关,这就解释了为什么我们开启压缩后,节点异常状态次数减少的问题。最后我们通过限制事务的大小的方式,彻底解决了这个问题,同时也在业务逻辑上优化了大事务。以下是两个相关的参数:

美团点评基于MGR的CMDB高可用架构搭建之路

2. 应用HANG死

第二个问题发生在一次节点下线演练的过程中,DBA开始演练操作后,开发同学突然反馈说后台Nginx由于请求积压,机器挂掉了。如下图Nginx可用率:

美团点评基于MGR的CMDB高可用架构搭建之路

此时我们在DBA的慢查询监控中发现一个峰值,时间点基本吻合。下图为慢查询监控:

美团点评基于MGR的CMDB高可用架构搭建之路

由此我们分析了这段时间的慢查询,发现这个SQL我们非常眼熟——MGR查询主节点的语句。正常这个SQL执行时间在毫秒级,故障当时执行了10s,而这个10s与stop group_replication这个操作的耗时基本吻合。

美团点评基于MGR的CMDB高可用架构搭建之路

据此我们做了相应的测试验证了猜测:在MGR节点START和STOP过程中,当前节点的replication_group_member视图的查询全部hang住。这也就是解释了Nginx后台请求堆积造成的宕机。在此之后,我们在程序中查询这个视图时加入了超时的逻辑,解决了这个问题。

3. 机房故障

第三个问题发生在一次实际的机房故障中:CMDB主节点所在机房网络带宽减半,导致CMDB的MGR集群和一套业务主从集群几乎同时发生了切换,MGR的切换时间大概在3s左右,业务基本无感知,只发生部分报错,但业务集群切换发现回填CMDB失败。

究其原因主要是由于切换的逻辑仍然沿用DNS的连接方式,导致切换发生,DNS同步重新指向,而切换的应用程序对DNS新地址的解析迟迟未效。

美团点评基于MGR的CMDB高可用架构搭建之路

通过这次故障,也促使我们将所有核心CMDB访问全部迁移到内部开发的Smart Client端上。

美团点评基于MGR的CMDB高可用架构搭建之路

六、Smart Client

关于Smart Client,它是我们内部开发的一套Python连接API,是基于MySQLdb实现的一套MGR切换自动选主、读写分离的功能。对于熟悉Python访问MySQL的同学上手非常简单。

美团点评基于MGR的CMDB高可用架构搭建之路

七、日常运维

关于MGR的日常运维,实际情况比较省心。

初始化除部分参数区别外,基本与主从集群差异不大。监控方面,我们除了加入系统和MySQL的基础监控外(对MGR兼容良好),还加入了MGR节点状态的监控,即非ONLINE状态的节点全为异常。同时会有同学问,延迟怎么监控?理论上MGR是个最终一致的集群,它内部没有延迟的概念,但我们可以通过监控待执行事务队列中数值,近似看做是一种延迟。

美团点评基于MGR的CMDB高可用架构搭建之路

下图为线上一个集群的“延迟”情况,纵坐标为事务个数:

美团点评基于MGR的CMDB高可用架构搭建之路

同时还有主节点与其他节点的GTID_SET差值也可以作为一定参考。

八、写在最后

通过我们一系列的线上演练,甚至包括部分高峰期的演练,以及一段时间的运行状态观察,MGR确实是一个稳定、可靠的高可用架构。虽然对于写入密集型场景不是非常友好,但相信还是可以为DBA的高可用方案提供新的思路。

参考

  • MGR的要求:

    https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements.html

  • MGR的限制:

    https://dev.mysql.com/doc/refman/5.7/en/group-replication-limitations.html

  • 参数配置:

    https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html

  • python工具包:Python MySQL Group Replication 使用

    参考链接:https://km.sankuai.com/page/52289606

  • 转自 美团点评基于MGR的CMDB高可用架构搭建之路 https://www.toutiao.com/i6602060886867706376/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redmine更换主题

主题列表:http://www.redmine.org/projects/redmine/wiki/Theme_List 虽然有很多主题,但是很多主题都是要钱的,像这类(上图)没有下载地址的,都是要钱的。 含GitHub的下载地址的,是免费可下载的&…

redmine 邮箱配置(阿里云+windows)

说明 密码是第三方的授权码,不是邮箱密码 需要登录126网页版,在设置里开启 smtp 等第三方服务,设置授权码 阿里云Linux 默认屏蔽25号端口,所以需要开启ssl,和使用 465 端口 重启下 redmind sh /opt/redmine-3.4.6-…

linux查看当前用户终端,Linux----基本命令的使用(vi命令,查看文件内容,显示进程,切换用户等)...

1、vi是linux系统上经常使用的一个文本编辑器,其有三种模式:命令模式、编辑模式(插入模式)、末行模式。命令模式——>编辑模式:“i a o I A O”linux编辑模式——>命令模式:“ESC”shell命令模式——>末行模式&#xff1…

centos6.8 环境一键安装包 nginx配置thinkphp5

---恢复内容开始--- lnmp1.4 一键安装包 nginx配置thinkphp5 环境:Nginx1.12.1 PHP5.6 Coentos6.8 修改网站配置文件 server{listen 443 ssl http2;#listen [::]:443 ssl http2;server_name xxx.cn;index index.html index.htm index.php default.html default.ht…

Linux下BitNami Redmine的插件安装与更新

截至2017年3月27日,Redmine-3.3.2-2安装以下的15款插件全部成功并通过测试(下面显示为插件正确文件夹名): easy_wbs redmine_ckeditor 提供所见即所得编辑器 redmine_graphs 提供部分问题图表功能 progressive_projects_list 是…

Linux下redmine安装插件报错

报错如下: There was an error parsing Gemfile: compile error - syntax error, unexpected :, expecting $end gem tzinfo-data, platforms: [:mingw, :x64_mingw, :mswin, :jruby]^. Bundler cannot continue. 原因是: redmine不同版本对ruby版本有…

linux限制ping的时间,如何限制Linux命令程序运行的时间

Linux提供了大量的命令,每个命令都是唯一的,并且在特定的情况下使用。Linux的目标是帮助您尽可能地高效工作。Linux命令的一个属性是时间限制。您可以为任何您想要的命令设置时间限制。如果时间过期,命令停止执行。在本教程中,您将…

微软网络工具psping介绍

该工具功能主要包括:ICMP Ping、TCP Ping、延迟测试、带宽测试,而且它是微软出品的下载地址:https://download.sysinternals.com/files/PSTools.ziphttp://technet.microsoft.com/en-us/sysinternals/jj729731解压后把psping.exe丢到C:\Windo…

mac svn

https://formac.informer.com/tortoisesvn

linux无法下载ftp,linux 不能下载怎么办

linux 不能下载怎么办?关于Linux下vsftp匿名用户上传和下载的配置配置要注意三部分,请一一仔细对照:1、vsftpd.conf文件的配置(vi /etc/vsftpd/vsftpd.conf)#允许匿名用户登录FTPanonymous_enableYES#设置匿名用户的登…

Spring IOC实现原理

2019独角兽企业重金招聘Python工程师标准>>> 1、BeanDefinition 对依赖翻转模式中管理对象依赖关系的数据抽象 实现依赖翻转功能的核心数据结构依赖翻转功能都是围绕对BeanDefinition 处理完成的有了这些BeanDefinition 基础数据结构,容器才能发挥作用2、…

openlayers入门开发系列之图层控制

本篇的重点内容是利用openlayers实现地图图层控制功能,效果图如下: 部分核心代码如下:页面引用ztree插件图层管理器界面布局图层管理器初始化jsLayerSwitcher类定义详细的实现过程见:这里

windows版本的redis

redis官网是不提供windows版本的。 微软的github上有windows版本下载,不会是redis的最新版本,是基于redis稳定版本制作的。 redis官网关于文档版本的说明: Redis uses a standard practice for its versioning: major.minor.patchlevel. A…

一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) Predicate为jdk1.8新增接口,由…

使用nginx代理,怎么获取真实的IP

1.在nginx.conf配置中加入配置信息 proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; 2.然后…

catcti监控linux主机,CentOS7搭建Prometheus 监控Linux主机

简介prometheus可以拆分成多个节点进行指标收集。安装prometheuswget -c https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gztar zxvf prometheus-2.23.0.linux-amd64.tar.gz -C /opt/cd /opt/ln -s prometheus-2.23.…

linux 安装redis2.8.3,Linux及Windows安装Redis(详细)

标签:Linux及Windows安装Redis1.Windows安装教程1.1下载https://github.com/MSOpenTech/redis/releases进入github里下载redis Windows版压缩包将我们下载好的文件放进新建的一个Redis文件夹(我在C盘创建了一个redis的文件夹)1.2启动服务打开我们Windows版的dos命令…

Git 少用 Pull 多用 Fetch 和 Merge

转自:http://www.oschina.net/translate/git-fetch-and-merge --------------------------------------------------------------------------------- 本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让…

IDEA生成可运行jar包

方式1: maven打包 maven 包中添加如下配置 <build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><descriptorRef&…

TortoiseGit 修改密码

当TortoiseGi默认设置了凭证助手为“管理器-所有windows用户”&#xff0c;每次向远程git推送时&#xff0c;都会去windows的凭证管理器里读取值&#xff0c;然后推送。 如果密码修改了&#xff0c;或者密码不小心输入错了&#xff0c;每次提交都会报错&#xff1a;HTTP Basic:…