一个月后,我们又从 MySQL 双主切换成了主 - 从!
这是悟空的第 157 篇原创文章
官网:www.passjava.cn
你好,我是悟空。
一、遇到的坑
一个月前,我们在测试环境部署了一套 MySQL 高可用架构,也就是 MySQL 双主 + Keepalived 的模式。详情看这篇:
在这一个月遇到了很多坑:
- 因为两个 MySQL 节点都可以写入,极其容易造成主键重复,进而导致主从同步失败。
- 同步失败后,Slave_SQL_Thread 线程就停了,除非解决了同步的错误,才能继续进行同步。
- 同步失败的错误,不会只有一条记录有问题,往往是一大片的同步问题。
- 两个节点互相缺少对方的数据。
- 主从的同步延迟,切换到新主库后,数据不是最新。
- 当出现不一致时,无法确定以哪个库为准。
造成上面问题的主要原因就是因为两个节点都支持写入 + 双主可以随时切换。
解决这种问题的方案有 改进自增主键的步长(影响未评估),使用 GTID 方案(未验证)。即使这样,双主同步的风险还是有,而且不同步后,如何处理是个大难题。
那么回到我们最初的想法:为什么会选择双主?
最开始的目的就是为了高可用。双主就是说有一台 MySQL 节点挂了,另外一台能够顶上,对于用户来说是无感的,给运维人员一定的缓冲时间来排查 MySQL 故障。另外老的主节点恢复后,不用改配置就能立即成为从节点。
经过这一个月的 MySQL 双主模式的试运行,最后我们还是决定切换到 MySQL 主 - 从模式。
双主模式就是两个节点即是主节点也是从节点,那我们现在切换到一主一从模式,就可以认为是降级。接下来我们聊聊双主换成主从的思路和步骤。
二、双主降为主从
双主模式
双主模式的原理图如下:

两个主节点,都安装了 KeepAlived 高可用组件,对外提供了一个 VIP,只有一个节点接管 VIP,客户端访问的请求都是到这个 VIP,另外一个节点处于待机状态。
主从模式
和双主不一样的地方如下,从节点是只读的。

一主一从是主从模式中的一种,具有以下特点:
- 一个主节点,一个从节点,主节点提供给客户端访问,从节点只通过主节点的 binlog 进行数据同步。
- 从节点是只读的。从节点可以作为只读节点提供类似报表查询等耗时读操作。
- 主节点宕机后,从节点成为主节点,也是高可用的一种方案。
相对于双主的高可用方案,不同之处如下:
- 主从切换需要用脚本将从库设置为可读可写。
- 主从切换后,需要将从库设置为不同步老主库。
- 主从切换后,老的主库恢复后,需要人工设置为只读,且开启同步新主库的功能。
这样来看,主从模式在异常情况下,多了些人工操作。
在异常情况下,主从切换一般是这样处理的:通过脚本监测主节点是否宕机,如果主库宕机了,则从库自动切换为新的主库,待老主库恢复后,就作为从库同步新主库数据,新主库上的 Keepalived 接管 VIP。
目前改为主从模式有两种方式:
- 简单方式:人工切换模式,主节点故障后需要人工切换主从。
- 复杂方式:高可用方式,主节点故障后,主从自动切换,读写分离自动切换。
本篇只涉及简单方式,复杂方式的原理和配置步骤放到下篇专门讲解。
三、改为主从的简单方式
简单方式的主从切换流程如下:

