写点什么

GitLab 事故之技术详叙:抢救后恢复在线,已确定下一步计划

  • 2017-02-03
  • 本文字数:4194 字

    阅读完需:约 14 分钟

本文对 GitLab 事件进行了全盘回顾,继续追踪 GitLab 在 2 月 1 日发布的申明,追溯各种问题根本原因。然后陈列了恢复在线后,GitLab 声明了哪些下一步举措。最后摘录了一些网友在 Twitter 和 YouTube 的评论,大多数人都对 GitLab 表达了自己的支持和宽容。

事件总览

2017 年 1 月 31 日 18:00(UTC 时间),GitLab 通过推特发文承认 300GB 生产环境数据因为 UNIX SA 的误操作,已经被彻底删除(后发文补充说明已经挽回部分数据),引起业界一片哗然。

2017 年 2 月 1 日 18:14(UTC 时间),GitLab.com 恢复在线。通过使用一个之前的 6 小时备份数据库,GitLab 申明 1 月 31 日下午 17:20(UTC 时间)至晚上 23:25(UTC 时间)之间的数据已经被恢复并可以在生产环境使用,包括项目、问题、合并请求、用户、注释等等。

GitLab 背景

GitLab 目前是硅谷一颗冉冉升起的新星,它估值 3.29 千万美元并且存放着宝贵的用户数据。

GitLab 是基于 Ruby on Rails 开发的一个开源的版本管理系统,它实现了一个自托管的 Git 项目仓库,支持通过 Web 界面进行访问公开的或者私人项目。

GitLab 拥有与 Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序进行交流。此外,GitLab 提供了一个代码片段收集功能,可以轻松实现代码复用,便于日后有需要的时候进行查找。
自 2012 年上线以来,GitLab 已经被超过 10 万个公司或组织使用,包括 IBM、Alibaba.com、Uber、Intel、VMWare 等等。

事件影响

一句话概述

GitLab 申明指出其一个数据库出现了异常,导致 GitLab.com 丢失 6 个小时的数据库数据(问题、合并请求、用户、注释等等),不过 Git / wiki 存储库和自托管安装不受影响。

五点详情

  1. 大约 6 个小时的数据丢失
  2. 大约丢失 5037 个项目(其中 4613 个常规项目,74 个 fork, 350 个 import)。由于 Git 的 repository 没有任何损失,所以 GitLab 可以重建数据事故之前已经存在的用户 / 组的全部项目,但是并不能修复事故中的任何问题。
  3. 丢失了大约 4979(即 5000)左右的注释。
  4. 可能丢失了 707 个用户,很难准确进行评估(部分源自 Kibana 记录)
  5. 受影响的时间点:1 月 31 日 17:20 之后创建的数据

Offline 前的种种挣扎

首次事故:垃圾邮件用户的数据库负载的峰值

2017 年 1 月 31 日 18:00(UTC 时间)发现垃圾邮件发送者正在通过创建片段方式攻击数据库,目的是让数据库不稳定。工作人员随即开始寻找问题并准备应对方案。

2017 年 1 月 31 日 18:00-21:00(UTC 时间),工作人员(team-member-1 )正在预发布环境安装 pgpool 和备份工具,为了拿到最新的生产环境数据他创建了一个 LVM 快照,这个快照会用于预发布环境,他希望可以重用这个快照用于引导其他的副本。这个操作在丢失数据前的 6 小时完成。

副本启用的过程中发现存在问题,并且需要消耗大量时间(根据估计仅仅是初始化 pg_basebackup 同步过程就需要耗时 20 个小时以上)。LVM 快照在工作人员可以修复问题之前又不能再其他副本上使用。整个修复过程都被这个问题耽搁下来。

2017 年 1 月 31 日 21:00(UTC 时间),开始出现锁定数据库写操作,并引起一些停机情况。进一步进行处理,措施包括锁定垃圾邮件的发送 IP、删除一个用户并启用仓库(造成 47000 个 IP 使用了相同的账户签名,进而导致数据库高负载)、删除垃圾邮件用户。

