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目前是硅谷一颗冉冉升起的新星,它估值3.29千万美元并且存放着宝贵的用户数据。自2012年上线以来,GitLab已经被超过10万个公司或组织使用,包括IBM、Alibaba.com、UBer、Intel、VMWare等等。 基于 Ruby on Rails 开发的一个开源的版本管理系统,它实现了一个自托管的Git项目仓库,支持通过Web界面进行访问公开的或者私人项目。 GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序进行交流。此外,GitLab提供了一个代码片段收集功能,可以轻松实现代码复用,便于日后有需要的时候进行查找。 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之后创建的数据 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个,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进一步对遇到的问题进行梳理和逐一解释,包括:
综上所述,5个备份/复制技术都没有正常工作。无奈之下,我们最终启用6小时之前的备份。 pg_basebackup需要等待主机启动复制过程完毕,这个过程需要10分钟。这个过程会导致我们认为复制过程卡住了。使用strace命令也看不出什么问题原因。 GitLab的官方声明中说明了恢复过程的执行步骤:
下面这张图显示了删除和随后恢复事件的时间。
GitLab官方申明指出丢失生产环境数据是不可以接受的错误,5天之内GitLab将对外发布错误发生及保护措施失效的原因,并将发布一系列措施避免悲剧再次发生。 GitLab申明最后感谢了共计42位网友的外援,他们通过Twitter和其他渠道上给出的技术建议。 “keturu ta”的评价
“Axel Dreyfus”的评价
“Neer”的评价
“Codepotato”的评价
除了在网络上对事故进行文字说明,GitLab还在YouTube上直播了其数据库修复过程。该过程视频时长8小时,共计有31万人次观看。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/ |