GitHub网站究竟可不可靠?谷歌工程师教你用BigQuery一探究竟

news/2024/5/13 23:56:11/文章来源:https://blog.csdn.net/qq_36510261/article/details/67646657

作者简介:Felipe Hoffa,谷歌开发顾问,来自智利,现工作于旧金山以及全球各地,谷歌Cloud Platform社区编辑。


以独特方式组织的可视化数据往往能够为我们提出一些有趣的观点。Felipe Hoffa最近使用BigQuery结合Reddit近八年来的网站活动以及上线时间数据进行了可视化分析,我们从中看到了一些非常有趣的信息。作为一名刚入门的负责任务控制的网站可靠性工程师,我总是会这样问自己,"如果我是负责这项服务的可靠性工程师,我会采用什么方法解决这个问题?"

这次,Felipe将从可靠性工程师的角度出发,对GitHub的一些历史数据展开分析。首先,我们需要先确定,使用BigQuery对GitHub Archive上关于GitHub的部分事件数据进行分析是否足以推断出GitHub网站的健康状况。GitHub为开发者定义了很多种不同的活动事件类型,但在本篇文章的分析中,我们仅关注成功向GitHub发出请求的事件。

我们可以使用这个查询语句:

#StandardSQL 
SELECT TIMESTAMP_TRUNC(created_at, MINUTE) minute, COUNT(*) 
FROM `githubarchive.month.201607` 
GROUP BY 1 
ORDER BY 1

我们可以找到在2016年7月中GitHub在每一分钟发生的事件数量。created_at字段记录了一个以微秒为单位的时间戳,查询语句将其按分钟进行截取。这使得我们将查询结果按时间戳分组时,可以使用COUNT聚合函数来统计每分钟对应的事件数量。将查询结果简单可视化即可得到下图:

9a26e9f745bea2c293acd60f823df35236e30f64

在上图中我们可以发现一些很有趣的数据点,这些数据点对应的事件数量格外得低,但是,仅通过上图我们很难准确判断每一分钟究竟是"正常的"还是"异常的"。因此,我们可以根据查询结果创建事件数据直方图,使判断的过程变得更加清晰。

b4346e1a391eedfaee31ff66c2d9bc79172d69be

这幅图很明显地表明,对于GitHub,当每分钟内处理的事件总数低于200时,网站处于异常的状态,这一结论至少在2016年7月份是成立的。我们假设每分钟极少数的事件与异常少的终端用户请求无关,而是由于网站自身服务器问题所导致的。在这个前提下,有两种可能的解释:用户请求未达到服务器,或者服务器无法成功响应用户请求。这为我们提供了一个标志来近似地判断GitHub当前的状态是"健康"还是"不健康"。

在这里我们定义了一个"服务水平指标",即一个SLI(Service Level Indicator)。根据网站可靠性工程相关文献中的介绍,服务水平指标是"一个针对所提供服务水平中的某些方面谨慎定义的定量标准"。在我们这个例子中,服务水平指标是指"每分钟成功处理的事件数量"。我们要做的是,对这个服务水平指标进行转换,帮助我们判断网站服务在某一时刻是否上线或宕机。最简单的方法是为"每分钟成功处理事件"设置一个阈值,低于这个阈值时,我们将认为网站服务"宕机"。那么,我们应该怎么选择这个阈值?

总中断会导致在特定的时间内没有请求事件记录。因此,我们可以将"宕机"阈值设置为0来检测总中断的情况。然而,大多数的中断都不是总中断。网站服务可能会进入某种不健康的状态,进而在提供服务的过程中开始出现异常高的错误率,这一现象会在日志数据中格外低的(成功请求)事件比例上得以体现。

考虑到总中断情况下不会记录请求事件,我们在前面使用的简单查询在这种情况下可能会出现一些问题。没有事件记录的分钟不会显示在查询结果中!这样的结果完全忽略了总中断的情况。下面的查询语句展示了解决此类问题的方法。它创建了一个包含查询月份所有分钟的表格,并将其与前面的查询结果连接,随后将所有为NULL的结果(意味着不存在对应的行)映射为0事件数量:

