CTO问我:MySQL从节点上的服务崩了,还怎么「主从读写分离」?

简介: 我们的项目采用了读写分离的方案:查询和更新的业务走主库,统计相关的功能走从库,从而减少主库的压力。原理如下图所示:

背景

我们的项目采用了读写分离的方案:查询和更新的业务走主库,统计相关的功能走从库,从而减少主库的压力。原理如下图所示:

读写分离的方案

如果从库崩了,实在无法访问了,就会把所有请求打到主库上。原理如下图所示:

从节点崩了,部分流量打到主节点

但是最近遇到一个问题,MySQL 从节点上的服务无缘无故的崩了,查看日志也找不到什么端倪。

为了保证从节点的可用性,我们使用了 Keepalived 软件来监测从节点存活状态,如果从节点崩了,则自动重启 MySQL 容器。

本篇将会讲解没什么卵用的排查记录,以及如何保证从节点可用性,注意,还不是完全的高可用。

一、排查记录

虽说没有找到 MySQL 从节点容器真正崩了的原因,但是这排查记录还是得记录下。

1.1 查看 MySQL 的容器日志

docker logs 043 --tail 200

2023-02-08 6:27:30 开始 Shutdown 了,没有提示为什么 shutdown。

2023-02-08 6:27:34 Shutdown 完成

1.2 查看 MySQL 的错误日志

cat /var/log/mysql/error.log
这个路径在 my.cnf 配置。

可以看到 6:27:30 没有异常日志。

这不就尴尬了,完全不知道为啥崩了。

(备注:另外也可以看下容器的信息,docker inspect <容器 id>,会显示容器什么时候启动和停止的。)

二、怎么理解读写分离

读写分离有个限制条件就是主库可以用来做读写,从库实时同步主库数据,而且从库是只读的。

我们的项目中有统计功能就是连接从库查询数据,从库不会进行数据更新的操作。

读写分离我认为可以分为两种:

  • 1、完全的读写分离:主库只用来更新数据,从库只用来查询数据。
  • 2、部分读写分离:主库既可以用来读数据,又可以进行查数据;从库作为只读的备库,分担耗性能的查询工作。

我们项目采用的是第二种方案,涉及到 I/O 密集型的查询工作就交给 MySQL 从库去处理。

部分读写分离

三、从节点的高可用如何保证?

3.1 保证从节点的可用性

采用 keepalived 自动检测 MySQL 服务是否正常,如果不正常,自动重启 MySQL 容器。

提高从节点的可用性

3.2 从节点数据库无法重启了怎么办?

目前从节点只有一个节点,如果从节点崩了,从哪执行查询?

有两种方案:

  • 方案一:读操作切换到主库去查询。带来的问题:主库的压力会很大。
  • 方案二:部署两个从节点,从节点之间相互同步数据,只有一个从节点提供服务,另外一个节点作为备用从库,前者崩了的话,流量自动切换到后者。(需要两个节点开启 Keepalived 来提供流量切换的能力)带来的问题:部署的复杂性,主从同步延迟。

目前我们采用的是第一种方案,如果从节点崩了,读操作会切换到主库上去执行。所以保证从节点不崩就很重要了

四、实践:保证从节点的可用性

这次我们要做的就是在在从节点开启 Keepalived,以及修改重启 MySQL 的脚本。从节点的 Keepalived 的 VIP 地址和主节点的 Keepalived 的 VIP 不一样

原理如下所示:

从节点首先得安装和配置 keepalived 在之前的文章中已经详细讲解过了。

我在讲解主主切换的文章中提到过 keepalived 承担的职责是就是监测 MySQL 服务是否正常,如果不正常,则重启 MySQL,如果重启失败,则退出 keepalived,自动将流量切换到另外一个节点。

这次的从节点只作为备库没有切换到主库的要求,所以在主库宕机后,不需要接管读写的流量

4.1 启动 keeaplived 服务以及开机自启动

安装好 keepalived 之后,执行以下命令启动。

systemctl start keepalived

启动 keeaplived 服务

还需要设置 keepalived 开机自启动。

sudo vim /etc/rc.local
添加以下命令
systemctl start keepalived

具体内容可以看这篇实战 MySQL 高可用架构

实战 MySQL 高可用架构目录

4.2 如何监测 MySQL 服务的健康状况

keepalived 配置文件中定时监测 MySQL 服务的健康状况。

修改配置文件:

sudo vim /etc/keepalived/keepalived.conf

4.3 如何自动重启 MySQL 服务

自动重启 MySQL 的脚本之前也讲解过,这里再贴一下。当 keepalived 检测到 MySQL 无法连接时,就自动重启 MySQL 容器。

如何自动重启 MySQL 服务

4.3 如何不让 Keepalived 切换流量到其他机器

因为主节点也是开启了 Keepalived,如果主从的 Keepalived 的 VIP 都是同一个(之前配置的是 192.168.56.88),那么如果主节点崩了,就会将流量自动切换到从节点,因为我们这个从节点只作为备库,不需要它升级为主库,所以可以将主从节点的 Keepalived 的 VIP 设置为不一样,这样的话,从节点就不会升级为主节点。

这里我们就把之前的 VIP 192.168.56.88 改为 192.168.56.89

修改配置文件:

sudo vim /etc/keepalived/keepalived.conf

如何自动重启 MySQL 服务

同时重启脚本中,有一行命令是强制退出 keepalived(killall keepalived),这行命令可以让 Keepalived 就有将流量切换到其他机器的能力。如果让 keepalived 强制退出,则会将流量切换到另外一台 keepalived 还存活的机器上。

这里不需要切换,就可以注释掉这行命令。

五、总结

我们项目采用了数据库读写分离的模式,但是没有对从节点做高可用,所以也遇到从节点不能提供服务的问题。

本篇通过一次 MySQL 从节点崩了的事件,引出了如何对从节点做高可用,然后从实践的角度详细讲解了如何去配置 keepalived 来保证从节点的高可用。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
SQL 关系型数据库 MySQL
如何实现 MySQL 的读写分离?
本文介绍了 MySQL 读写分离的实现方式及其主从复制原理,解释了如何通过主从架构提升读并发能力。重点分析了主从同步延时问题及解决方案,如半同步复制、并行复制等技术手段,并结合实际案例探讨了高并发场景下的优化策略。文章还提醒开发者在编写代码时需谨慎处理插入后立即查询的情况,避免因主从延时导致的数据不一致问题。
1187 44
如何实现 MySQL 的读写分离?
|
9月前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
280 18
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
563 0
|
10月前
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
593 2
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
736 3
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
1050 2
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
152 2
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
169 0
Node服务连接Mysql数据库
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之mysql节点如何插入数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
221 1

推荐镜像

更多