一、概述

上一篇博客中(https://www.cnblogs.com/ddzj01/p/11535796.html)介绍了如何搭建MMM架构,本文将通过实验介绍MMM架构的优缺点。

二、优点

1. 写vip转移

关掉node1的mysql,看集群会发生什么变化
[root@mysqla ~]# service mysql stop

在monitor查看集群状态
[root@monitor ~]# mmm_control show

  
在node3中查看
(root@localhost)[(none)]> show slave status\G

可以看到写vip(10.40.16.71)已经漂移到node2,并且node3重新指向了node2

2. 读vip漂移

启动node1的mysql
[root@mysqla ~]# service mysql start

在monitor查看集群状态(可能需要等接近一分钟才能看到下面的状态)
如果长时间是AWAITING_RECOVERY状态,可以去日志中查看原因/var/log/mysql-mmm/mmm_mond.log,确认都没有问题可以使用手工将节点上线"mmm_control set_online db1"
[root@monitor ~]# mmm_control show

可以看到node1又重新加到集群中了,并且有一个读vip已经漂移到node1上了

关闭node3(从库)的mysql
[root@mysqlc ~]# service mysql stop

在monitor查看集群状态
[root@monitor ~]# mmm_control show

  
可以看到node3(从库)的读vip漂移到了node1上,node3(从库)没有任何读vip了

3. 读延迟

启动node3(从库)的mysql
[root@mysqlc ~]# service mysql start

在monitor查看集群状态
[root@monitor ~]# mmm_control show

在monitor中编辑/etc/mysql-mmm/mmm_mon.conf
添加max_backlog参数,这个参数指的是集群中从库落后于主库多长时间,就将从库上面的读vip摘除。默认是60。

在monitor上重启进程
[root@monitor ~]# service mysql-mmm-monitor restart

在node3(从库)将数据库锁住
(root@localhost)[(none)]> flush tables with read lock;

在node2(主库)对数据库随便做点修改
(root@localhost)[test1]> insert into t1 values(20);

在node3(从库)查看从库状态
(root@localhost)[(none)]> show slave status\G

可以看到从库已经落后了13秒了
                
在monitor查看状态
[root@monitor ~]# mmm_control checks all

可以看到node3显示ERROR: Backlog is too big

[root@monitor ~]# mmm_control show

可以看到node3的读vip又飘走了。

三、缺点

1. 新主如果落后于旧主,故障切换时,容易造成新主的数据丢失

这个好理解,mysql主从采用的是异步架构,主库的日志如果还没有传到从库上就已经down了,从库就丢失这部分事务了。MMM这种架构也不例外。

2. 事务重复提交的问题

在monitor中编辑/etc/mysql-mmm/mmm_mon.conf,将max_backlog参数删除

在monitor上重启进程
[root@monitor ~]# service mysql-mmm-monitor restart

在node3(从库)将数据库锁释放
(root@localhost)[(none)]> unlock tables;

在monitor查看状态
[root@monitor ~]# mmm_control show

现在承担写角色的是节点2

先把node1的sql_thread停掉,模拟node1落后于node2的情况(这种情况是指node1已经接收到node2的日志,但是还没有应用)
(root@localhost)[test1]> stop slave sql_thread;

在node2上插入一条数据
(root@localhost)[test1]> insert into t1 values(20);

然后把node2的msyql关闭
[root@mysqlb ~]# service mysql stop

在monitor查看状态
[root@monitor ~]# mmm_control show

可以看到写vip飘到node1上了

再重启node1的slave进程
(root@localhost)[test1]> stop slave;
(root@localhost)[test1]> start slave;

再来查看node1和node3上t1这张表的数据
node1
(root@localhost)[test1]> select * from t1;

node3
(root@localhost)[test1]> select * from t1;

(root@localhost)[test1]> show slave status\G

可以看到新主变成node1,但是node3上面20却有两条,出现了事务重复提交的情况。

3. 从库丢失事务的情况

先把node2的msyql打开
[root@mysqlb ~]# service mysql start

在monitor查看状态
[root@monitor ~]# mmm_control show

在node1把t1表truncate
(root@localhost)[test1]> truncate table t1;

把node3的sql_thread停掉,模拟node3落后于node1的情况(这种情况是指node3已经接收到node1的日志,但是还没有应用)
(root@localhost)[test1]> stop slave sql_thread;

在node1上插入一条数据
(root@localhost)[test1]> insert into t1 values(10);

把node1的msyql关闭
[root@mysqlb ~]# service mysql stop

再重启node3的slave进程
(root@localhost)[test1]> stop slave;
(root@localhost)[test1]> start slave;

查看node3的复制状态
(root@localhost)[test1]> show slave status\G

可以看到节点重新指向了node2

查看各节点的t1数据
node2
(root@localhost)[test1]> insert into t1 values(20);

(root@localhost)[test1]> select * from t1;

node3
(root@localhost)[test1]> select * from t1;

可以看到现在是同步了,但是此时从库已经丢失了原主库的事务,即10这条数据。

四、总结

MMM这种高可用架构比较老了,从库的数据一致性很难保证,所以在生产上尽量不要使用这种架构。后面将给大家介绍mysql的另一种高可用架构MHA。

Mysql - 高可用方案之MMM(二)的更多相关文章

  1. Mysql - 高可用方案之MMM(一)

    一.概述 本文将介绍mysql的MMM(Master-Master replication manager for MySQL)方案.官方文档地址:https://mysql-mmm.org/star ...

  2. MySQL高可用方案 MHA之二 master_ip_failover

    异步主从复制架构master:10.150.20.90 ed3jrdba90slave:10.15.20.97 ed3jrdba9710.150.20.132 ed3jrdba132manager:1 ...

  3. [转载] MySQL高可用方案选型参考

    原文: http://imysql.com/2015/09/14/solutions-of-mysql-ha.shtml?hmsr=toutiao.io&utm_medium=toutiao. ...

  4. MySQL高可用方案-PXC环境部署记录

    之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...

  5. 五大常见的MySQL高可用方案【转】

    1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...

  6. [转]MYSQL高可用方案探究(总结)

    前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://bl ...

  7. MySQL高可用方案MHA的部署和原理

    MHA(Master High Availability)是一套相对成熟的MySQL高可用方案,能做到在0~30s内自动完成数据库的故障切换操作,在master服务器不宕机的情况下,基本能保证数据的一 ...

  8. MySQL高可用方案MHA自动Failover与手动Failover的实践及原理

    集群信息 角色                             IP地址                 ServerID      类型 Master                     ...

  9. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

随机推荐

  1. 不用任何第三方,写一个RTMP直播推流器

    2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮.然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知 ...

  2. 怎么解决js中如滑动到最底端一次操作触发多次

    定义一个布尔类型到标志,处理中将起设置为true ,处理完改完false,逻辑: data{ isInProcessing:false } //逻辑函数过程中: if(isInProcessing){ ...

  3. 如何彻底理解Java抽象类 为什么要用抽象类 什么情况下用抽象类

    如何彻底理解Java抽象类 为什么要用抽象类 什么情况下用抽象类 呐,到底什么是抽象类,有时明明一个普通类就可以解决了,为啥非得整个抽象类,装逼吗 我曾带着这样的疑惑,查了很多资料,看了很多源码,写了 ...

  4. Asp.net Core 3.0 Identity 使用smtp账户确认和密码恢复

    当新建一个core项目后,使用identity基架后,确认邮件出现了错误,并不能正常使用. 建立文档在这里 https://docs.microsoft.com/zh-cn/aspnet/core/s ...

  5. [TimLinux] django html如何实现固定表头

    1. 需求 表格很长,这个时候就希望表格头部不动,而只是表格内容行支持滚动功能. 2. 方法 两张表:一张表(THeader)负责头部字段的显示,另一张表(TBody)负责内容行字段的显示. 两张表都 ...

  6. CoderForces-375D

    You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...

  7. WY 2019 人工智能数学基础视频教程

    ├─01.第一阶段:AI数学基石 │ ├─01.第一章:线性代数 │ │ │ ]AI Math_[第1章]线性代数v2 .pdf │ │ │ │ │ └─视频 │ │ 01_本章概述.mp4 │ │ ...

  8. css修改overflow滚动条默认样式

    html代码 <div class="inner"> <div class="innerbox"> <p style=" ...

  9. MySQL必知必会-官方数据库表及SQL脚本导入生成

    最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...

  10. 使用Pycharm轻轻松松脱下git版本控制高大上的外衣

    一.思考❓❔ 1.git操作难吗? git操作命令繁杂 需求复杂场景, 使用不易 原理深邃,对初学者来说是有难度的 2.那么难,还要学吗? 作为IT行业从业者(搬砖小工),不会Git?滚,出去~~~ ...