和双主模式的主从切换的区别是,从节点是只读的,Keepalived 没有启动,需要人工操作主从切换和启动 Keepalived。
修改配置的步骤如下:
① 为了避免从节点上的 Keepalived 自动接管 VIP 的情况出现,将从节点的 Keepalived 停止,如果遇到主节点故障,则需要人工干预来进行主从切换。从节点切换为主节点后,重新启动从节点 Keepalived。
systemctl status keepalived
② 保留主节点的 Keepalived,保证 MySQL 的连接信息都不需要变。
③ 主节点 node1 停用 MySQL 的同步线程。
STOP SLAVE
④ 从节点 node2 设置 MySQL 为只读模式。
# 修改 my.cnf 文件read_only = 1
⑤ 移除主节点 node1 同步 node2 MySQL 的权限。
⑥ 从节点 node1 的开机启动项中移除 keepalived 服务自启动。
# 修改启动项配置sudo vim /etc/rc.local# 移除以下脚本systemctl start keepalived
四、总结
双主高可用的坑确实比较多,没有 MySQL 的硬核知识真的很难搞定。笔者在这一个月的实践中,深刻体会到了双主同步的难点所在,最后还是选择了一主一从的模式。
另外因为最开始的配置都是双主模式下的,所以要修改一些配置,来改为主从模式。因项目时间比较紧,目前采取的是非高可用的主从模式。
对于高可用的主从模式,因涉及的原理和步骤较多,我会在下篇中进行讲解。各位卷王也请给我一点时间进行探索和实践~
下一篇:实战 MySQL 主从高可用。
推荐阅读:
一次 Keepalived 高可用的事故,让我重学了一遍它!
- END -
关于我
8 年互联网开发经验,擅长微服务、分布式、架构设计。目前在一家大型上市公司从事基础架构和性能优化工作。
InfoQ 签约作者、蓝桥签约作者、阿里云专家博主、51CTO 红人。
一个月后,我们又从 MySQL 双主切换成了主 - 从!的更多相关文章
- C语言学习一个月后感想
C语言学习一个月后感想 感谢李晓东老板及计算机工程师联盟的学长学姐和某神秘同级同学的辛勤指导,感谢宋雨田的督促和陪伴. 初识C的1..体会 我本以为凭借瓜皮思维和花里胡哨操作可以让我熟练地学习语言,现 ...
- Spring AOP实现Mysql数据库主从切换(一主多从)
设置数据库主从切换的原因:数据库中经常发生的是“读多写少”,这样读操作对数据库压力比较大,通过采用数据库集群方案, 一个数据库是主库,负责写:其他为从库,负责读,从而实现读写分离增大数据库的容错率. ...
- psutil(搬运,一个月后稍后修改)
psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要用来做系统监控,性能分析,进程管理 安装:pip install psutil 1. ...
- js日期操作,某天的N天后,一个月后的日期
var date = new Date(); var tomorrow = date.setDate(new Date().getDate() + 10); //10天后的日期 console.log ...
- NSDate如何获取一个月后的日期
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateCo ...
- 入职一个月后 对.net的感想
我本来应该找Java工程师的岗位的,因种种原因进入了.net开发工程师.然后,我进入了一扇新世界的大门. 1.语法不同,思想相同. 刚入职那几天,每天都好蒙,.net代码语法啥的都和Java不一样,a ...
- 绝对一个月精通vue
马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, 也许你会说你懂, 麻烦你花一个月学vue-cli4以一个完整购物商城来练手, 一个月后,如果还觉得我错,我 ...
- MySQL 仅保留7天、一个月数据
/************************************************************************** * MySQL 仅保留7天.一个月数据 * 说明 ...
- mysql查询一天,查询一周,查询一个月的数据【转】
转自:http://www.cnblogs.com/likwo/archive/2010/04/16/1713282.html 查询一天: select * from table where to_d ...
随机推荐
- 你不知道的Python容器
你不知道的Python容器 你不知道的Python容器 散列表 ChainMap MappingProxyType 线性表 堆 参考资料 昨天阅读了<Python Tricks: The Boo ...
- PowerDotNet平台化软件架构设计与实现系列(13):应用监控平台
本文再写一篇和具体业务逻辑几乎无关的公共服务应用监控平台.PowerDotNet自研的应用监控平台系统,是服务治理的重要拼图,和服务治理平台配合使用效果更好. 监控开源产品非常丰富,站在巨人的肩膀上, ...
- QT快速入门
QT快速入门 本文档将介绍QT工程的创建.UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目. 1 创建QT工程文件 在安装好QT之后,能够在其安装组件中找到Qt Crea ...
- linux下的mysql数据库以及mysql主从复制
参考博客 1.mysql数据库的安装 centos7如何安装mysql 1.yum安装 1.1首先配置yum源,然后再用yum进行安装 2. 源代码编译安装 3.rpm包安装 yum安装的前提条件,是 ...
- 二、深入学习c++需要掌握的基础知识
一.掌握形参带默认值的函数 给定默认值的时候是从右向左给,因为函数在内存中的压栈顺序是按照形参列表的元素从右向左依次向内存中压栈 形参是否有默认值对调用效率的问题:如果有一个默认值,在函数调用的过程中 ...
- 使用 IDEA 构建聚合工程并引入 Spring Boot
简介 聚合工程里可以分为: Project 项目,也可称为顶级项目.顶级工程.父工程 Module 模块,也可称为子模块.子工程 总结一下: 这两者之间是父子继承的关系,即 模块继承顶级项目,模块之间 ...
- OpenHarmony3.1 Release版本关键特性解析——Enhanced SWAP内存管理
樊成阳 华为技术有限公司内核专家 陈杰 华为技术有限公司内核专家 OpenAtom OpenHarmony(以下简称"OpenHarmony")是面向全场景泛终端设备的操作系统,终 ...
- SQL中的数字、字母和汉字
知识点001 当变量的数据类型为VARCHAR时,变量赋值后,变量中的字符所占字节数,数字和字母是1个bytes,汉字是2个bytes; 当变量的数据类型为NVARCHAR时,变量赋值后,变量中的字符 ...
- Docker搭建大数据集群 Hadoop Spark HBase Hive Zookeeper Scala
Docker搭建大数据集群 给出一个完全分布式hadoop+spark集群搭建完整文档,从环境准备(包括机器名,ip映射步骤,ssh免密,Java等)开始,包括zookeeper,hadoop,hiv ...
- docker引起服务器磁盘爆满
服务器异常 又是开开心心打开我心爱的服务器一天: 吔!这是嘛啊?我的服务器域名访问不了了,一直转圈圈超时了,好,打开ssh远程看看,吔!!!还是访问不了,宕机了?怀着一颗憋大便的心情打开了阿里云控制面 ...