第二个事故:复制延迟触发警报

2017 年 1 月 31 日 22:00(UTC 时间),数据库备份进展出现落后情况,查明造成原因是备份数据库写入操作时出现异常,导致没有跟上备份节奏。

采取处理措施包括:尝试修复 db2 数据库,这时候备份落后了大概 4GB。然后 db2 集群开始拒绝执行备份作业,db2 集群拒绝连接到 db1,调整 max_wal_senders 为 db2,重启 PostgreSQL 数据库,随即 PostgreSQL 数据库提醒存在很多打开的连接,并拒绝启动服务。管理人员随即调整 max_connections 参数从 8000 调整至 2000,PostgreSQL 随即启动。注意,此时 db2 集群依然拒绝执行备份,处于未知原因的挂起状态。

第三个事故:误删操作

2017 年 1 月 31 日 23:00(UTC 时间),工作人员(team-member-1 )感觉 pg_basebackup 拒绝执行的原因是 PostgreSQL 数据文件夹已经存在,所以决定去移除这个文件夹。执行 rm 操作之后,该工作人员意识到命令正在 db1.cluster.gitlab.com 执行,而不是 db2.cluster.gitlab.com。

2017 年 1 月 31 日 23:27(UTC 时间),工作人员(team-member-1 )终止了删除操作,300GB 的数据仅剩余 4.5GB。

下线,进入紧急状态

GitLab 决定下线 GitLab.com 并将事故通过推特向外公布,并且通过 YouTube 对外进行了修复过程的直播。

思考,罗列问题清单

GitLab 进一步对遇到的问题进行梳理和逐一解释,包括:

  • LVM 镜像默认每 24 小时执行一次。工作人员(team-member-1 )事故发生 6 小时之前手动执行了一次。

  • 常规备份也是 24 小时执行一次,但是工作人员(team-member-1 )无法确定存放于何处。另外一名工作人员(team-member-2)认为这意味着失效,因为产生的文件只有几个字节。

    一名工作人员(Team-member-3):PostgreSQL9.2 的二进制文件开始运行,导致 pg_dump 失败。由于数据库版本设置为 PostgreSQL9.6,最终导致SQL 备份不启用。

  • Azure 上的磁盘镜像只是针对 NFS 服务器,没有针对数据库服务器。

  • 同步过程移除了 webhooks。除非我们可以从过去 24 小时的常规备份中提取这些内容,否则将丢失。

  • 复制过程极度脆弱,很易出错,依赖于一系列 Shell 脚本,而这些脚本的注释很差。

  • S3 备份过程没有正常工作。

  • 当备份失败时,没有可靠的警报 / 分页,在 dev host 上面现在也看到这一点

综上所述,5 个备份 / 复制技术都没有正常工作。无奈之下,我们最终启用 6 小时之前的备份。

pg_basebackup 需要等待主机启动复制过程完毕,这个过程需要 10 分钟。这个过程会导致我们认为复制过程卡住了。使用 strace 命令也看不出什么问题原因。

行动, 恢复过程

GitLab 的官方声明中说明了恢复过程的执行步骤:

  1. 2017 年 2 月 1 日 00:36(UTC 时间),备份 db1.staging.gitlab.com 数据。
  2. 2017 年 2 月 1 日 00:55(UTC 时间),挂载 db1.staging.gitlab.com 到 db1.cluster.gitlab.com。从 /var/opt/gitlab/postgresql/data/ 拷贝数据到生产环境 /var/opt/gitlab/postgresql/data/。
  3. 2017 年 2 月 1 日 01:05(UTC 时间),nfs-share01 服务器被征用作为临时备份服务器,放置于 /var/opt/gitlab/db-meltdown。
  4. 2017 年 2 月 1 日 01:18(UTC 时间),包括还存在的生产环境数据,包括 pg_xlog,命名为 20170131-db-meltodwn-backup.tar.gz。

