2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]2020 年 3 月 5 日,农历二月十二,惊蛰,宜搬家、安机械。由于主数据库磁盘容量告急,我们决定将主数据库迁移至新的物理设备。上一次迁移是在 2018 年,我们从 SAS 磁盘迁移至 SSD 磁…

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录

因此我们决定再次迁移主数据库,这次我们准备了更大的磁盘,更好的设备。但是天有不测风云,新冠病毒疫情的扩散打乱了我们的计划,无限期延迟开工、交通管制等等因素导致我们的迁移计划不得不延后执行。

但是迁移迫在眉睫,我们不得不执行 plan B。

由于 SSD 设备无法就位,我们决定临时使用 SAS 设备作为新的数据库服务器。我们将服务器初始化、调优、部署应用、开始实时增量同步数据。

前期的准备工作有条不紊的进行着,看似风平浪静,然而一场悲剧正悄然酝酿。

2020 年 3 月 5 日凌晨 1:00 迁移工作进行到切换应用数据库连接地址这一步,此时我们需要对应用进行热重启,期间服务会有间歇性不可用,所以我们提前发出了公告。

我们确保数据一致后开始对后端应用配置的分发和热重启,事情进展顺利,数据库连接地址切换完成,应用正常,从库数据同步正常。

系统监控各项指标很快就上来了。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

旧 MySQL 服务器停用后,各项指标也降了下来。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

此时我们发现了一个问题,就是 MySQL slow_log 在不断增长,slow queries 是之前的 10 倍( 5-15/s ),此时并没有对线上服务造成影响,但此时是业务低峰期,并不代表明天业务回升也是如此。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

I/O 操作耗时对比,上为 SSD ,下为 SAS

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

由于新的数据库服务器使用的是 SAS 磁盘,相比此前的 SSD 磁盘性能有所下降,但在 SSD 之前我们也是使用但 SAS 磁盘,并且没有出现影响服务的情况。

从监控系统上看,新的数据库服务器表现为磁盘 io 耗时大, CPU iowait 高,于是我们做一些了简单的调整(服务器和 MySQL 配置已在启用前就做好了调优工作):

  1. 上调 innodb_buffer_pool_size 值,从 24G 上调至 48G

  2. 设置 sync_binlog0 ,减少写入磁盘的操作。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

此时 MySQL 和应用表现平稳,进展顺利,于是我们公布:迁移结束。

2020 年 3 月 5 日 上午 6:55 红薯在工作群里发了一张图,并吐槽道:“第一次加载很慢,第二次快”。一种不好的预感在运维组里扩散,要出事!

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

果然, 上午 7:25 ,此时的 slow queries 已经增长到 35/s ,尽管服务并没有表现出来很大的异常,但这绝对不正常!

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

同时段, SSD 服务器 slow queries

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

随着访问量不断上涨,问题显现出来了。应用间歇性的出现 502 , slow queries 短时间上涨到 1k/s 以上。这时运维组已炸开了锅,登录服务器,联合 DBA 一起排查问题原因。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

MySQL 服务器最直观的表现仍然是磁盘 io 耗时大, CPU iowait 高,此时 InnoDB Buffer Pool Data 已经上涨到 47G ,缓存写满了,缓存/物理内存占比 75% ,显然再上调缓存也无济于事。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

问题就出在磁盘性能上。为了确保数据安全, MySQL 服务器磁盘阵列选择了 RAID10 ,磁盘写性能相比 RAID5 低,同时磁盘为 SAS 磁盘,进一步降低了写性能,于是我们在 SSD 服务器上没有遇到的问题,在 SAS 服务器上遇到了。

在服务器上执行 iotop 时我们还发现 jbd2 这个进程占了 60% io , JBD( Journaling Block Device )日志记录块设备,为文系统日志记录提供了一个独立于文件系统的接口。可以通过以下命令查看分区是否开启:

sudo dumpe2fs /dev/xxx
Filesystem features:      has_journal

代码100分

ext4 格式分区是默认开启的,而且不建议关闭。

最终,种种排查结果都指向了一点——磁盘性能。

到此,我们决定,将 MySQL 再次切换回 SSD 服务器,等采购新等 SSD 服务器就位后再次执行迁移。

