专栏首页数据库架构之美MHA vs MGR谁更合适用在生产系统

MHA vs MGR谁更合适用在生产系统

MySQL为什么如此流行的原因是因为它很早就有了非常成熟的高可用方案,这个方案就是mha,很多互联网公司都是基于mha做的高可用,所有受众面非常广。其实还有个小原因就是我们从上大学学习数据库原理这门课的时候老师就是拿mysql数据库作为例子,使得我们大部分人对它更加熟悉。

相比起来pg的流复制出来的较晚,而且高可用方案也不统一,虽然流复制是基于xlog物理日志的复制技术,性能比mysql binlog逻辑复制好很多,但是相比起来pg差在生态上,在中国pg的客群并不大,受众面没那么广。

好,进入正题,mysql的mha和mgr到底谁才是“正房”。谁才是生产环境中最好的高可用方案。

这么比较其实是有点问题的。我们知道mha是外部的基于mysql主从半同步开发的一套高可用切换方案,它并不属于mysql内核,独立于mysql存在于外围,mha重点在切换,可以理解为一套切换工具。而mgr存在于mysql内核层面,是内核层面数据强一致方案,它的重点在高可用强一致,如果将mgr用在生产环境中,那么针对mgr,还需要开发一套监控及切换方案,而mha将这一整套切换方案vip之类的都考虑进去了。

mha会在集群中某台机器一般是slave节点安装mha manager,当master出现故障时,可以自动将最新数据的slave提升为master同时将所有其他的slave指向新的master,整个过程是透明的,对应用无感知,切换时间一般在30s以内,非常高效。mha适用于一主一从,一主多从,一般配合半同步使用,预防数据丢失。

mha大致原理是manager进程会定期(一般是1s一次)探测主库节点,当主库出现故障时,mha会找到应用了最新日志的slave的binlog位置,并且拉取主库和最新从库的差异日志并应用到该从库上。,然后将该从库提升为master,并且将其他从库指向新主库,切换过程配合vip的漂移。

mgr全称是mysql group replication,它其实是对mysql半同步的一个创新,它至少要求三个节点,三个节点间基于paxos协议做同步,paxos协议是多主节点的强一致协议。

mgr有两种模式,单主模式和多主模式,区别就是是否提供多个节点同时写入的能力。由于mgr采用乐观锁,在高并发的情况下很容易在提交那一刻造成冲突,所以在生产环境中一般采用单主模式居多。

Paxos协议能容忍少数节点宕机,因为paxos协议要求一半以上的节点收到日志主库才可以提交。在单主模式下,当主库宕机,集群会根据group_replication_member_weight设置的权重值进行备机升主,因为是强一致协议,所以不存在日志是否是最新的问题,如果权重相同,那么会根据server的uuid进行排序。

mgr本身还有一些限制,比如写集合冲突问题,必须要求有主键,只支持innodb,不支持外键、save point等,还有集群的强一致导致对网络的要求较高,如果遇到网络波动,对集群的影响较大。

mgr本身能够实现故障自动选举,但是生产环境需要做到对应用的透明,所以一般是基于vip的,应用连接的是vip,如果发生切换,需要将vip也漂移到新主库,这里其实还涉及到很多判断和切换逻辑,所以mgr并不是切换方案,他只是提供了一种新的强一致高可用技术,要想把它用于生产环境中其实还有很多工具和脚本要进行开发。

个人觉得,mha在mysql的高可用方面还是最经典成熟和无可撼动的。至于mgr新技术大家也可以抱着研究的心态玩一玩,但是说用mgr来替换mha不管从成本还是可靠性考虑我觉得都不可取,仅代表个人观点哈。

好吧,加油吧。

本文分享自微信公众号 - 数据库架构之美(databasekernel),作者:数据库架构之美

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pgxc架构下两阶段提交异常分析

    在当前去IOE的大潮下,分布式数据库正如火如荼的发展起来,特别是国产数据库呈现了井喷态势。一个典型的分布式数据库应该具有如下组件:①协调节点,也叫sql转发节点...

    数据库架构之美
  • PostgreSQL数据库xlog文件命名为何如此优美

    我们会在postgresql数据库的数据目录下pg_xlog(新版本已经变为pg_wal)目录下看到下面这些文件:

    数据库架构之美
  • 史上最全-oracle12c pdb迁移实践

    Oracle在12c版本引入了多租户的概念,在一个cdb的根容器下可以创建多个pdb供不同用户使用,cdb中主要保存数据库元数据,而pdb中保存用户数据,各个p...

    数据库架构之美
  • go web: 4 处理默认错误

    在go web中,难免会引发panic。比如用户在一次请求中输入了不正确的数据导致除0或者数组越界。如果不设置默认的错误处理,那程序就会崩溃退出,这显然是不能接...

    超级大猪
  • Python 多进程与多线程

    看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。 问题: 1、Python 多线程为什么耗时更长? 2、为什么在 Python 里面推荐使用...

    猴哥yuri
  • SQL解析在美团点评中的应用

    美团技术团队
  • ViewPager+ Fragment结合的setUserVisibleHint()调用时机

    最近的项目使用到了ViewPager + Fragment的模式,要求在每次Fragment获取显示的时候来刷新数据,该项目下ViewPager有5个子frag...

    Android技术干货分享
  • Python基础知识点梳理8 之 Python的线程与进程别傻傻分不清

    最近整理了一个Python新手学Python系列方便新人学习与熟手回顾基础知识.

    叫我龙总
  • EC2上的深度学习:CUDA 7/cuDNN/caffe/DIGITS实战教程

    用户1737318
  • Java集合框架源码解析之HashSet

    叶应是叶

扫码关注云+社区

领取腾讯云代金券