下面这张图显示了删除和随后恢复事件的时间。

未完,GitLab 下一步打算

Todo list

  1. 为不同的环境改变 Linux 终端的格式或者颜色,例如红色代表生产环境,黄色代表测试环境。针对所有用户在 shell 提示符处显示机器的完整名字,例如 db1.staging.gitlab.com,而不是仅仅是“db1”。: https://gitlab.com/gitlab-com/infrastructure/issues/1094
  2. 针对 postgresql 的文件夹拒绝执行 rm -rf 这样的命令?可以设置命令执行保护或者针对数据库文件夹有对应的备份措施。
  3. 为备份增加提醒:检查 S3 仓库之类的体型。增加图形化界面,显示时间变化后的备份大小,当下降超过 10% 时发出警报。: https://gitlab.com/gitlab-com/infrastructure/issues/1095
  4. 找出为什么 PostgreSQL 在 max_connections 被设置为 8000 之后突然出现问题,这个设置在 2016 年 5 月 13 日就已经完成了。因为这个问题的突然出现导致了其他很多问题。 https://gitlab.com/gitlab-com/infrastructure/issues/1096
  5. 通过 WAL 归档增加备份阈值,这个方法对审计失败也许有用。 https://gitlab.com/gitlab-com/infrastructure/issues/1097
  6. 针对上线产品创建常见问题查找指南手册。
  7. 从一个数据中心移动数据到另一个数据中心可以通过 AxCopy 完成:微软声称这个工具比 rsync 要快很多。看上去这是 Windows 上面的问题,但是没有任何 Windows 专家参与。

五天内公开自省报告

GitLab 官方申明指出丢失生产环境数据是不可以接受的错误,5 天之内 GitLab 将对外发布错误发生及保护措施失效的原因,并将发布一系列措施避免悲剧再次发生。

网友们的关注

GitLab 致谢网友

GitLab 申明最后感谢了共计 42 位网友的外援,他们通过 Twitter 和其他渠道上给出的技术建议。

网友留言

“keturu ta”的评价

我们在日本工作,我们能够理解你们的痛苦和精神上的挫折。我们会一如既往地支持你们。

“Axel Dreyfus”的评价

现在已经很少看到这么开放的工作态度了。祝你们好运,永远支持你们。千万不要针对那个 UNIX SA,他已经瘦了 20 磅(开玩笑)。

“Neer”的评价

这样的事故对于任何人都有可能发生,我鼓励涉及团队不要有挫折感。这篇文章已经开始在社交媒体上流传开来了,让我感到这是一家非常公开和透明的公司。我之前没有听说过这个产品,但是从此以后我会开始使用它。

“Codepotato”的评价

感谢这样的全面解释。问题发生确实让人感觉很丢脸,但是同时也体现了你们对外的开放态度。当务之急我们需要找到办法提升恢复速度。

公开,直播修复过程

除了在网络上对事故进行文字说明,GitLab 还在 YouTube 上直播了其数据库修复过程。该过程视频时长 8 小时,共计有 32 万人次观看。 https://www.youtube.com/watch?v=nc0hPGerSd4

写在后面

事故处理过程中,GitLab 采用了开放的态度,事故发生后第一时间对外公布,并对处理过程进行现场直播,让全世界所有程序员都有机会一起参与恢复过程。GitLab 也针对网友提出的关于肇事工作人员如何处理问题进行了官方回应,表态不会因为这次事件解雇事故相关技术人员。

正是由于这样的开放性姿态,网友并没有对事故的发生而进行谩骂、嘲讽,而是一起通过网络对 GitLab 进行鼓励,对处理事故团队提供积极的技术建议。这样的处理方式可以作为 IT 公司生产环境经典解决案例被写入教科书。

参考资料

https://docs.google.com/document/d/1GCK53YDcBWQveod9kfzW-VCxIABGiryG7_z_6jHdVik/pub