#StandardSQL
SELECT b.minute m, IFNULL(c, 0) c
FROM (# first day of monthSELECT i*60 + UNIX_SECONDS(TIMESTAMP('2016-07-01')) minute FROM `fh-bigquery.geocode.numbers_65536`WHERE i < 60*24*# number of days in monthEXTRACT(DAY FROM DATE_SUB(DATE_ADD(DATE('2016-07-01'), INTERVAL 1 MONTH), INTERVAL 1 DAY))
) b 
LEFT JOIN (SELECT UNIX_SECONDS(TIMESTAMP_TRUNC(created_at, MINUTE)) minute, COUNT(*) cFROM `githubarchive.month.201607`GROUP BY 1
) a
ON a.minute=b.minute
ORDER BY b.minute

为了使接下来的查询操作更加简便,我们将本次查询的结果以视图形式保存,命名为events_per_minute_201607,并在接下来的查询中基于该视图检索数据。

既然我们现在有一个视图,其中记录了所有零事件对应的分钟,那么我们可以使用一个分位数函数来探索在每分钟事件数量较低情况下的数据分布。

#StandardSQL 
SELECT APPROX_QUANTILES(c, 10001) as q 
FROM `fh-bigquery.public_dump.events_per_minute_201607`

APPROX_QUANTILE函数的"10001"参数表明数据将被划分至10000个桶中,每个桶具有相同数量的数据点。非统计学专业的读者可能对具有100个桶的分位数函数的特殊情况比较熟悉。例如,如果你在测试中处于95分位数,这意味着在测试中有5%的人成绩比你好,有94%的人成绩不如你,同时还有1%的人的成绩与你相同。

下图为其中20条结果对应的条形图:

70658b7e4fcd720187a15cc4eb49c23fbd10aedb

由于我们认为中断属于异常情况,因此在这里我们寻找的是超出"正常"范围的数据点。我们想要选择一个合适的阈值,这样的阈值足够低,不会误将事件处理数较少的分钟判断为宕机时间,同时阈值也应足够高,以至于我们可以检测到任何明显导致请求事件响应数降低的操作。通常情况下,每分钟响应的用户请求数在20到77之间时,可能会出现"状态转换"的情况,这可能意味着当每分钟响应请求数低于20时,网站的服务几乎完全"宕机"。

尽管上面的分析还未得出任何结论,但是我们可以先将阈值设为每分钟20个事件,并以此为服务是否"宕机"的判断依据,看看我们能够发现什么。使用下面的查询语句我们可以看到GitHub在2016年7月总共宕机了多少分钟:

#StandardSQL
SELECT m, c
FROM `fh-bigquery.public_dump.events_per_minute_201607`
WHERE c <= 20

查询语句返回了54行记录,因此,根据我们的定义,GitHub的服务在七月份总共"宕机"了54分钟。但是54分钟究竟是好还是不好呢?

为了回答这个问题,我们需要确定可接受的宕机时间是多少。正常运行时间目标通常以你希望达到多少个9的形式表示,例如,99%的正常运行时间,99.9%的正常运行时间等等。99.9%的正常运行时间意味着你只能在0.1%的时间内宕机。但是,为了让这样的表述有实际意义,我们必须先选择一个时间段。一个月是一个不错的选择。此时,正常运行时间目标的确切表述可能是"网站服务在一个公历月内宕机时间不得超过总共运行时间的0.1%"。

为服务水平指标添加这样一个条件可将其转换为服务水平目标(SLO,Service Level Objective)。2016年7月共有44640分钟。这意味着在未达到服务水平目标前,我们总共有44.6分钟的宕机时间。这通常被称为"错误预算"。

因此我们可以说在2016年7月份,GitHub的网站服务消耗了44分钟错误预算中的54分钟,因此,它以10分钟的差距未达到99.9%的服务水平目标。

将服务水平目标可视化的典型方法是在给定时间段内累积错误时间,在我们的例子中,累计计算的时间段是七月的31天时间。接下来的查询语句统计了七月份的累积宕机时间。

#StandardSQL
SELECT m, cumulative_down, next_cum
FROM (SELECT m, cumulative_down, LEAD(cumulative_down) OVER(ORDER BY m) next_cum, MIN(m) OVER() min_m, MAX(m) OVER() max_mFROM (SELECT m, SUM(IF(c <= 20, 1, 0)) OVER(ORDER BY m ROWS BETWEEN 43200 PRECEDING AND CURRENT ROW) cumulative_downFROM (SELECT m, c, 1 as downFROM `fh-bigquery.public_dump.events_per_minute_201606` UNION ALLSELECT m, c, 1 as downFROM `fh-bigquery.public_dump.events_per_minute_201607` UNION ALLSELECT m, c, 1 as downFROM `fh-bigquery.public_dump.events_per_minute_201608`)))
WHERE cumulative_down!=next_cum 
OR m IN (min_m, max_m)
ORDER BY m