于是我们决定回撤此次机器的升级。上午 10:10 分,我们抱歉的给用户发出了服务临时变更公告。

10:20 我们开始切换, 10:30 再次切换完成,应用数据库连接地址改回到 SSD 磁盘,服务恢复正常。

2020 年 3 月 5 日凌晨,码云主数据库切换问题记录[通俗易懂]

最后,此次事故的出现可以小结为:

  1. 时间紧急,设备未能及时就位,只能选择临时的应急预案;

  2. 对于 SAS 磁盘的性能我们想当然了,在最开始的 SAS 磁盘上运行正常的服务,随着业务量增加,性能需求上没有做好充分的评估;

  3. 对于新的 MySQL 服务器,我们在明知是 SAS 磁盘性能存在瓶颈的情况下,没有做好充分的性能测试,导致上线后性能不足以支撑服务;

所幸的是,原 SSD 磁盘在切换完成后就做了主从同步,将新 SAS 服务器作为主,所以数据一直保持着同步,这为迁移后快速回滚做好了准备。

对于此次变更给用户带来的不便,我们深表歉意。盲目自信和一时疏忽导致了这次事故,我们痛定思痛,坚决不让类似的事故再次出现。

因此我们要谨记:坚决不打没有准备的战!

越透明越可信,我们将这次过程完整分享出来,也更多的希望技术人可以多分享故障的过程以及处理的思路,避免更多的人踩坑。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9679.html

(0)
上一篇 2023-02-03
下一篇 2023-02-03

相关推荐

  • 如何用SQL查询数据

    如何用SQL查询数据SQL是Structured Query Language的缩写,它是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。在许多应用程序中,SQL都是用于存储、管理和检索数据的必要工具。掌握SQL的能力是每个数据科学家和数据库管理员的必备技能之一,本文将从多个方面详细介绍如何使用SQL来查询数据。

    2024-08-20
    30
  • 使用flaskrun启动Python Flask应用程序

    使用flaskrun启动Python Flask应用程序Python Flask是一款优秀的Web应用框架,提供了丰富的功能和扩展性。在使用Flask开发Web应用程序时,我们需要启动一个Web服务器来运行应用程序。本文将介绍如何使用flaskrun启动Python Flask应用程序,帮助Python开发者快速进入Flask开发领域。

    2024-05-11
    75
  • Percona-XtraDB

    Percona-XtraDBPXC(Percona-XtraDB-Cluster)5.7版本集群部署 Centos 7.3系统部署Mysql 集群 PXC三个节点分别执行和安装(1)配置hosts cat /etc/h

    2022-12-29
    142
  • Python Tinker: 快速实现图形化界面的Python GUI库

    Python Tinker: 快速实现图形化界面的Python GUI库Python 自带了 Tkinter 模块,可以用来开发 Python 的 GUI 应用程序。

    2024-04-02
    75
  • Python列表添加元素详解

    Python列表添加元素详解Python是一门高级动态语言,常用于数据处理、Web开发、人工智能等领域。其中列表是Python中的一种常用数据结构,可以动态地添加、删除和修改元素。在这篇文章中,我们将详细介绍Python列表添加元素的方法。

    2024-08-31
    22
  • mysql如何利用Navicat 导出和导入数据库

    mysql如何利用Navicat 导出和导入数据库MySql是我们经常用到的数据,无论是开发人员用来练习,还是小型私服游戏服务器,或者是个人软件使用,都十分方便。对于做一些个人辅助软件,选择mysql数据库是个明智的选择,有一个好的工具更是事半功倍…

    2023-03-19
    164
  • sqlserver分组排序取最大一条_sql组内排序

    sqlserver分组排序取最大一条_sql组内排序表结构: 方法1: select a.* from Table_Test as a where 3 > (select count(*) from Table_Test where Brand_

    2023-02-22
    172
  • 使用Pycharm安装Jupyter教程

    使用Pycharm安装Jupyter教程Jupyter Notebook是一个非常流行的开源交互式笔记本,以前被称为IPython Notebook。它可以用于数据可视化,机器学习和数据科学工作流程,具有可重复性,交互性和易于分享的优点。

    2024-06-29
    40

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注