https://about.gitlab.com/2017/02/01/gitlab-dot-com-database-incident/

https://www.theregister.co.uk/2017/02/01/gitlab_data_loss/


感谢木环对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-02-03 18:008954

评论

发布
暂无评论
发现更多内容

AI 正以颠覆性力量重塑商品管理的底层逻辑

第七在线

深入浅出DDD:从理论到落地的关键

百度Geek说

Go 后端

WebGL开发框架的比较

北京木奇移动技术有限公司

软件外包公司 webgl开发 webgl外包开发

AI技术在英语口语学习中的应用

北京木奇移动技术有限公司

软件外包公司 AI口语练习 AI英语学习

WebGL 的开发框架

北京木奇移动技术有限公司

软件外包公司 webgl开发 webgl开发公司

vivo 官网 APP 首页端智能业务实践

vivo互联网技术

深度学习 算法 前端

企业级AI搜索解决方案:阿里云AI搜索开放平台

阿里云大数据AI技术

云计算 大数据 阿里云 信息搜集 AI 搜索引擎

高分辨率LED显示屏:选购前的7个关键点

Dylan

商业 广告 LED显示屏 全彩LED显示屏 led显示屏厂家

MySQL派生条件下推优化导致自定义变量结果错误问题分析

GreatSQL

NocoBase 本周更新汇总:模板打印支持批量打印

NocoBase

开源 低代码 零代码 版本更新 模板打印

Microchip扩展连接、存储与计算产品组合,以满足AI数据中心应用日益增长的需求

新消费日报

一文快速了解 YMatrix 与 Greenplum 的相同与不同

YMatrix 超融合数据库

数据库 greenplum 迁移数据 YMatrix

赛博威 AI Agent 赋能营销费用管理,实现自主感知、决策与高效行动

赛博威科技

AI 数字营销 AI Agent 赛博威

Second-Brain 如何用 NocoBase 为金融企业构建 AI 系统

NocoBase

开源 AI 低代码 AI系统 决策系统

WebGL开发框架的性能比较

北京木奇移动技术有限公司

软件外包公司 webgl外包开发 webgl开发公司

CAD如何导出PDF?PDF如何转CAD?详细教程来了

在路上

cad cad看图 CAD看图软件

展位预定倒计时!500+企业云集,西部不容错过的电子行业盛会

AIOTE智博会

电子展 电子信息展 成都电子展 西部电子展

SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库

sysin

SQL Server

天翼云牵头编制国家标准,共建行业技术标杆!

天翼云开发者社区

云计算 科学计算 智能计算 天翼云

告别静态UI!Guineration用AI打造用户专属动态界面

鼎道智联

性能王者!天翼云再次拿下世界第一

天翼云开发者社区

云平台 算力 天翼云

HDD•鸿蒙赋能交流会模式升级!“培训+班级”开启长效学习进阶之路

最新动态

AI赋能,赛博威「营销+上市+产品」三线并行产品创新协同平台加速爆品上市!

赛博威科技

数字营销 赛博威 产品创新协同平台

萨科微宋仕强,在人工智能Ai大模型文本写作的试用与反思!

科技汇

从清华实验室到京东零售技术:一位算法工程师的风控实战录

京东零售技术

SEUs获取与续证流程

ShineScrum

敏捷

【CodeBuddy】三分钟开发一个实用小功能之:马赛克生成器

jimaks

CSS

大厂外包VS小公司,你会怎么选?

王中阳Go

Go 外包 小公司

浪潮海岳inSuite 5.0标准版重磅发布,赋能中小企业数智化转型再提速

浪潮海岳inSuite

如何将CAD图纸直接导出为工程蓝图?

在路上

cad cad看图 CAD看图王

【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (3)

HarmonyOS SDK

harmoyos

GitLab事故之技术详叙:抢救后恢复在线,已确定下一步计划_数据库_周明耀_InfoQ精选文章