根据查询结果我们绘制了下图。图中折线的阶跃对应于"中断"的情况。中断时间越长,阶跃的幅度越大。当折线越过44分钟时,我们的宕机时间已经超过了错误预算,称该服务在30天的时间窗口内"未达到服务水平协议的要求"。

07f0747764d1a0670d32beb22413c3806f1d58b5

我们的分析表明,两次中断消耗了大部分的错误预算,一次是在月中,而另一次则发生在月末。事实上,如果我们查看GitHub的状态日志,我们可以看到GitHub在7月12日的报告中记录了"异常率激增"的情况,并在7月27日的报告中记录了"主要服务中断"。

尽管服务水平目标有时按照公历月定义,但是这样的定义方式有时会给工程师带来困扰,主要有两个原因。首先,"公历月"并不是一个固定的时间跨度。一个公历月可能有28天也可能有31天,这取决于当前时间碰巧属于哪个月份。其次,这样的定义使个别几天变得非常特殊,错误预算在这几天会被神奇地重置。例如,对于一个服务水平目标为公历月99.9%正常运行时间的服务,可能在7月31日发生44分钟的中断,并且在8月1日又遭受另一次中断,这种情况下只要该服务在这两个月未发生其他中断,我们仍称其达到了服务水平目标,尽管该服务在48小时内总共发生了88分钟的中断。

为了解决这些不一致的现象,服务水平目标通常采用30天滑动窗口的形式定义 ,而非公历月的形式。在不考虑闰秒的情况下,30天相比于公历月,是一个固定的时间跨度。而且,使用滑动窗口的方式也可以解决前面讨论的第二个问题。假设在7月31日和8月1日发生的两次44分钟中断将使该服务在8月1日中断发生后,便"超过服务水平目标的要求",直到7月31日的中断脱离30天滑动窗口的范围。

这一点很重要,因为"超过服务水平目标的要求"应该引起负责团队的注意,并采取更为保守有效的决策。例如,如果你提供的服务"未达到服务水平目标",那么现在可能不是进行关键软件升级的最佳时机。48小时内88分钟的宕机时间足以令一个需达到99.9%服务水平目标的团队采取更保守的措施。第一个基于公历月的服务水平目标定义无法做到这一点,而第二个基于30天滑动窗口的定义则可以。

阅读全文:http://click.aliyun.com/m/10281/  


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_791474.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

如何打造一个小而精的电商网站架构?

本文大纲&#xff1a; 1. 小型电商网站的架构 2. 日志与监控系统的解决方案 3. 构建数据库的主从架构 4. 基于共享存储的图片服务器架构 5. 移动M站建设 6. 系统容量预估 7. 缓存系统 一、小型电商网站的架构 刚从传统软件行业进入到电商企业时&#xff0c;觉得电商网站…

全网最全编程学习网站汇总来了,还不赶快收藏

Java面试笔试面经、Java技术每天学习一点公众号Java面试关注我不迷路作者&#xff1a;brightwang来源&#xff1a;https众所周知&#xff0c;程序员是一个需要不断学习的职业&#xff0c;而幸运的是&#xff0c;在这个互联网时代&#xff0c;知识就在那里&#xff0c;等着我们去…

老同学十块钱让我帮做个视频网站,带弹幕那种

Java面试笔试面经、Java技术每天学习一点公众号Java面试关注我不迷路作者&#xff1a;刘滨浩来源&#xff1a;https://binhao.blog.csdn.net/2021年了&#xff0c;还有不支持弹幕的视频网站吗&#xff0c;现在各种弹幕玩法层出不穷&#xff0c;抽奖&#xff0c;ppt都上弹幕玩法…

Drupal 网站漏洞修复以及网站安全防护加固方法

drupal是目前网站系统使用较多一个开源PHP管理系统&#xff0c;架构使用的是php环境mysql数据库的环境配置&#xff0c;drupal的代码开发较为严谨&#xff0c;安全性较高&#xff0c;但是再安全的网站系统&#xff0c;也会出现网站漏洞&#xff0c;drupal是网站运行访问必不可少…

【Python爬虫系列】为什么我喜欢python?来看看这些让人爱不释手的原因吧,购物网站大盘点,看过这些python做的项目,我立马入坑了…(神奇 | 爱了,爱了)

