博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GitHub 的两次故障分析
阅读量:5099 次
发布时间:2019-06-13

本文共 1901 字,大约阅读时间需要 6 分钟。

GitHub 在本周遭受了两次服务故障,其中一次是1小时46分钟的无法访问,另外一次是接近一小时的性能故障。这比我们标准要差很多,我们对此表示抱歉。我想要解释究竟发生了什么事情,以及我们采取了什么措施以防止这些问题再次发生。

背景介绍

在八月中旬的一次维护中,我们的维护团队用一组三个节点的集群替代了老旧的 DRBD-backed MySQL 服务器。这些服务器有两个虚拟的 IP,其中一个可以用来读写,另外一个只读。这些虚拟 IP 是通过Pacemaker 和 Heartbeat 管理的,这两个软件在我们的架构中用的很多。MySQL 的复制(active/standby)是通过 Percona Replication Manager 完成的。我们的应用基本上只使用 active 的节点,不论读写操作。

这样的配置提供了有效的冗余。在之前的架构中,假如一个 MySQL down 了,我们需要冷启动另外一个 MySQL 。而新的架构中,MySQL 始终是在运行的,MySQL 之间的切换是通过虚拟 IP 的切换来完成的。

9月10日,星期一

这个事情的起因是因为一次无伤大雅的数据库迁移。我们使用 two-pass 迁移系统,以达到无停机 MySQL schema 迁移。这个是最近才加上的操作,不过我们已经做过好几次了。

周一的迁移导致了比往常迁移更高的数据库压力。由于压力太高导致 master 节点没有通过 Percona Replication Manager 的健康检查。所以 Percona Replication Manager 将“active”和 master 数据库移到另外一台服务器上,并且停止了出问题的 MySQL。

与此同时,新的 active 数据库的 InnoDB 缓存是空的,所以性能比较差。系统的压力一下子又起来了,于是 Percona Replication Manager 的健康检查又报错,所有 active 服务器又被切换到了原来那台服务器上。

这个时候,我决定禁用所有健康检查,通过 Pacemaker 的 maintenance-mode 来完成。随着缓冲的渐渐形成,网站的性能渐渐的起来了。

9月11日,星期二

第二天上午,开发人员通知运维组,standby 的 MySQL 返回的结果不正确。我研究了一下,发现当昨天集群设置为 maintenance-mode 的时候,导致了 standby 服务器的 replication master 错误。所以我决定禁用 maintenance-mode ,让 Pacemaker 和 Persona Replication Manager 恢复正常。

译者注:翻译不下去了,十分细节,强烈建议看原文!

In ops I trust

两次故障的根本原因都是数据库的故障切换功能。每次发生故障切换的时候,假如由人来判断的话,都是不应该做切换操作的。自动的故障切换在很多时候是好的。在经过仔细的考虑过后,我们认为我们的主要数据库并不需要这个功能。所以我们修改了 Pacemaker 的配置,只有人为操作才会对 active 数据库进行故障切换。

我们也在研究如何解决故障切换时候的性能问题,不论是紧急情况还是例行维护。有不少工具可以用来初始化 InnoDB 的缓存池,我们正在研究中。

最后,我们的运营团队正在对周二发生的 Pacemaker 和 Heartbeat segfault 错误进行调查。

故障状态网站

我们网站状态信息部署在 Heroke 上面,以保证在网站故障的时候,状态信息是可以被访问的。但是,在周二的故障中,我们的网站状态也遇到了一些问题。

由于访问状态网站的流量突然增加,我们把节点数从8增加到64最后增加到90。但增加节点起了反作用,因为我们的数据库(共享的)是非常陈旧的。新增的节点把数据库连接都站了,导致其他进程的崩溃。

通过和 Heroku 支持的沟通,我们把 production database 启动了,状态网站的表现有了明显的提升。自从这次事故以后,我们为状态网站也加了第二台数据库,以保证在突发状况下的可用性。

展望未来

我们最近对数据库的改动是为了提高可用性而做的,但是我很抱歉它起了反作用。我们的运维团队始终专注于提供快速,稳定的 GitHub 体验,我们将继续优化我们架构,软件和方法来提高用户的体验。

文章转载自:开源中国社区

转载于:https://www.cnblogs.com/xusir/archive/2012/09/19/2693162.html

你可能感兴趣的文章
C# 流总结
查看>>
org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/input
查看>>
jumpserver安装与部署
查看>>
Apache,php配置
查看>>
Python特殊语法:filter、map、reduce、lambda
查看>>
vs2008 此安装不支持该项目类型
查看>>
C# Hash算法
查看>>
转:C语言深度剖析三
查看>>
Educational Codeforces Round 69 (Rated for Div. 2) A - DIY Wooden Ladder
查看>>
stm32之CMSIS标准、库目录、GPIO
查看>>
Dima and Lisa
查看>>
《算法4》回顾(一)
查看>>
Repeater用ul li,一行显示多条数据
查看>>
Java并发(四):并发集合ConcurrentHashMap的源码分析
查看>>
5. Longest Palindromic Substring
查看>>
Maven 三种archetype说明
查看>>
oracle自关联表的子删父变功能实现
查看>>
程序员需要具备的基本技能
查看>>
jsoncpp cmake
查看>>
Web消息主体风格(Message Body Style)
查看>>