mysql mmm和mha对比

server/2024/12/27 1:23:53/

本文简单介绍MySQL的两个high availability方案,MMM和MHA。

MMM

MMM(Master-Master replication managerfor Mysql)的基本组成如下,

  • 主节点master1:承载写流量
  • 备主节点master2:replicate主节点master1的写流量,在主节点故障时被monitor提升为主节点,出于与master1数据强一致的考虑,replicate模式一般配置为semi-sync
  • 从节点slave1:replicate主节点master1的写流量,为使得master1的写足够快,一般将replicate模式设为异步
  • 从节点salve2:类似于slave1
  • mmm-agent:以上3个节点都需部署的代理,与monitor进行通信
  • mmm-mon:即monitor,与各mmm-agent通信探测其健康情况,并决策是否要切换主节点或从节点
  • wvip:提供写的虚拟IP,映射到当前活跃的主节点master1
  • rvip:提供读的虚拟IP,至少有一个,映射到slave1或slave2

MMM的主节点切换过程如下:

  • master1的mmm-agent与mmm-mon长期通信失败
  • mmm-mon请求master1的agent,移除VIP
  • mmm-mon请求master2的agent,绑定VIP
  • mmm-mon请求slave节点的agent,连接到新master进行replicate

从节点的故障切换类似于上面的过程。

优点如下,

  • 读写分离
  • fail自动切换

缺点如下,

  • mmm-mon存在单点故障
  • mmm-agent对网络抖动敏感,可能引起频繁切换
  • 可能引起master脑裂(见下文解释)
  • 多了一个冗余的master节点
  • 需要比较多的VIP数量
  • 方案基于VIP,VIP是基于ARP协议,因此所有节点必须处于同一局域网
  • 主节点提升需要一定时间
  • 写后即时读难以保持一致性(master同步过来的数据可能还在relay log未被应用)

MHA

MHA(Master High Availability)不同于MMM,它主要保障的是master的高可用。官方的MHA建议至少要有1主2从,淘宝TMHA则支持1主1从。其基本组成如下,

  • master:主节点,承载写流量
  • slave:从节点,replicate主节点数据,承载读流量
  • wvip:提供写的虚拟IP,映射到主节点
  • rvip:提供读的虚拟IP,如果只有一个从节点不需要
  • manager:与master、slave通信,负责切换主节点。注意,manager通过ssh的方式远程执行主、从节点上的脚本,需要提前将manager节点的ssh公钥放置到主、从节点;另外,manager通过mysql-client的方式去探测主、从节点的可用性,因此主、从库上也要预先为manager节点分配账户与授权

master提升主节点的流程如下,

  • 从宕机崩溃的master保存二进制日志事件(binlog events);
  • 识别含有最新更新的slave;
  • 应用差异的中继日志(relay log)到其他的slave;
  • 应用从master保存的二进制日志事件(binlog events);
  • 移除旧master的VIP地址,提升一个slave为新的master;
  • 使其他的slave连接新的master进行复制;
  • 在新的master启动vip地址,保证前端请求可以发送到新的master

优点如下,

  • 相比MMM不需要冗余的master节点
  • 读写分离
  • 自动提升主节点

缺点如下,

  • manager节点单点故障
  • 可能引起master脑裂(见下文解释)
  • 使用了VIP,同样有内网限制
  • 主节点切换需要一定时间
  • 写后即时读难以保持一致性
  • 需要支持SSH私钥验证的方式登录

扩展知识:VIP与脑裂

VIP的工作原理是,

  • 为当期主机配置一个虚拟网卡,如eth0:0,该网卡绑定了唯一的MAC地址和虚拟IP地址VIP
  • 局域网内的主机欲与该VIP通信时,先通过ARP协议取到该VIP对应的MAC地址,再将VIP与MAC地址的对应关系缓存在其主机上
  • 后续通信时,使用上一步骤取到的MAC作为报文的MAC地址

VIP切换的原理是,

  • 将旧master绑定的虚拟网卡注销掉
  • 在新的master注册新的虚拟网卡(产生了新的MAC地址)
  • 通知局域网节点更新VIP与MAC的对应关系,后续通信采用新MAC地址

脑裂的原因,在于旧master节点没有正常将VIP摘掉,这时局域网机器通过ARP获取VIP的MAC时,就可能取到旧的MAC地址,导致与旧master通信。什么情况会出现这种情况呢?旧master由于上层交换机故障,未与manager节点正常通信,此时VIP是没有摘除掉的,过了一段时间上层交换机恢复了就会导致此问题。

参考文献

  • MySQL High Availability at GitHub - The GitHub Blog
  • https://dzone.com/articles/choosing-mysql-high-availability-solutions
  • 美团点评MySQL数据库高可用架构从MMM到MHA+Zebra以及MHA+Proxy的演进-腾讯云开发者社区-腾讯云
  • mysql复制高可用方案总结 – 西门飞冰的博客


http://www.ppmy.cn/server/153477.html

相关文章

MFC/C++学习系列之简单记录——序列化机制

MFC/C学习系列之简单记录——序列化机制 前言简述六大机制序列化机制使用反序列化总结 前言 MFC有六大机制,分别是程序启动机制、窗口创建机制、动态创建机制、运行时类信息机制、消息映射机制、序列化机制。 简述六大机制 程序启动机制:全局的应用程序…

使用docker compose安装gitlab

使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置 GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 GitLab是一个基于Git的开源项目&#xff0c…

用Python开启人工智能之旅(四)深度学习的框架和使用方法

第四部分:深度学习的框架和使用方法 用Python开启人工智能之旅(一)Python简介与安装 用Python开启人工智能之旅(二)Python基础 用Python开启人工智能之旅(三)常用的机器学习算法与实现 用Pyt…

使用C#创建人名或其他物体随机分组

假设您有一群人&#xff0c;您想将他们随机分配到多个团队。 public class Randomizer {public static void Randomize<T>(T[] items){Random rand new Random();// For each spot in the array, pick// a random item to swap into that spot.for (int i 0; i < i…

2024年河北省职业院校技能大赛云计算应用赛项赛题第2套(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

使用 Python 创建多栏 Word 文档 – 详解

目录 引言 一、工具与安装 二、Python 在 Word 中创建简单的多栏布局 三、Python 在 Word 文档的栏间添加分隔线 四、Python 从Word文档的指定位置开启多栏设置 五、Python 为多栏 Word 文档的各栏添加页码 引言 在文档设计中&#xff0c;排版不仅决定了内容的呈现方式&…

Unity3D仿星露谷物语开发7之事件创建动画

1、目标 掌握事件通知的Publisher - Subscriber设计模式&#xff0c;并通过事件通知触发动画。 2、发布者/订阅者模式 首先&#xff0c;定义事件Event 然后&#xff0c;Publisher触发事件 最后&#xff0c;Subscriber订阅事件并进行处理 &#xff08;1&#xff09;创建动作…

【每日学点鸿蒙知识】沙箱目录、图片压缩、characteristicsArray、gm-crypto 国密加解密、通知权限

1、HarmonyOS 如何创建应用沙箱目录&#xff1f; 下载文件&#xff0c;想下载到自己新建的应用沙箱目录&#xff0c;有什么方法实现吗&#xff1f; fs.mkdir可以创建目录 参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis…