SRE(系统稳定性工程师)

SRE(系统稳定性工程师)

SRE

sre google运维解密读书笔记

google sre这本书其实是google内部的文章分享总结而成,每一个章节也可能有 一定的独立性。

概览(1)

一个例子

传统应用一个系统通常包含开发Dev和运维Ops人员。其中Dev负责软件的版本更 迭,Ops则负责系统的发布,上线下线等工作。

通常用系统管理员来称呼。这样在小应用或者小团队里面是不会有问题的,如果 应用逐渐变大,团队逐渐变大,会带来很多问题。

一个是团队的人力成本会随着应用增多而增多。每个应用每个团队都可能有各自 自己的业务问题,这些通常都是不一样的,比如他是音视频服务,他是大数据, 使用的技术栈协议栈等都不一样。

一个是各个团队的沟通成本。开发希望能够尽快上线,而运维这边通常需要确认 时间窗口,经过一系列的流程和测试才能够上线,开发更关心功能能否准时上线, 而运维更关心这个产品的可用率(因为这通常是运维团队的考核指标)。于是就 会有,今天这个帮忙上,运维说我们封板,测试了没?抄送老大,然后发我们, 等等,这些可能就是一个运维的日常。三个9和5个9通常都在这些严格的毫厘之 间。

很多公司在这些之间能够获取各自的提升,比如流程化,平台化,自动化执行, 自动化测试等都极大提升变更的效率。然而对于运维来说,这些需要相当大的投 入。那为什么不招一个"懂开发"的运维呢?这个运维懂开发的这些痛点,又了解 运维的处境。可能有人会说,我们有运维开发。其实我理解的运维开发也是承担 了SRE的一部分工作,是SRE的一部分延申。就好像团队中的一个小组。所以这里 引申出了SRE。

  • SRE需要具备软件工程的能力,能把自己的想法快速付诸实践,而不用借助更多的开发人力
  • SRE需要具备行业敏感的思维,能够工程化,自动化遇到的问题,automate everything

文中也提到了一件很有意思的事情,当工作淹没SRE或者系统管理员的时候,他 们是没有时间能够在应对业务爆炸式增长的同时还能够抽出时间自动化它的。在 我的工作2016年初期,公司确实存在这种情况,我们其实大家值班的时候会非常 忙。忙到一杯水一天从早上到晚上都没有动。不断有人找你,不断有上下文,还 要同时处理工单,关注群里消息。

所以说,团队的个人的时间应当有一定的学习时间或者消化时间,否则就是一个 工单机器。而随着业务增长,人员也要同步增长。我觉得20%可以是一个团队员 工应该有的free study time。

Devops和SRE有共同之处。Devops强调把CI/CD和软件工程等的思维串起来,加速 软件设计,迭代,测试, 部署。总之就是让一切事情顺心顺遂,快而稳。

SRE工作主要包含但不限于:

  • 可用性改造
  • 延迟优化
  • 性能优化
  • 效率优化
  • 变更管理
  • 监控
  • 紧急事务
  • 容量规划和管理

几个原则和方向(6)

尽可能保证开发时间

承诺保障50%以上的时间有助于让SRE更加有时间发现系统问题并解决,从而构建 出真正有价值的系统,最终实现一个良性循环。

在保障服务SLO的情况下最大化迭代速度

变更速度通常来源于自动化测试,记得刚开始我们的nginx变更,都是通过手改 +gerrit review的方式来变更,有的运维同事会自己把配置

拉下来,然后自己通过-x测试,或者让开发绑定那个外网ip的hosts测试,这样 带来的一个问题就是让变更带来了不确定性。因为nginx类似

这些工具,看似加一个location有可能会带来灾难级别的问题,当发现的时候通 常已经影响了很多的用户。所以后来我们引入docker,通过

配合puppet的方式通过域名方式拉取指定公共集群的指定配置,最终的效果就是, 你要测试一个域名,这个域名的配置,所有nginx.conf,

等等都和实际部署的前端集群一模一样,而不同的就在于你的变化,比如你少了 一个location或者多一个location。后来我们把这个集成

到了工单,极大的提高了变更的安全性,也让开发和运维更加放心。而这些,都 需要时间,所以目光需要放长远。

监控系统

我觉得这里的意思是希望监控系统能发挥到最大价值。这个价值在于你在关键的 时候收到了最重要的消息,比如哪个服务器挂了,哪个服务

此时不可用,而这些都是我们定义好的,并且分级好的,比如服务器挂了我们收 到了一条IM消息,如果没显示有人处理,就会电话到对应的

负责人。而这些监控有恰好出现了所有该出现的群里,比如IDC机房群,业务群。 这个恰好其实很难。

应急事件处理

MTTR恢复时间表示我们业务从发生问题到解决问题的时间,这个在后面的篇幅也 还有。具体应该怎么做呢?记得当时组内流传一句话,当我们

业务反馈问题超过2分钟解决不了的时候,就应当组内通知,升级。所以一个问 题出现,我们要能够快速梳理出来问题的本质,并且快速反应,

这对运维工程师来说就是形成"肌肉记忆"。如果你不熟悉系统命令,那就完了, 因为其他人都在等着你,所以这是一种强迫学习的好办法!

变更管理

做好变更管理非常重要,一般一个故障出来以后,我们首先是检查当天是否有发 布或者有变动,依次询问其他人和组内。这个是快速定位的办法。

一般故障系统里面可能80%以上都是变更导致的。而这些能说是人的原因吗?我 们有个ITIL系统,所有的事情其实都是对事不对人,但能真正做

到吗?我们能做的就是平台化,自动化这些,让这些问题降低到最少,每个SA都 可能背了几个印象深刻的事故,哈哈。

需求和容量规划

需求和容量规划是一个面试经常问到的问题,说实话,我之前回答的并不好。但 这确实是很多团队忽略的。主要在于第一不熟悉常见的容量模型,

第二没有把我们当时的容量模型说清楚,至少怎么评估的。

从文中看,包含自然增长(比如使用人数,资源用量)和非自然增长(比如广告, 业务推广,新功能),需要有一个准确的容量评估模型,

必须要有周期性的压力测试。

这里细想我们领导也是在做的,当时我也在负责部分采购事情。比如需要一个新 的nginx集群,按照一台3万Qps来说,一个业务需要6万Qps,可能

就给分配三或者考虑公用(考虑负载均衡),我们内部大部分还是使用OSPF等价 路由+vip的方式实现负载均衡,这个方式把转发流量交给交换机。而

lvs+dr我们内部也在用,但是相对较少。

至于一台能承载3万Qps,这个数据其实就来源于第一,经验,第二,理论最大最 小,第三实际测试。

我们有一个质量保障部门专门负责一些测试,而对于运维内部,其实一直是相对 缺少这样一种容量单机测试系统一直在运行。如果有了这个,一台

什么配置的有什么样的QPS,那我们买机器就会多很多选择,所以这里体现了容 量规划的意义,省好多钱。

资源部署

在之前我们是这样的,A业务淡定地说,我们需要一个nginx集群,下周就用。运 维说,啥?服务器买了吗?需要多大规模的,能公用之前的资源吗?

需要走C-D-E流程。然后我们从资源池找到3台机器,通知机房,帮忙搬到F机房 (因为那里有ospf机架),然后等机房回复老哥我弄好了,我们又联系

网络工程师,大佬帮忙交换机配置下ospf,我这边已经配置好了。大佬过了一会 说,我看了下没问题,你的vlan对的吧,是xxx.xxx.xxx.xxx/28,嗯,

对的,ping一下看下,好的,通了,good!然后卡卡卡,puppet整好配置,起好 名字,一顿操作,终于nginx和配置环境搞好了。紧接着,自己本地

绑定hosts测试,发现ok,于是邮件或者工单通知业务,ospf集群已经搭建好, 请及时测试!这可能就是一个资源部署的过程,在物理机为主的系统中,

大家会发现其实还是有很多的限制,其实这也是为什么云计算为什么那么快推广 的原因吧!

而SRE能做的就是加速这里面的流程。

效率和性能

我记得刚开始就是有个活,我们要统计监控中cpu使用率长期小于10%的服务器并 安排合并或者迁移。当各个事业部发现自己的服务器成本为什么那么高的

时候,就开始关心每个服务器的用途,如果SRE能够优化这里面的东西,和容量 规划那里一样,就是真金白银。这里是存在风险的,老业务的遗留,

新业务的冲击等等,其他团队的配合时间,对SRE都是挑战。好的运维团队应该 是团队之间的加速机器,减少沟通成本。

SRE视角的生产环境(11)

全文主要介绍了SRE管的东西,并对一个例子进行了论述。

硬件

machine为物理服务器,server为软件服务器,通过Borg管理物理服务器,实现 编排和分配。

../images/sre-google-topol.jpg◎ ../images/sre-google-topol.jpg(图片来源sre google运维解密)对于 google来说:

  • 约10台服务器构成一个机柜rack
  • 数台机柜组成一组机柜,一排row
  • 一排或者多排组成物理集群cluster
  • 一个数据中心datacenter包含多个集群
  • 多个相邻的datacenter组成一个园区campus

每个datacenter内部的所有服务器由于互联,引入jupitor交换机(多达几万个 端口)通过虚拟网络实现

大二层网络。

每个datacenter之间通过B4(骨干网)链接,基于SDN(Software Defined Networking, 软件定义网络)(使用 openflow标准协议),好处是 提供

海量带宽和优化网络连接。openflow可以参考 这个视频。可以发现也 有流表等数据结构,通过pipeline来实现最终的包的传递。

管理硬件的软件

在google,之前使用的是Borg,现在也许用的是Kubernetes,总之是通过虚拟化 实现资源更合理的使用,更方便的扩展,和现在的云差不多,相当于

一个大的私有云。我记得刚开始工作大部分业务都使用的是物理机,后来由于各 种需要都陆续迁移到了云主机。要给业务的爆炸式增长,比如海淘那

一类的app,我们只需要在比如双11,618等时间点前准备好对应的资源,并且充 分测试,其他时间完全可以释放给其他业务使用。

类似于serverless的比如aws的lambda,其实本质上也是把计算能力等资源分配 到实际服务器上,而用户并不关心,用户只关心我给你数据流,给我

要的结果,从而真正实现服务化。这个最早也容易让人想起新浪有个博客服务好 像,只需要定义自己的代码,就可以能够在网页运行。

存储

google的存储通过加强版GFS Colossus实现,也就是共享存储。这里我觉得可能 会有一些问题,比如共享存储的带宽,可能会出现排队等。

不过资源确实非常节省,现在每个云产品也有对应的共享存储方案。

网络

通过openflow时间软件定义网络,并且有GSLB,可以根据地理位置进行dns解析, 这个我们工作的时候,公司内部也有,我估计是符合这种协议就可以,

一个dns的解析可以设置国内国外,甚至江苏省,浙江省这样。猜测实现还是通 过一个ip地址数据库实现dns协议的转换。

几个系统组件
分布式锁服务

Chubby,通过锁实现一些对资源的互斥等访问

监控与告警
软件基础设施
  • 服务内部提供http服务供debug等使用
  • 服务之间通过grpc调用,通过Proto buffer这种传输格式传输

这里其实正常写rpc都知道,各个组件之间传输信息确实不能太随意,如果有一 个协议定义这些就很好。

研发环境

简要说了构建的时候通过一个统一的代码库,和跨项目的测试用例,便于团队协 作,而测试用例跑通以后,自动发布代码。

莎士比亚搜索服务

假想下有一个搜索服务叫莎士比亚。这个服务目的就是从莎士比亚文献中搜索词 语。

服务分为两个部分:

  • 批处理

这个任务负责生成新的索引,并且写到Bigtable中,如果发生新的莎士比亚文献, 则再生成一遍。

  • 前端页面

接受全球用户请求

莎士比亚搜索服务实现
Mapping 映射

把所有文献读取,并且分词,这个部分可以多实例加速,数据初次加工

Shuffle 洗牌

对所有的分词和位置进行排序,数据再加工

Reduce 减少

把分词和位置合并,存到新的单次或者列表,数据再存储

具体的调用流程

有必要看一下书上的图../images/shakes01.jpg◎ ../images/shakes01.jpg

用户通过浏览器访问域名https://shakespeare.google.com, 这个时候用户设 备会去请求dns找到真正的ip,由于这个域名绑定到了google的dns服务器, google dns把这个请求发送到GSLB上面,GSLB通过流量负载等信息告知一个IP地 址最终返回给用户。(1)

浏览器根据获取的IP(GFE,google前端服务),发起TCP连接,与之建立HTTPS 请求,GFE是一个大的公共前端。(2)

GFE拉取配置文件(包含所有服务),并询问GSLB,让其返回一个可用的IP,并 向其发送了一个RPC请求。(3)这里是找前端的过程。

前端收到了一份RPC请求,转化出具体的protobuf请求,发给谁呢?访问GSLB, 告知可用的后端服务器,最终后端服务器访问对应的Bigtable服务,并返回实际 的结果。(4)

这里的GSLB目测相当于是维护很多个内网域名,在实现DNS协议的同时,增加后 端的健康检查。

任务和数据的组织形式

假设经过压测,单台实例每秒处理100个请求(100 QPS),而经过用户调研,这 个服务需要达到3470 QPS,那么按照线性评估就是需要35个实例,文中使用N+2 的策略,使用37个实例。原因是:

  • 更新中会有一个不可用,所以可用的是36台
  • 如果恰好有个物理机挂掉,则服务可用的是35台,刚好满足要求

我觉得这个见仁见智,服务的QPS应该是相对时间段的,更新通常是处于低峰期, 而物理机挂掉的可能性是有,但应该是处于维护期操作,这个时候应该启动迁移 或者再上线方案。我们也很难保证所有的35个实例都在同一个宿主机里面。然而 这里告诉我们什么时候都应该想到备份,尤其是系统盘等,但对我们的业务来说 也是一个基本挑战,那就是一个服务器挂掉是否应该影响这个服务?基础服务做 的越好,这些就越有可能避免。而文中强调是使用bigtable这种基础组件实现冗 余和加速。

指导思想(21)

拥抱风险(23)

风险时刻存在,服务器可能会宕机,网线可能会被碰到,外部可能会攻击等,一 般风险和成本相互制衡。而SRE需要在这里面保持较好的风险平衡,为了达到多 少的可用率,在平常评估风险的时候至关重要。

一个99.9%和99.999%的可用率对风险的变更影响可想而知。

管理风险

为了提高可靠性而投入的成本通常不是线性的,主要表现在服务器成本和机会成 本。SRE这里通常把可靠性和风险关联,比如Search、Ads服务的可用率是99.99%, 那么通常不会增加到5个9,因为这意味着对应一系列的可操作流程。

在工作的时候,我们内部产品实现严格分级,比如用户中心是一级产品,安全业 务是二级产品,通常一级产品是4个9或者5个9,而二级产品我们承诺的可能只有 3个9。每个产品变更都需要一定的流程通知机制保障,每次事故都要通过ITIL系 统进行评审,优化遇到的问题。

度量风险

google用计划外停机时间表示业务的可承受的风险,而其他的比如用户的不满、 收入的损失、口碑等由于很难被统计,所以应该只是在评审评级的时候进行统计。

  • 基于时间的可用性

可用性=系统正常运行时间/(系统正常运行时间+停机时间)

几个常见可用率对应一年停机时间

availability ratio minutes
99.9% 525.6
99.99% 52.56
  • 基于请求的可用性

可用性=成功请求数/总的请求数

相当于比如api或者sdk调用的成功率,这个之前公司一般是在事故统计的时候统 计,当然作为一个业务维度统计是相当好的评估参数,对运维来说也是更大的挑 战。

这些api里面也会有适当的分级,比如用户注册,比如用户登陆,比如某个页面 访问等等。

风险的容忍度评估

对于风险的评估,通常需要参考对应的指标或者问题,

SRE和产品一起进行沟通协商转化,把具体的需求目标转化成对应的工程指标, 并且不断修正实践

需要考虑的一些问题因素:

  • 产品是为企业还是个人服务的?
  • 其他竞品业务的可用率保障等等是如何?
  • 服务是免费的还是付费的?
  • 会不会影响到公司的收入(公司的和对接企业的)?
  • 用户期望的服务水平是什么?
  • 这个产品集团评级为几级产品?(我加的)

容忍度相关的还有一个是对于故障的预期。

  • 网络的故障
  • 服务器本身的硬件故障
  • 应用维护发布带来的bug等
  • 人为操作的故障

有些故障,比如停机维护,我们公司内部是把它列为计划内的故障时间,不算入 实际可用率。当然,大部分产品在设计上

已经使用分层结构,高可用了。所以基本流量一切,也理论不会影响业务访问。

当我们制定或者计划更改可用率等参数的时候,还需要考虑成本,比如

  • 为了加一个9,要付出的成本大概多少
  • 增加的收入能否抵消或者有一定的增值空间

这里文章举了一个例子,如果一个服务的每个请求等价,

可用率从99.9%提高到99.99%,

每年的收入为100万美元,

那提高到99.99%的是预期成本为:

1000 000 * 0.09% = 900 美元

如果投入低于900美元,则认为符合预期,否则则认为按照这套规则不符合预期, 当然这只是简单的核算,

实际要考虑更多的东西, 而为了实现不同水平的可用率等基础集群,我们需要针 对不同要求的业务构建

不同性能等级的基础服务。

比如有的业务要求的是低延迟,即不希望自己的队列一直在等待,有的则希望有 高的吞吐,比如离线集群,用户的数据量很大,

希望能够维持较高的处理速度,比如大数据的相关业务。

具体的部分都会在后面每一个章节体现。

服务质量指标(34)

服务质量的衡量有非常大的意义,在于通过这些指标的实现会建立更加完善的指 标体系,规范等等。

为了表示服务的质量,通常用服务质量指标(SLI)、服务质量目标(SLO)、服务质 量协议(SLA)。这三个通常组成对服务的

评估和形成具体的目标值。

术语介绍
SLI(系统可用性指标)

SLI这里的I是Indicator,服务质量的某一个具体化指标。比较形象的理解是可 以把它理解为一些重要的比如Prometheus里面的metrics。

常见的SLI指标包含:

  • 处理请求所消耗的时间

这里在前端nginx那边一般是对应日志里面的upstream_response_time

而前端到代理的时间通常为request_time, 这些一般都需要记录在对应的log template里面。

  • 请求处理失败的百分比

这里如果一定要评估有很多方案,一种是通过nginx log采集到elk或者loki等日 志平台进行分析,一种是通过打探针进行追踪分析,还可以运行一些本地分析脚 本(适用较小系统)或者在nginx中引入lua或者lua插件。但是用lua一定要配合 严格的压力测试,否则引入lua插件可能会带来性能损失。

  • 可用性(availability)

服务可用时间的百分比(正确访问请求的情况下),比如3个9(99.9%),3.5个 9(99.95%)

SLO(系统可用性目标)

SLO这里的O是Object, 对于SLI限定一些具体的范围。比如SLI < 目标值,min < SLI < max等,比如要求访问请求时间小于100ms,要求io latency为0.5ms以内 等等。

制定SLO的好处可用让开发和运维之间沟通更加方便。比如开发说服务太慢了, 而运维这边的监控发现平均延迟等SLO都符合预期,可能是开发自己的问题或者 其他问题。

这里介绍了一种有趣的chubby(google分布式锁服务)降低业务对其敏感度的方法: 预期停机。通过计划内的停机来使业务和运维确认严重依赖的关键模块,并进行 更好的处理,而不是让业务以为这个的可用率是100%。也是一次对运维系统的考 验,比如切到其他集群的操作的稳定性等等。

这个其实是一种灾难演练,在后面的章节也会有说明。

SLA(系统可用性协议)

SLA这里的A是Agreement,这个协议类似甲方乙方,是用户和服务之间的一个明 确或者不明确的协议约定。

约定的内容通常是未达到的一定的惩罚机制或者达到的一些成本预算等等。

典型的云厂商在对应的业务下面都会有承诺的服务SLA,比如可用率99.9%等等, 还有这些带来的补偿等措施。

通过一种机制来实现SLA才是最关键的。我们之前的办法是有一个记录事故的系 统,这个记录通常是PE或者业务或者SA,记录事故的系统管理这个产品的可用率 等指标。这其实是一个很好的良性循环的机制。

指标实践
关键SLI

一般分为如下几大类:

  • 用户可见的服务系统

某个服务的访问前后端处理时间,吞吐量等等

  • 存储系统

调用的数据库,自己的存储的延迟、可用性等等

  • 大数据系统

大数据相关的一些队列延迟,吞吐量,集群的可用性等等

  • 正确性

是否操作了正确的数据,做了正确的事情,通常是开发需要关注的

SLI收集

这个一般是通过日志分析、通过监控系统、客户端探针等实现。

SLI汇总

汇总的时候要关注多个值,比如平均值,方差等等,做多个角度的聚合分析,而 不是一直关注算数平均。即使关注算数平均,

也应该更多关注不同百分比的算数平均,比如百分之80%的请求数的平均延迟在 多少毫秒,即更加关注趋势和分布。这样的

好处也是方便容量评估等后续工作。

指标的标准化也需要注意。比如指标的聚合的间隔,指标采集的频率,汇总的时 间,数据获取的准确性和方式,等等。记得

我刚开始工作的时候,公司内部就希望对Megaraid LSI RAID进行相关的Raid命 令megacli && megasasctl等采集

操作。

之后发现centos在运行megasasctl时候极大可能会造成系统hang住,如果直接上 可能会造成极大的问题。所以指标非常重要,而且必须是尽量

不影响服务的性能和稳定性的。

目标在业务中的应用

需要最终汇总出用户真正关心的数据模型。可以通过调研,通过思考,而不是直 接使用当前的一些度量方式。

如果获取不到,则使用一定的转化方式,尽可能地让指标接近。

SLO example

常规

  • 99%的GetRpc服务会在1ms内完成

带曲线和分布的

  • 90%的GetRpc服务会在1ms内完成
  • 99%的GetRpc服务会在3ms内完成
  • 99.99%的GetRpc服务会在10ms内完成
选择SLO制定SLA的一些建议
  • 避免出现绝对说明 比如永远等,永远不会挂,虽然这是我们心里希望的。
  • 尽可能的少 太多的SLO会让人失去关注的重点
  • 不要完全根据当前制定 通过长远考虑综合各种因素制定,而不是用现成的, 对外应当适当冗余,而对 内应保持较高要求
  • 保持简单 复杂的东西理解不方便,简单纯粹避免扯皮
  • 不要追求完美 通过迭代,不断完善,但也要注意评估一个合理的SLO,这样对双方团队都好, 如果一个团队始终无法接受SRE提供的SLO,那么可能这个团队不需要SRE团队的 支持。
  • 宣传方面适当保守 越少人知道越好,受众越广,修改就会越困难

减少琐事(44)

Tips:

  • 如果一个系统正常运转中需要人工干预,应当将此视为一种Bug。正常的定义会随系统的进步而不断改变。 by Carla Geisser

琐事toil,我理解的是繁琐的对接,无情的上下线沟通,剪不断理还乱的扯皮, 一波还有一波的重复劳动等等,总之,

就是感觉在浪费生命,每天干的事情就那些,没啥意思的事情。但是书中提到这 些大部分是流程开销,也通常存在一定的

价值。书中琐事的定义是运维服务中,重复性的,手动性的,可以被自动化的, 战术性,没有持久价值的工作。琐事通常

随着业务等级关系增长。

琐事比例最好低于50%

如果不加以控制,琐事会越来越多,人的成就感也会越来越低,把有限的精力投 入到了无限的琐事上去,会很难受。

因为琐事会造成中断,而且会造成恶性循环。记得刚工作的时候每个SA都要值班, 按天,到自己的时候就开始人dumb麻木

起来。一个无情的工单处理机器。那一天基本没有啥自己的时间,因为消息会有 非常多,会同时有几个人在咨询你,问你,

然后还要把工单带着做。每个人的手速都被调教地非常快而准。那天能吃饭也是 开心的。

后来随着工单彻底自动化,我们写了若干个自动处理程序,一切变得更加顺畅了。 值班基本上没事情了。以前多的VPN咨询

也因为明智的摊给IT而留在记忆里面。在琐事的情况下能学习到东西吗?是能学 到一些的,但是人会没有其他精神去学习别

的,这也是自动化的好处,不过好在我们一人轮一天。大家也互相帮忙,团队异 常融洽。

工程工作

和琐事相对的似乎是工程工作。每一个都是琐事的反义词。

工程工作有长久价值,需要创造性和主观性,具备通用性,有助于减少琐事。

SRE工作内容说明
  • 软件工程 代码部分,自动化脚本(shell, python, perl so on),自动化工具或者框 架(可能每个团队小组都会有自己的平台),如果没搞大平台的情况下,这个 时候大家都会有一些自己的东西。
  • 系统工程 配置变更,编写对应文档,调整负载均衡等集群的部署,架构等方面咨询和设 计工作。
  • 琐事 重复性无价值的手工的劳动。
  • 流程负担 招聘,会议,总结,培训等等。
如何减少琐事
  • 增加对应软件工程投入,引入自动化平台
  • 不相关业务匀给其他部门
  • 适当减少流程性工作,把时间匀给自动化相关思考
  • 定期头脑风暴相关优化措施,automate everything

分布式系统的监控(49)

术语
监控

monitoring,收集处理汇总,并且显示关于某个系统的实时量化数据。一 般附带告警功能。

白盒监控

white-box monitoring, 依靠系统内部暴露的一些指标进行监控,比如日 志分析,内部统计数据的HTTP等这里应该强调的是从内部层面,对业务从 内部采集数据,了解业务的才会做。

黑盒监控

black-box monitoring, 模拟用户可见的角度进行监控,比如http探针, 用户访问延迟等等。

监控台页面

dashboard, 监控某个核心业务的页面,一般是基于web的, 包含过滤、选 择等功能

告警

alert, 针对某个人或者某个组发的通知,目的地可能是工单、手机、 email、IM等等。

根源问题

root cause, 没看懂,我理解可能是系统的故障定义追溯。

节点或者机器

node/machine, 物理机或者虚拟机。

推送

push, 配置分发或者变动

监控的好处
  • 分析长期趋势

数据当前的数据量,数据的增长速度

  • 跨时间范围比较

例如使用了A架构后的性能提升多少,比对两个不同时间范围的性能参数即可

  • 告警 出现故障时候有人可以及时修复
  • 构建监控台页面 监控台页面有助于了解服务的实际情况
  • 临时性的回溯分析(在线调试) 刚刚只看到了请求增大了,有没有其他情况,比如CPU资源利用率等等?事故 评审review溯源需要
怎么监控和注意事项
  • 设置监控指标需要简洁高效
  • 添加白盒和黑盒监控
  • 四个黄金指标

    • 延迟 服务器处理请求的时间
    • 流量 对系统负载需求进行的一种度量指标,比如网络流量,请求数
    • 错误 请求的失败率
    • 饱和度saturation 服务容量有多满,服务是否需要扩容,比如磁盘剩余空间85%
  • 用直方图比例适合衡量指数型增长等参数指标 比如fio的统计输出,1ms以内的占80%,1-2ms以内的占15%,2ms以上占5%
  • 尽量简化监控指标SLO 简化到看一眼就知道哪里有问题了,比如xxx域名解析异常比xxx网站现在无法 访问要好
  • 设计SLO的适合要考虑

    • 这个指标的宽容度,什么告警媒介,是否应当被忽略(紧急程度),避免狼来了问题
    • 是否显示需要的数据,告警是否有依赖性,尽量保证不要重叠,是否具有可操作性
    • 这个谁应该处理,应该很明确,告警到正确的群或者地方

一个监控系统的指标应该是现象性,精确到技术栈会让监控更清晰

邮件告警通常会让监控成为噪声,解决的好办法是搭建一个dashboard用于处理 非紧急的告警。

对于每个季度可以进行on-call统计紧急告警的必要性和执行效率等问题

Google的自动化系统的演进(60)

自动化的意义
一致性

小黑和小白执行的结果都是一样的,多次执行也是一样的,就好像一个机器一样, 产出的面包

都长一样的,这是工程化的优势,可以减少事故、提高效率等。很多事故都是人 为介入导致错误

的,比如粘贴错误的服务器,敲错命令等等

平台性

自动化以后,这个系统逐渐完善到成为一个平台,这个平台可以交付很多任务, 更多的细节会被

暴露出来

迭代速度

迭代速度快,发现了问题和解决问题的难度由于在一个固定的地方,所以方便调 试,并且有版本

管理更方便进行历史回溯

节约时间

自动化节约时间,节约运维和开发的时间

自动化的对象
  • 创建账户

比如创建VPN账户,创建服务器账户,创建数据库账户

  • 服务器上下线

服务器上下线本身包含很多流程,如果把流程整合自动化,最终合并到机房工单 或者机房能看到,

会非常方便,下线通常包含去掉dns,去除cmdb中的记录,移除应用,机房处理 等等

  • 软件或者硬件安装

安装特定软件,比如docker,java,redis等等

安装特定硬件,比如raid磁盘格式化,nvme驱动安装等等

  • 版本发布

对于一些应用比如web应用发布重启等等

  • 配置更改

配置分发修改,比如puppet等iac工具

  • 其他

其他就是一些每个团队自己的任务了,比如dba有对应的修改表结构,这些通常 是自动的命令,

只需要审批,review等流程就可以自动化执行了,这个我们一般是放到工单的自 动化流程,

可以参考activi这种bpmn工具

还有一部分是通过配置分发工具,我们之前是通过puppet分发的

当然也可以把部分放到cmdb的应用配置等地方用于发布

自动化的措施
上云

通过云屏蔽底层硬件底层架构,业务只需要关心服务本身的状态,google是把广 告迁到了Borg调度

中心。

几乎每个中大型公司,都会有自己的私有云,架设在托管IDC机房或者自建机房。 使用云服务器的

好处很多,包括但不限于具有很大弹性(高峰使用,低峰给其他服务使用),充 分利用物理资源

(机架,服务器,磁盘),倒推架构改造(架构必须适合弹性伸缩的场景,多个 组件探活,资源

上下线等流程健全)等。

平台化流程化

通过流程化,引入BPMN等自动化流程设计,让各个运维部门能够针对性对某个场 景运行自动化任务,

这是非常有意义的。对于互联网人的成本是最大的,包含离职成本,培养成本等 等。

把流程通用,并且通过一个平台使得易用性明显提高,让运维解放双手。

这里也提到了google最开始很多自动化部署依赖于ssh,后来实现了一个基于RPC 的server程序,

为什么呢?ssh可能会挂掉,而且没有自己的一些逻辑,而server这种agent程序 可以很方便地

做权限等相关认证,确实应用对用户审计比ssh做审计要更直接简单。

自动化的阶段
  • 手动操作

手动执行大部分步骤

  • 脚本化

各个模块的脚本编写

  • 平台化

各个脚本等进行安全梳理和优化,并且开始有统一管理平台,操作权限逐渐可以 下放

  • 平台+自治系统

系统更加有弹性,处于自治状态,无人值守

这里有一点要说明的是,引入Borg系统也是google自动化的重要步骤

通过API去对资源进行控制和通过物理服务器上下线等操作是完全不一样的使用 体验,也是

自动化的更高更精细的境界,说白了就是引入私有云管理服务,屏蔽了硬件服务 器带来的风险

和分配,实现真正的服务自治,避免人工成本。这也是所有的大型互联网公司为 什么要发展自

几的私有云设施,但是随着大量使用云服务,云底层的变更(比如网络和存储) 也需要谨慎处

理,否则将会带来大规模的灾难。

发布工程(76)

发布工程(Release Engineering),用于构建和发布软件、自动化构建工具、包 管理器等非常了解,

我的理解是类似于持续集成,devops工程师。有幸做了一段时间devops工程师。

发布工程哲学
自服务模型

self-service,能够尽量少人为干预地执行版本程序构建和发布,才是好的发布 工程

追求速度

为了让用户了解更新的版本,追求一定的发布速度,在这个之间来回权衡

幂等性

多次执行结果必须一致,尽量不受构建机器的其他软件影响

强调策略和流程

每个步骤都是流程化的且指定人负责的,每个流程可追踪,workflow or pipeline

持续构建和部署

每个公司都应该有一个发布系统,而谷歌在写SRE这本书的时候叫Rapid(迅速)。

构建

通过定义依赖,定义输出目标,语言等等,插入版本信息等,最终构建出来一个 可发布版本

分支

主分支mainline

发布分支

bug分支,通过从主分支创建新特性分支,在特性分支上开发结束以后,进行测 试,如果ok,

则从主分支cherry-pick这个commit到主分支

分支管理有非常多的策略,我们之前使用的是Sprint+M双周+feature的方案

每个双周拉一个nr_test,其他feature分支基于此nr_test,每个双周结束以后

所有特性分支和bug fix合并到nr_test, nr_test回归测试没问题合并到nr分支

nr相当于release分支,最终合并到M分支(季度版本分支),线上以M为准

其他类似在合并到nr_test之前的还可能有其他依赖分支,

比如美术分支(美术相关的需要先合并到美术分支进行回归,再合并到nr_test) 等等,

其他策略通常都是区别在于如何管理bug,如何管理master分支,如何管理发布 分支

由于缺少tag和release等操作,还是存在一些版本方面的问题。

测试

通过引入单元测试等测试,来决定是否发布

打包

利用包管理系统进行发布,MPM,为每个包打上对应tag,构建hash值和签名,这 是一个非常好的

措施

Rapid系统

../images/sre-rapid01.jpg◎ ../images/sre-rapid01.jpg

可以发现基本就是一个网关,通过解释配置语言BluePrint,负责分发对应的持 续集成任务,

任务会找构建机器,构建单元测试和其他流水线,产生artifacts并且进入版本 管理。

部署

通过Sisyphus,自动化发布框架,我理解应该是一个流程平台,最终实现负载部 署

比较高级的CI/CD通常是纽带联系起来的,CI把预定义的测试流程跑完以后自动 上线,或者通过一个测试确认按钮继续。

CI和CD个人认为不应当认为是两个步骤,而是有明确相关的上下文关系。

配置管理

配置管理通常是不稳定性的来源,一般需要运维和开发等共同维护。解决版本的 办法和冲突有几种,

  • 比如通过打包工具打成包版本,配置文件分版本,这样两个版本包和配置包的依赖减少,减少出错

成本

  • 都是主分支对应的配置文件,通过其他区分
  • 从外部存储读取

简单化(85)

简单是一种美德,虽然无法避免系统出现问题,但是SRE需要在灵活性和稳定性 之间维护一种

平衡。这种平衡体现在日常的各种会议和抉择中。所谓前人栽树,后人乘凉。留 下更多的非固化

操作,后人接手就越麻烦,所以团队一定要通过版本管理工具如git管理和 review核心配置,并且有自动分发的

机制。

意外复杂度

一般来说,未按照我们的需求,"无意为之"这种,称为意外复杂度。

在运维场景里面,是不希望这样的,减少的方式是

  • 当别人尝试引入意外复杂度,及时提出抗议

这就是为什么领导通常会拒绝特别奇怪的需求,非场景化的需求,如果一个团队 全是这种需求,

而且无所避免,那真是一个灾难!

  • 努力消除运维系统的复杂度

自己用的系统,作为运维非常有必要,哪里不舒服,其实自己都知道,需要一个 有执行力的团队

慢慢会惊奇地发现,越来越好了!相反就是人人都在说自己在忙,又不知道在忙 什么。

代码膨胀

随着软件不断开发,软件代码会越来越多,让软件越来越臃肿,后续的维护会非 常麻烦,

所以多尝试负代码,重构代码。让代码活起来,而不是Shit Mountain。

文中提到了两个实践,

  • 最小API

不是在不能添加更多的时候,而是没有什么可以去掉的适合才达到完美。 - Antonie de Saint Exupery

一次只做一件事

  • 模块化

包含代码的模块化,数据格式的模块化,说通俗点就是可以通过引入或者依赖的 方式,方便地

进行使用和移除

具体实践(89)

SRE的职责通常包括提供让一个服务能正常运转起来的系统组件和让服务真正运 转起来。

包括一系列工作,如监控系统、规划容量、处理紧急事件,事件跟踪等。

这一章基本是其他的引子,这里忽略。

第十章-基于时间序列数据进行有效报警(93)

谷歌的监控系统是Borgmon,采用基于时间序列,可以通过 Prometheus理解,建议安装 测试下

时间序列的存储

通过time series的方式存储到内存中,timestamp, name=value的形式,定时归 档到TSDB

变量表达式

通过键值对和索引等综合起来形成一个变量表达式

{var=http_requests,job=webserver_requests,instance=liuliancao_web:443,service=liuliancao_web,zone=cn_hangzhou}

这个变量表达式可能会返回一组结果series set,通过加上时间戳可以过滤我们 真正想要的结果

{var=http_requests,job=webserver_requests,instance=liuliancao_web:443,service=liuliancao_web,zone=cn_hangzhou}[3m]

Borg规则计算(聚合)

在Prometheus对应聚合,当我们采集完数据以后,就需要对数据进行分析和处理,

比如最近的增长斜率,比如平均值等等,通过这些生成Prometheus的rules

可以参考 Prometheus awesome rules了解下规则的样子

告警

当我们有了规则和表达式以后,我们就可以对计算出来的值进行阈值判定,

比如HTTP_STATUS_CODE为非200等等

黑盒监控

黑盒监控和白盒的业务监控区别,通过探针方式进行监控

第十一章-on-call轮值

on-call,就是我们说的轮流值班,值班是为了让业务更加可靠,工作更加均衡 的一种手段。

值班的时候,通常要处理日常的告警(查看,定位,解决),解决不了要进行必 要的升级,

处理业务的一些工单需求,有的团队可以引入主、备值班负责人,防止单个人带 来的单点问题

在我工作初期,我们有值班制度,基本每人一天,值班通常是比较枯燥的,但是 可以让你

在同事的引导下快速熟悉业务系统和操作逻辑,可以让一个SA快速成长起来。

值班如何保持平衡
数量保持平衡

在满足业务的情况下保持必要的人值班,以尽量满足25%的工作时间上限,避免 值班人员

压力过大和工作过于饱和, 避免SRE运维工作超过50%的时间,而没有足够时间开 发和维护

SRE的系统组件

质量上保持平衡

每次值班对于异常事情进行事后报告,保证较高的效率

补贴措施

按照一定的时间比例进行时间或者金钱补贴,避免过度劳累带来的不幸福感

安全感

减少工程师的精神压力,避免依赖直觉等的非理性的情况,减少这些的方法通常 包括

  • 清晰的问题升级路线
  • 清晰的应急时间处理步骤
  • 无指责,多通过平台维护避免认为和平台保障,对事不对人的文化氛围
适当的运维压力

SRE团队应当恰当的人数,让每个团队的人能够参与若干轮值,可以通过灾难演 练等

避免出现问题的时候,造成人员紧张等问题

非常安静,系统太稳定,很多时候也可能是需要去优化的时候了,是不是我们采 集的

指标过少?系统是否能够满足后续升级扩容等需求?

第十二章-有效的故障排查手段

当一个告警出来或者业务反馈某个页面不能访问的时候,我们能做什么?如何快 速定位?

理论

具体可以看sre这个图,../images/sre-12-1.png◎ ../images/sre-12-1.png

一个故障产生,解决思路如下

  • 确定故障情况

明确是什么故障,是否确实有这个故障

  • 定位

最近有变更?服务是否正常?用户是否是特例?影响情况?

  • 检查

通过一些工具获取必要的信息

  • 诊断

对获取到的信息进行分析诊断

  • 测试/修复

通过诊断的内容进行修复验证

  • 治愈

修复好,通知服务正常

一些陷阱

排除故障的时候,可能会有一些操作需要尽量避免

  • 没有真正理解故障和现象

在故障理解上存在实际偏差,导致浪费宝贵的时间

  • 因为自己操作的问题导致验证或者修改的时候存在偏差,造成测试假设失败
  • 把问题过早判断为极低概率事件,方向刚开始就搞错
  • 试图优先解决次要问题

没有发现这是主要问题带来的次要问题,应该优先解决主要问题

避免这些问题需要注意:

  • 了解常见运维系统和组件的工作原理,了解分布式的运行基本模式和原理
  • 优先考虑简单解释,而不是天马行空
  • 相关性不等于因果,找到主要矛盾才是关键
一个例子

莎士比亚搜索服务报错"the forms of things unknown"

定位

问题的严重程度,非常严重则需要升级问题到全员知道,同时需要保持冷静

通常应当首先想到最大可能地恢复问题,而不是"解决"这个问题,文中举例

飞机出现故障,应当首先安全降落再考虑故障定位等操作

检查

通过监控系统检查服务的状态,通过日志检查访问是否正常,比如403,502

这些通常日志和监控都会有对应数据,需要我们进行简单的过滤和筛选

确定我们的监控手段,是给/api/search发送一个http get请求,要求是返回

一个200 response code,我们手动curl以后发现,后端返回了502

诊断

问题分解,什么,哪里和为什么

比如这次事件

现象:一个Spanner集群出现请求超时

为什么: Spanner服务器的任务把CPU跑满,无法处理用户请求

哪里: Spanner服务器的CPU消耗在日志记录排序(通过采样程序)

解决办法: 重写该正则表达式,避免回溯,使用RE2,在代码寻找类似问题,避 免呈线性关系

关注最近的修改

通常来说一个正常运行的系统出现问题,极可能和最近的变更有关

测试和修复

开始假设和验证,不断推翻和排错(前提是对现象足够清楚)

注意如下几点

  • 一个理想的测试是具有互斥性,一个测试可以把一组假设推翻,同时确认另一组假设
  • 先测试最可能的情况,先测试网络联通性,再确认配置变动等
  • 注意某些测试可能有误导性结果,比如禁ping可能会让你觉得服务器异常
  • 执行测试可能会带来副作用,打开日志查看等也有让系统更糟糕的可能性
  • 尽量把操作记录记录下来,可能会带来一些新的状态变化
优化故障解决办法
  • 增加可观察性

通过完善日志,监控等,方便检测性能等手段

  • 使用成熟的组件接口设计系统

这样可以更方便的trace或者标记各个链路的情况,简化遇到的问题

第十三章-紧急事件响应

遇到紧急事件的时候,通常第一时间需要的是冷静,这个是需要不断的处理事情 的经验过来的

如果解决不了需要及时升级,使用一套灾难应急响应流程。

引入测试,定期测试模拟故障

这个阿里云经常会模拟机房事故,来显示自己的跨机房能力,虽然有些表演的味 道,但是

每次都会比较重要,因为通过这个可以不断验证我们的跨机房能力

引入故障模拟,可以验证和优化我们的流程,提高整个响应事件的决策水平等

通过事后总结,可以总结好的方面,比如响应及时,果断,很快找到原因并修复

总结不好的地方,比如没有统一的决策人,流程还存在不完善等等

向过去学习,而不是重复它

每次事故以后保留操作记录和待办事项,应该有一个系统统计和记录我们的所有 事故或者事件的

处理过程,比如ITIL事件管理系统

多想一下机房断电这些问题,被入侵了怎么办,服务器硬盘坏掉怎么办,对于所 有业务

都优先考虑冗余(硬盘冗余RAID,部署多个后端,无状态或者存db,机房机架冗 余)等等

第十四章-紧急事故处理(140)

回溯一个紧急事故处理场景
  • 发生业务问题,进入on-call状态 电话告警提示某服务不可用,紧接着,其他5个数据中心的3个提示不可用
  • 发现错误日志提示某个服务模块不可用 开始尝试回滚版本,失败,联系模块开发 其他两个人表示只是看看,没有参与解决问题
  • 业务高管提示你的上级,没有人通知他
  • 公司副总裁问你什么时候能恢复服务 同时问你为什么,原因等,提出自己的一些解决办法,比如增加缓存大小
  • 最后两个数据中心的也挂了
  • 在你不知道的情况下,开发给另一个开发打个电话,修改了cpu亲和性 结果修改完配置后,服务读取了新的配置文件,彻底奔溃了
分析这个场景

这个场景我们可能都经历过,如果没有合理的事故处理流程,对于刚入行的新人 来说。

过于关注技术问题

这段我是没看明白,我觉得这段的意思是过于专注技术上解决,而忽略了通知, 降级等操作

沟通不畅

处理人并没有和其他人进行沟通,没有人知道他们正在做什么,业务领导不知道, 用户也不知道

其他可以帮忙的工程师并没有被充分利用

不请自来

意外的操作人带来的意外操作导致现场没了,情况更糟糕了

紧急事故处理流程要素
嵌套式职责分离

场景中的On-call工程师需要处理的事情太多了,既要通知,又要处理,同时还 要和领导

进行沟通

事故处理中的角色

  • 事故总控(incident command)

负责组件事故处理团队,按需求和优先级分配任务,额外处理一些申请权限等工 作

  • 事务处理(operational work)

通过和事故总控沟通的情况下,负责实际对系统的修改

  • 发言人(communication)

对外公众发言人,通过邮件等方式整理目前的事故文档等等,确保消息的及时性

  • 规划负责人(planning)

规划负责人负责填写事故概要,交接记录等,方便事故能够被复原

在我们之前的公司,事故总控一般由PE担任,事务处理到SA,发言人通常是各级 领导

写事故概要通常是相关率最大的人,其他人补充,事故系统其他业务也是能看到 的。

控制中心

事故有一个总控人,负责协调工作,文章提到IRC等消息系统对解决问题有帮助

其实一般遇到事故,我们也是拉IM多人

实时事故状态文档

事故总控负责人需要维护这个实时文档,可以多人编辑

这个我们之前都是事后维护,紧急的事项可能不会有这么多时间考虑

明确公开职责交接

如果超出工作时间,可以进行工作交接

这个…

回溯一个紧急事故处理场景[优化]
  • 发生业务问题,进入on-call状态 电话告警提示某服务不可用,紧接着,其他5个数据中心的1个提示不可用 A开始调查原因,随后5个数据中心的第二个也有问题了,升级到紧急事务处理 框架
  • 联系事故处理人 戳了另一个人B,让他当事故总控负责人,事故总控负责人B就位,并开始记录 遇到的情况
  • 事故处理人更新信息到邮件列表 B整理好邮件,发给了预先设置好的邮件列表,提示暂时没有收到影响,但是 可能会有第三个数据中心报错 当第三个数据中心的服务也挂了,B更新了邮件,并开始联系公关准备起草用 户通知通知用户,
  • 联系开发处理 A和B商量后,决定联系开发,B此时联系开发负责人C, C上线了发现D也自愿加进来,总控B提醒C和D优先处理A交给他们的工作,并且 必须告知A 他们即将进行的任何操作,C和D阅读了邮件很快知道故障情况。
  • 交接其他团队 到了下午,B的下班时间到了,于是召开了简短的电话会议,交接给另一个团 队了
  • 事故时候处理 A第二天早上回到公司,发现有同事定位了具体问题,缓解了问题,同事将事 故做了了解。 问题解决了。A补充了一些细节,并且提出了一些后续措施供时候评审。
什么时候宣布一个事故

这个一般是领导通过层层决定的

当我们遇到一个事故的时候,通常要根据如下因素判断

  • 是否需要引入其他团队
  • 是否影响终端用户
  • 几分钟后,是否得到解决
事故管理最佳实践

文中的最佳实践

  • 规划优先级

控制影响范围,尽快恢复服务,同时尽可能地保留现场和命令记录等

  • 事前准备

事先准备好一个事故处理流程,并演练

  • 信任

充分信任每一个参与者,分配职责让他们自主行动

  • 反思

如果自己确实短时间解决不了,需要升级

  • 考虑替代方案

周期性地检查当前情况,看是否在处理更紧急和更重要的事情

  • 换位思考

多更换角色,熟悉每一个职责

第十五章-事后总结:从失败中学习(146)

一般一次事故或者事件以后,需要追根溯源,痛定思痛才能避免再次影响。事后 总结文章有一些最佳实践,可以参考一下。

Google的事后总结哲学

事后总结不是惩罚,而是整个团队的一次学习机会,什么时候进行事后总结?

  • 影响用户
  • 数据丢失
  • oncall工程师需要手动接入的(比如回滚,切流量)
  • 耗时超过预期的限制
  • 不是监控先发现的

我们之前的写ITIL的条件是 和谁最相关就谁记录,所有的问题都要记录,标记 为事件和事故

比如出现dns解析问题就SA记录

出现应用的开发bug等问题就开发或者PE记录

出现数据库故障就DBA记录,把相关的跟踪人记录好就可以,然后每周评审

事后总结的原则
对事不对人

出现认为错误的地方一般是流程体系不完善,比如监控,比如操作的步骤约束,

比如没有回滚方案等等,也可能是这个系统正在镇痛期,正在进行非常大的架构 改造,总有

例外情况,业务必须要有一定的容忍性,才能够一起配合完成更好的过渡。

补充一点这个其实挺难的,肯定会影响你的绩效的,这个时候会有各大团队外部 甩锅,内部分责

,像极了自己的孩子,哈哈。但是会因此带来很多经验甚至教训。

所以比较好的方式是指出问题的关键,并给出可落实的建议。

写作和知识共享

可以实时协作,允许评论,可以邮件通知,这个一般ITIL系统应该都有

评审的质量

一般要引入其他团队或者专家评审团队负责对评审进行质量分析和跟踪

事后总结文化培养
  • 可以评出每月最佳时候总结

定期每年回顾,每月回顾

  • 事后总结小组

通过小组,提出一些最佳实践和评论

  • 事后总结俱乐部

在这个小组中开放讨论事后总结

对新人是很好培养的方式

经常收集事后总结正向反馈

可以通过调查问卷等方式

第十六章-跟踪故障(152)

正常来说我们的告警是很多的,还有故障的邮件等等,对于细微的内容很多时候 不容易注意到

google使用Outalator来汇总某一时段的告警,把信息流都收集起来,方便排查 和review优化等。

系统里面可以通过聚合减少重复告警,

通过加标签代表一些过滤参数,

分析历史数据等来对未来产生帮助,甚至是Aiops的学习数据等。

通过里面的链接可以加速我们定位查找关联ticket的时间。

第十七章-测试可靠性(157)

如果你没有亲自试过某件东西,那么就假定它是坏的,做一个"悲观锁"。

一般来说变更通常会引入不稳定性,从而可能带来事故,所以需要评估风险来降 低这种不确定性。

测试分为软件测试和生产测试,软件测试一般注重功能性,生产测试检查生产环 境上的工作情况

基本分为单元测试-集成测试-系统测试

单元测试

单元测试是最小的最简单的软件测试形式,测试一个软件单元,一个类,或者一 个函数的正确性

集成测试

集成测试通过依赖注入等方式,创建各种依赖的mock环境,可以测试一系列组件 的在一起的工作情况

系统测试

系统测试通过部署所有组件在一个未部署的系统上

系统测试分为如下类型:

冒烟测试(smoke test)

最基础的测试,如果这个测试都过不了就没必要运行其他测试

性能测试(performance test)

冒烟测试通过,就可以记录相关的性能数据 并且和历史的做比较

回归测试(regression test)