导语 Python编程零基础如何逆袭成为爬虫实战高手&#xff1f;&#xff01; 哈喽&#xff01;我是木木子&#xff0c;你们的贴心小助手。想学习爬虫的小可爱注意啦&#xff0c;一定不要错过哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#x…

oss php sdk+laravel搭建图片处理静态网站

背景和目标 接着上两篇继续写oss php sdklaravel搭建静态网站。 主要说下静态网站的重要部分图片服务&#xff0c;现在很多的网站上都会用到大量的图片, 图片在网页传输中占据很大的数据量, 图片处理也是影响网站性能的重要因素。 这篇文章主要结合oss的图片处理功能介绍如何利…

学习编程有疑问?七个网站助你菜鸟变大牛

很多同学在学习编程时候会遇到各种各样的问题&#xff0c;这些问题需要自己去想办法解决&#xff0c;那么这些网站平台将会给你很大的帮助。 1、W3school 这是一个免费学习编程语言的在线学习网站&#xff0c;里面的知识浅显易懂&#xff0c;非常适合初学者。如果你对编程还不…

前端学习的几个网站

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;1.菜鸟教程&#xff1a;http://www.runoob.c…

【云计算的1024种玩法】10分钟轻松设置出 A+ 评分的 HTTP/2 网站

前言 其实 HTTP/2 应该是 2015 年的老话题了&#xff08;2015 年 5 月 14 日 HTTP/2 协议正式版的发布&#xff09;&#xff0c;但是 2018 年都到了很多网站依旧没有使用&#xff0c;作为新一代互联网协议&#xff0c;HTTP/2 不仅速度比目前常见的 HTTP/1.1 更快&#xff0c;而…

如何优化网站,网站推广优化一般流程

理论上针对不同类型的网站&#xff0c;优化网站的策略是不完全相对&#xff0c;但基于搜索引擎网站排名的原理&#xff0c;对于任何一个网站优化流程&#xff0c;都可以参考如下方法&#xff1a; 1、网站架构设计 在做网站信息架构的时候&#xff0c;我们并不单纯的只是简单的罗…

引路蜂Android技术网站开通了

分享一下我老师大神的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;还带黄段子&#xff01;希望你也加入到我们人工智能的队伍中来&#xff01;https://blog.csdn.net/jiangjunshow之前在引路蜂技术博客我们花了大量的篇幅介绍了Android开发的相关…

【面试精选】关于大型网站系统架构你不得不懂的10个问题

该文已加入笔主的开源项目——JavaGuide&#xff08;一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.com/Snailclimb/JavaGuide 。觉得不错的话&#xff0c;记得点个Star。下面这些问题都是一线大厂的真实面试问题&#xff0c;不论是对你面试…

网站高并发及高并发架构详解

高并发是指在同一个时间点&#xff0c;有很多用户同时的访问URL地址&#xff0c;比如&#xff1a;淘宝的双11&#xff0c;双12&#xff0c;就会产生高并发,如贴吧的爆吧&#xff0c;就是恶意的高并发请求&#xff0c;也就是DDOS攻击&#xff0c;再屌丝点的说法就像玩撸啊撸被AD…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

linux 查看机器硬件配置,在linux下如何查看机器硬件配置?_网站服务器运行维护...

在windows中用鼠标选定多个不连续文件的操作是什么_网站服务器运行维护在windows中用鼠标选定多个不连续文件的操作是&#xff1a;首先打开需要选定的文件&#xff1b;然后按住【Ctril】键不放&#xff0c;单击需要的文件&#xff1b;最后出现选中状态即可。在linux下如何查看机…

开源网站分析软件Piwik的数据库表结构

文章引用&#xff1a;【http://www.biaodianfu.com/piwik-database-schema.html】 Piwik是一套基于PhpMySQL技术构建&#xff0c;能够与Google Analytics相媲美的开源网站访问统计系统&#xff0c;前身是phpMyVisites。Piwik可以给你详细的统计信息&#xff0c;比如网页浏览人…

使用最新 solr4.10 快速开发团购网站等垂直搜索网站

说明&#xff1a; solr 是一个非常完善的开源项目&#xff0c;非常优秀&#xff0c;他不紧紧是做个索引这么简单&#xff0c;而是可以做成一个垂直的网站&#xff0c;比如团购网站&#xff0c;快速搭建页面。而且solr带了一个非常优秀的管理后台。可以查看管理&#xff0c;导入…