通过对历史bug或者全局功能的测试,保证系统不会再有之前的故障`**** 生产 测试生产测试是和实际的生产环境进行交互,这个一般也会有预发和压测环境

可以通过一些黑盒测试进行一些数据压测等模拟来检查生产环境的性能数据和一 些风险

配置测试

比如前端的配置,比如jvm的配置等等,比如内核参数的调整等等,这些变化可 能会带来很大的性能表现

配置错误肯定应该在变更之前发现,但是生产的很多系统不能实现模拟,这个时 候就要通过一些办法来模拟

比如nginx的配置,我们可以通过完整的copy环境模拟,也可以通过docker绑定 vip+配置分发工具去模拟

通过集成我们的hook,实现一些自动化测试

压力测试

为了了解系统性能边界,需要通过压测了解每个组件的临界值,这个在电商等场 景非常普遍

金丝雀测试

金丝雀来源于煤矿中的金丝雀,指通过一只鸟检测有毒气体避免人类中毒的做法。 我觉得就是我们说的小白鼠。

因为大部分的测试可能都是第一次就能发现的(比如灰度),所以如果引入一个 小白鼠, 一旦这个小白鼠有问题

快速回滚,否则继续放流量

创建一个构建和测试环境

如何引入测试模型?在一个建好的项目或者刚建的项目

  • 区分各个项目的重要程度
  • 区分项目里面的重要的类和操作
  • 区分跨团队的API
  • 通过BUG引入测试用例,逐步完善,形成良性回归
  • 引入一套完善的测试基础设施

这个基础设施在每次代码改动都进行构建,发现问题及时通知 这样大家会知道 变更

可以引入构建树等信息,列出具体被影响的内容,更加方便了解里面的变化

大规模测试

对于SRE自己开发的工具也应当走发布流程,否则是相当危险的

另外可以通过增加系统边界,监控等机制来满足避免某一危险特性被分发到线上 环境

灾难测试

引入一些意外因素,来模拟实际的灾难业务表现情况和一些熔断措施是否正常, 数据一致性能否保证

引入生产环境探针

第十八章-SRE部门中的软件工程实践(176)

SRE需要进行软件开发,且是最适合进行开发的人员。SRE最熟悉系统的复杂度, 能够

深刻理解工具的重点,使用习惯等,同时SRE的系统通常都有一定的普适性,对 公司的

底层发展和解放生产力有非常重要的作用。对内也可以很好地进行代码迭代,同 时由

于是内部用户对UI和版本bug、测试等都有一定的包容性。也只有通过不断工程 化,

SRE甚至公司的开发都会有非常大的幸福感。

auxon的例子: 容量规划项目
分析现状: 传统容量规划的步骤
  • 收集未来项目的扩容预期,询问对应业务是否扩容等

需要多少资源?哪些服务需要扩容?对应需要多少设备?放在哪?机房是否要准 备?

通过今天的数量预估明天一般是按照季度进行预估

  • 根据预估制定资源的具体采购,构建和分配计划

基于业务预期,制定具体的供应商,机房分布,预估价格等信息

  • 领导评审

运维和产品大领导进行评审,评估是否预算ok,是否符合产品的期望

  • 资源就位进行部署

资源就位以后,由于采购需要时间,需要对应哪些服务会用到,如何更合理分配。

是不是像极了你们的采购?确实像我们之前的采购。我之前开发的采购系统也是 基于这种设计

进行设计的,用户提交采购申请,我们确认ok然后进行大领导审批,最后进行自 动部署。从某种

程度上,这个可以解决谁使用了这个资源(成本对应的上),谁申请了采购,中 间有审批确认,避免

扯嘴皮子。有资源池的概念,可以适当进行弹性,或者业务之间进行沟通,挂下 自己的成本中心。

传统容量规划的问题
不可靠性

传统性的容量规划可能会由于很多不可靠性造成原来的规划失效或者不合理,比 如

  • 服务性能下降,需要更多的服务器
  • 服务用户激增,需要更多的服务器
  • 某个计划上线推迟
  • 临时的架构改进计划比如从单份变成多份
  • 上公/私有云
时间周期长,不够准确

通过过去一个季度反推当前季度,通过表格层层审批记录,是的结果非常不可靠,

信息在传递过程中丢失等。

基于意图的容量规划

意图是服务负责人对运维服务的一种表达,比如

  • 我需要50个cpu资源,分布在x, y, z集群,服务是Foo

具体的资源请求,和我们印象的诉求一样

  • 我需要50个cpu资源,在区域M的任意三个集群中,服务是Foo

只要在区域M就可以,但是要三个集群

  • 我需要满足服务Foo在每个区域的需求增长,同时保障N+2冗余度

现在需求明确到集群的容忍度等

  • 需要Foo以99.999%的可靠度运行

在N+2冗余度追加可靠性需求

书中反馈在达到第三个级别意图收益最大。既可以满足分配的自由度,又可以很 好地表达。

表达意图的元素
依赖关系

服务运行通常会依赖各种底层服务,比如dns,公共网关,机房网络等,整体通 过层层依赖关系进行选择。

性能指标

性能指标(比如网络带宽多少)最终转化成低阶的资源类型,需要多少交换机, 多少服务器,多少网线等。

优先级信息

在资源不足的情况下,哪些业务应该得到保障

auxon简介

auxon是google sre小组和产品经理耗时两年时间迭代的基于意图的容量规划系 统。

auxon通过把所有的需求信息通过protocol buffer方式上传,转化成对应的线性 表达式,并且通过最优算法进行求解,最终

确定一个分配计划。具体组件如下:../images/sre_auxon.png◎ ../images/sre_auxon.png

通过保存的Performance Data(压测数据 or 预估数据)和Per-Service Demand Data(业务要求数据)

进行比对,可以很好地进行评估资源情况。

在auxon案例中,此系统得到了内部的支持,刚开始并不是完美的设计,但是是 按照大家约定的规则进行

迭代演进,当有不确定因素的时候,力求保证最开始的设计,尽可能是一个通用 方案。

auxon推广

除了发一封公告邮件或者一个简单的演示外,还需要

  • 持续的和完整的推广方案
  • 用户的拥护支持
  • 资深工程师和管理层的赞助,因为他们看到了项目的实用潜力
  • 适度地提供文档
  • 以用户的角度提高可用性
设立期望值

给产品先设置一个最小可行产品(MVP)通常是比较重要的,如果承诺太多太快 无法做到,

容易丧失可信度,可能找不到人试用。一般递进地,稳定地,小型发布更容易提 高用户对项目的信心。

在auxon案例中,通过承诺可以解决他们痛苦的问题,并且切换到当前系统的配 置可以保持不变等,吸引产品。

识别合适的用户

auxon初期选择没有容量规划的团队,这些团队自己也需要一定的时间和精力开 发,

这样的项目通常也更具说服力。通过前后数据对比流程会让更多的团队使用它。

客户支持

当用户有问题了,大家积极进行试用的反馈通常要安排对应的支持,让他们更好 地使用,避免学习曲线带来的

情绪。

合适的层次进行设计

不过分定制,但是保证一定的通用性。让产品的的设计更加合理。

优化团队小组

既有领域专家,也有对应的通用型人才,这样多样化的团队有助于避免设计盲点。 必要时候,

可以外包或者咨询一些专家,比如容量规划这里,可能涉及到统计学和数学等基 础科学和大数据,ai学习模型等。

建立SRE软件工程氛围

保证有一些SRE项目,并且保证一定的不被干扰的开发时间,避免琐事等

关注团队自己的小项目,随着采用率提高变成正式项目,一个项目在几个归宿:

  • 单人业余时间开发,服务部分用户或者测试中,草根型项目
  • 通过内部渠道升级为正式项目
  • 得到SRE领导层的认可,扩展成为完全独立的软件开发项目

第十九章-前端服务器的负载均衡(191)

每个公司的前端集群都是非常重要的,对于一个公共服务如果挂掉影响非常大的,

如何保障前端的高可用性,这里有几种方式参考。

dns轮询

多个A记录指向nginx,dns带有健康检查

anycast ip方案

维护anycast ip,通过就近方式访问对应的服务

lvs DR + nginx

通过lvs直接路由的方式,配合各个实际RS(包含nginx)的dummy接口伪装处理消息,最后通过

自己把请求传回给用户,通过把服务部署在多个lvs集群上,在dns进行多个A记

录的设置。

ospf等价路由+nginx

三层交换配置ospf等价路由,通过类似5元组的方式进行hash到对应的真实的代

理服务器,代理服务器通过安装quagga来虚拟路由器实现ip伪装。

第二十章-数据中心内部的负载均衡系统(197)

本章主要讲了类似nginx的upstream的部分,由于GFE是自研,所以可以配合做

更多的比如限流等逻辑。

后端的状态

后端的状态分为

  • 健康状态

后端可以处理请求

  • 拒绝连接

后端处于无响应状态,端口failed

  • 跛脚鸭状态

正在监听可以正常处理,但是已经准备停止

通过跛脚鸭状态,可以优雅停止,通过发送SIGTERM发送信号到该任务,后端会 在所有请求处理完成以后进行退出。

nginx有类似的heath健康检查插件,可以做类似的功能。

限制连接池

每个具体的服务维护一个长连接数量,类似nginx的keepalive机制。

请求到后端的选择算法
随机
  • 300个客户端
  • 300个后端
  • 30%的子集大小
确定

通过在每一轮进行重排是的同一轮的客户端均匀使用

第二十一章-应对过载

对于负载均衡来说,有可能会随着业务压力上升造成cpu等资源的紧张。这个时 候就需要降级。

比如

  • 返回一个信息提示负载过高,尝试记录这些错误
  • 改成使用缓存获取不是最新的数据
  • 对一部分数据进行搜索
QPS规划陷阱

由于qps数量可能和客户端,后端代码等多种方式有关,因此有时候使用qps这种 规划方案可能会有些问题。

更好的解决方案是使用可用资源,比如可用500CPU和1TB内存,按照可用资源进 行额度规划。

大部分时候简单使用CPU进行容量规划也可以工作地很好。

  • 在有垃圾回收GC编程环境里面,内存的压力通常会编程CPU的压力(内存受限 的情况下GC情况会增加)
  • 在其他编程环境里面,资源一般按照某种比例比如1cpu:4内存进行配置。
为每个用户设置限制

对用户或者服务配置限制,比如

  • 邮件服务使用4000CPU(每秒使用4000个CPU)
  • 安卓服务允许使用3000CPU
客户端侧的节流机制

当用户或者服务超过配额,后端服务应该拒绝请求并返回配额不足错误。

当客户端监测最近错误是配额不足导致的时候,应该主动限制自己的请求速度减 少后端过载压力。和tcp的滑动窗口类似。

重要性

关注重要性也是在过载发生时候一个重要手段。把请求标记为

  • 最重要 CRITICAL_PLUS
  • 重要 CRITICAL
  • 可丢弃 SHEDDABLE PLUS
  • 可丢弃的 SHEDABLE
资源利用率

使用的CPU消耗程度/预留CPU 这一比例衡量资源利用率。

通过资源利用率超过一定阈值的时候开始拒绝请求。

处理过载错误

大规模后端任务处于过载状态,需求不应该重试而应当传回给请求方。

在小部分后端任务处于过载状态时候,优先进行重试。

决定何时重试

当时收到任务过载错误的时候,需要决定是否要重试,

增加最大请求次数的限制,比如已经失败了三次就不再尝试。

连接造成的负载

第二十二章-处理连锁故障

连锁故障是当一个小部分模块故障以后触发的连锁反映造成大面积的连锁故障这 种现象。

产生连锁故障的原因
服务器过载

比如服务器本来只处理1000qps的请求单位,突然由于其他后端挂掉导致其他请 求访问过来造成压力增加

资源耗尽

某一种资源耗尽导致的高延迟搞错误率情况。

cpu

CPU如果发生资源耗尽可能会导致请求变慢,请求都在等待。

内存

内存消耗过多可能会导致任务崩溃,GC速率加快,从而导致CPU使用率上升,缓 存命中率下降。

线程

线程不足可能会导致健康检查错误。也可能会导致进程ID数不足。

文件描述符

文件描述符不足可能会导致无法建立网络连接导致健康检查失败。

资源之间的相互依赖

资源耗尽导致各种的依赖资源或者模块资源告急的问题

防止软件服务器过载
  • 通过压力测试测试出服务器的极限 同时测试记录哪种资源会耗尽和其产生的,结构等场景
  • 提供降级结果

当压力过大降级,返回降级结果

  • 过载情况下主动拒绝请求

当前端或者后端进入过载模式的时候,可以尝试把请求标记为失败,避免雪崩

  • 上层系统应该主动拒绝请求
  • 进行合理的容量规划
有效重试

当服务处理失败的时候我们需要进行重试,需要注意一下:

  • 在重试之前进行必要的判断,确认是否要重试
  • 重试请求时间最好指数型增加,避免无效重试
  • 限制重试次数
  • 增加全局重试的次数限制,用户重试过多则标记为失败
  • 使用明确的返回码标记各种错误模式应当如何处理
请求延迟和截止时间

为每个请求设置一个timeout,超过时间则应当放弃该请求。

另外可以把整个请求标记一个总的deadline时间,超过deadline时间则不再传送。

对于请求延迟我们应当除了关注平均延迟也应当关注延迟分布,并且设置的截止 时间不应当比平均延迟大好几个数量级。

冷启动和缓存问题

正常的集群的性能会比刚开机要好一点,因为刚开机有个初始化的过程,可能会 导致效率比较低。

所以可以考虑预热。

调用栈尽量向下

不要又调用回去了,可能导致死锁或者通信环路等问题。一旦负载高将会十分危 险。

连锁故障的触发条件
进程崩溃

部分服务触发某个BUG或者卡死,导致服务不可用,集群压力过高。

进程更新

当我们更新我们的运行进程的时候应当选择合适的时间和顺序 批次等等。

新的发布

发布带来性能改变,特征改变等等,因此发现故障及时回滚是比较明智的。

自然增长

用户数增长触发过热瓶颈

计划中或者计划外的不可用

比如机房维护,服务维护,网络变更等等。

连锁故障的测试
压力测试

压测到每个组件的边界,直到他们崩溃

测试最常用的客户端

测试服务中断的时候客户端的表现,是否指数型延迟重试,是否排队,是否导致 流量变化等等。

测试非关键性的后端

测试不可用后是否会影响关键组件

解决连锁故障
扩容
如果有健康检查等依赖,停止掉让他们能够继续服务
重启

尝试重启服务

丢弃部分流量

如果服务一负载上升就崩,那迫不得已可以丢弃掉部分非重要流量。等服务起来 正常瓶颈解决以后再恢复。

降级

通过熔断策略,进行有效降级,减少处理步骤快速恢复服务。

停止批处理等负载

关闭一些非重要服务以降低负载

清楚有害流量

如果是攻击等,需要封禁等,黑洞这些异常流量。

第二十三章-管理关键状态:利用分布式共识来提高可靠性(246)

我们业务在部署的时候应当考虑尽量把业务部署于分布式服务器中,即业务能够 容忍一定的硬件故障,达到最大限度的提高可用性。

为此有一个经典的CAP理论用来描述这一个关系。作为任何一个分布系统,无法 同时满足下面的关系。

  • C(Consistency, 一致性)

所有的节点访问均是最新的副本。每个节点所见的数据是一致的。

  • A(Availablity,可用性)

每个时间节点是可用的,不管失败还是成功都有响应。

  • P(Partition Tolerance,分区容忍)

数据丢失不一致或者失败不会影响系统的访问。

以典型的CP和AP来说:

  • 选择CP,则要容忍短暂的不可用,这个时间数据需要同步和重新选举等。
  • 选择AP,则要容忍短暂的数据不一致,这个时间可能会访问到旧的副本。
使用共识系统的动力:分布式系统协调失败

正常分布式的系统的逻辑处理相对复杂,在一次故障中,有时候很难精确判断问 题,比如产生网络延迟,包被丢弃等。

  • 脑裂问题

比如我们常用的keepalived, 通过对对方的ping或者命令来检查状态,如果中间 网络有问题,可能slave会觉得master有问题,slave触发脚本并且尝试抢占vip。

  • 需要人工干预

某些系统,当系统无法判断是否能够进行主从切换的时候,这个时候需要引入认 为因素来控制切换流程。这样代价是运维压力大并且恢复效率差。

  • 有问题的小组成员算法

比如通过gossip(consul的分布式实现方式)的方式把集群添加,当出现网络问 题的时候,可能会选择多个leader出来。同时接受写入和删除操作从而造成数据 丢失。

目前常见的解决分布式共识问题的方法是Paxos,Raft,Zab,Mencius等。 Paxos可以参考下

Paxos分为三个角色,

  • Proposer

提案者,提出对应的操作

  • Acceptor

允许accept对应的提案

  • Learner

只能学习收到的value

Paxos接受value的过程

  • Proposers把value发送给Acceptors
  • Acceptors对value进行accept
  • 由于有每次只能选择一个value的要求,所以这个时候满足大多数原则的value 会被选择(chosen),接受的value成为批准决议proposal

代码整洁之道之程序员的职业素养读书笔记

职业素养相关

很多人都写过代码,从hello world到服务公司内部甚至外部的大型项目,

代码整洁之道2这本书主要讲的技术的术,可能被我们忽略的软技巧。

作为一个程序员,我们是否是合格的?怎么定义?我觉得可以从书里面的

各个章节做一下对比。这些组成了一个程序员的职业素养。全书只有216页,

并不多,加油读完!

第一章 专业主义

什么是专业主义

专业主义意味着要对自己负责的领域负责,在这里我们通常有一定的权威性,

我们运维来说,比如在部署发布的时就要为自己写的部署逻辑负责,一旦事情搞 砸了,

就是需要我们自己收拾残局。

专业主义责任重大

当我们开始写的时候就要明白,一旦这个系统出现巨大的bug,就可能到之非常 大的损失,

所以一切谨小慎微总是没有错,做就要做到自己认为可交付的状态。

为了专业主义
测试

为了避免出现这些bug和问题,我们在交付的时候就应当尽量做到让qa找不到问题

怎么减少,写测试用例,要求必须覆盖超过90%的代码,如果没法写,就想办法, 让代码能接受这些测试

并且尽可能地自动化地测试,这种方法叫做TDD(测试驱动开发)

没有完美的系统,但是我们要为这种不完美尽可能负责,也应该尽量减少相同的 错误

尽可能多地测试

设计合理,经常修改

代码能接受经常地修改而不会影响(前提是测试用例覆盖率)

如果不能就改进设计,尝试像雕琢玉一样完善代码,进行无情重构

每次发现问题了,就立即改掉

职业道德

有学习时间很好,没有学习时间就更需要自己去学习

熟悉自己的领域

如果我们一直不去熟悉了解自己的领域,很可能运维水平还不如一个开发

当遇到一个专业名词的时候,至少应该尝试去了解它

对于经典的东西,应该能够有肌肉记忆,就好像曲谱一样,能够闭着眼睛弹出来

主要领域包括

  • 设计模式

需要熟悉GOF书中的24中模式,同时还要有POSA中的模式的实战经验这里我理解 的是用熟悉的语言能够快速写出常见模式的例子和使用场景

  • 设计原则

必须了解SOLID原则,而且要深刻理解组件设计原则

  • 方法

必须理解XP,Scrum,精益,看板,瀑布,结构化分析和结构化设计等

  • 实践

必须掌握测试驱动开发,面向对象设计,结构化变成,持续集成和结对编程

  • 工件

必须了解如何使用UML图,DFD图,结构图,Petri网络图,状态迁移图表,流程 图和决策表

坚持学习

读文章,关注博客微博,参加技术大会,访问用户群,多参与读书和学习小组

不动就学,不畏艰难

练习

业精于勤。通过不断操练,提高自己的能力。

通过每天在上班前做1-2个kata,不断训练自己去解决简单变成问题

做kata的目的是训练你的手指和大脑

合作

和他人合作,通过合作,会学习到很多东西,并且能在更短的时间

完成更高质量的工作

辅导

教学相长,通过传道受业,能够从里面获得收益

与雇主一致

这个在于时刻要了解客户的真实想法,否则你开发的只是你用的

无论什么时候都在雇主问题的基础上提供最佳的解决方案

保持谦逊

少说无用的话,多做有用的事情,说话留一线,日后好相见

说"不"

能就是能,不能就是不能,不要说试试看。 -尤达

文中举了一个例子,就是一个系统在没有充分测试的时候导致交付

从而产生的血淋淋的例子。最近我开发的一个编排系统也是有感觉,

领导的意思恰恰相反,他们希望我能把功能完善好再提交测试,而我

总是想测试自己都不觉得非常稳定的功能,而实际也后续进行了很多

稳定性修正。

对于说不,是建立在我们觉得系统的稳定性得不到保障而可能造成

生产环境的损失而言,对于系统的稳定,不妨稍微悲观一点,收敛一点

我们的自信,表现地更加沉稳一点。

我们依然可以和我们的经理和上级勇敢地说不。

不卑不亢地说明我们的理由,如果他们不能接受,至少我们也曾努力过,

看下是否有折衷的方案。

不要表现地尽量试试,而是评估具体的时间,这样让大家觉得你比较可靠和专业。

如果无法完成,就是自己的失责。

一个问题在于说不的同时,当目标很难达成的时候,我们应当提供大家都能接受

的方案,而不是一直在否定,也尽量少提供一些技术细节让别人拿捏,尽量从对 方

的角度去解释和分析问题。

当领导出现强迫希望我们试试的时候,我们可以保留好证据和适当越级反馈,

当然最好是和领导沟通后,提早暴露项目的风险,拯救项目。

技术栈

监控

面试题汇总

提问的智慧

https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

提问前

在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下 事情:

  • 尝试在你准备提问的论坛的旧文章中搜索答案。
  • 尝试上网搜索以找到答案。
  • 尝试阅读手册以找到答案。
  • 尝试阅读常见问题文件(FAQ)以找到答案。
  • 尝试自己检查或试验以找到答案。
  • 向你身边的强者朋友打听以找到答案。
  • 如果你是程序开发者,请尝试阅读源代码以找到答案。

回答问题

  • 态度和善一点。 问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。
  • 对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找常见问题都不知道。
  • 如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来像个专家很好玩,就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。
  • 如果帮不了忙,也别妨碍他。 不要在实际步骤上开玩笑,那样也许会毁了提问者的设置 有些可怜的呆瓜会把它当成真的指令。
  • 试探性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西 你也可以。试试将蠢问题转变成好问题,别忘了我们都曾是新手。
  • 尽管对那些懒虫抱怨一声 RTFM 是正当的,但能指出文件的位置(即使只是建议个 Google 搜索关键词)会更好。
  • 如果你决定回答,就请给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计(workaround),应推荐更好的工具,重新界定问题。
  • 正面的回答问题! 如果这个提问者已经很深入的研究而且也表明已经试过 X 、 Y 、 Z 、 A 、 B 、 C 但没得到结果,回答 试试看 A 或是 B 或者 试试 X 、 Y 、 Z 、 A 、 B 、 C 并附上一个链接一点用都没有。
  • 帮助你的社区从问题中学习。 当回复一个好问题时,问问自己如何修改相关文件或常见问题文件以免再次解答同样的问题?,接着再向文件维护者发一份补丁。
  • 如果你在研究一番后才作出了回答,展现你的技巧而不是直接端出结果。毕竟授人以鱼不如授人以渔。

CV/Resume 简历

推荐一些简历模板给大家简 历模板

容量管理相关

sre 容量模型相关 文章加工而成

容量管理的好处

  • 当前资源使用更高效可靠
  • 比较精准地预测容量成本和进行规划
  • 形成较完善的体系,包含链路追踪,单元和集成测试评估系统等等

容量管理的落实

在进行容量管理的时候需要注意

  • 服务在异常情况下,比如机房断电,服务器挂掉等的时候情况,和这些是否是可以接受的
  • 服务的性能要求是什么(比如峰值qps,最大延迟),服务对应的实际组件组合是什么样的
  • 关注自然增长和非自然增长部分,线性和非线性的部分
  • 了解扩缩容的手段和方法,并且是否可靠
  • 及时进行调查调研,并且观察一个新技术的应用带来的改变,收益,复杂度等等
  • 做好资源预估,算出最大容量,常见的参考参数有

用户向:qps,总用户数,活跃用户,消息条数等

系统向:带宽,cpu,内存,存储,安全成本等

关注资源指标需要注意重点项目,比如网络存储等一旦出现问题,影响巨大的

需要优先保障

一般可以通过机器和机房等满足N+0,N+1, N+2(2个机房挂掉)的容忍度

../images/sre_opacity_demo.png◎ ../images/sre_opacity_demo.png 可以看出来5副本N+2是更经济的一种实现

容量预测相关

容量预测的可能是已经有的产品或者计划上线的产品

对于已经上线的产品,通常我们对机型和qps等有监控,日志等数据,可以配合 业务

很方便计算出一些线性模型

对于未上线的产品,需要在测试阶段,通过配合QA测试调整,尽量摸清和优化这 些组

件和性能关系,方便实际部署

容量预估的步骤
  • 确定所有需要的组件
  • 确定每个组件对应的数量
  • 确定容忍度
  • 确定参考数据来源

参考文档