如果大家有玩过游戏的话,对这个界面应该不陌生。我们团队主要负责腾讯内部游戏营销活动的运维支撑,在线营销活动除了为玩家提升游戏体验以外,也为游戏项目组在拉新、活跃,甚至是购买道具,都提供相关的营销活动、运营事件等商业化的支持。
这是我们的一个技术架构。从这个技术架构里我们可以看出,云原生已经变成一个大趋势了,我们团队95%以上都实现了微服务化。微服务化改变了开发的交付模式,同时也给运维带来了很大的变化,我个人的感受是挑战大于变化。以下6点是我认为现阶段我们面临的最大的挑战:1)微服务调用链错综复杂,难于理解尤其是一些大型活动,需要多个团队协同开发,会涉及到几百个微服务化的相互调用,整个微服务拓扑非常庞大,理解框架的难度加大。2)追踪、指标、日志数据上报标准不一每个团队都自建了不少监控平台或方案,这也是由于一些历史遗留原因导致。3)无法快速定位服务问题以及根因由于多个团队协同研发一个大型营销活动,当问题发生时,需拉通整个项目链条涉及的所有开发与运维团队各自排查,每个团队根据自己构建的指标监控体系逐步定位问题,势必会拉长问题整个的排查、解决的周期。4)很难在上线前发现服务性能瓶颈点问题的发现与处理相对滞后,通常是上线之后才发现服务被打爆,如计算资源不足、存储节点IO过高、调用下游接口延时过大等一系列问题。5)无法判断节点间强弱依赖关系比如A模块访问B模块,当B模块出现异常,给主调方A模块造成了影响,但是无法判断影响面到底有多大?6)新上线业务容量评估无法精准计算业务上线时我们无法判断应该给予多大的服务容量,通常产品运营策划为了稳妥起见报得虚高,导致运营成本也会被同等拉高。
那么应该如何转型,以及转型之后要做什么事情,就是接下来我们要去思考和实践的。我大概在2015~2016年开始接触SRE,也了解到SRE的一些思想和具体的实践,在国内应该算是比较早的一批,2020年我们就完成全部业务上云,在这个阶段我发现SRE的思想与我们面临的困惑很契合,反复琢磨,不少思路确实能够解决我们很多问题,因此确定SRE是我们转型的方向。以下是个人总结未来运维职能演变及转型的路径。随着云原生技术和架构的不断成熟,势必会带动IaaS、PaaS和DevOps的生态圈,往成熟度方向发展。但这几个方向的发展势必会对传统运维,包括系统运维、平台运维和业务运维产生很大的冲击,这三个岗位会被弱化,即使没有被弱化,一定程度上大部分职能也会转嫁给运维外包或业务研发身上。在这样的一个背景之下,我们运维要如何自救?
我这里给出了一个转型的路径,个人判断总共会经历三个阶段:1)第一个阶段:CloudOps(云端运维)云端运维实际上与传统运维没有太大区别,只是把传统运维搬到云上,也负责云端的资产的采购、环境的部署,以及日常的运营跟运维,同时也会关注成本,比如FinOps就是要关注云端的成本。2)第二个阶段:SRE在SRE里会保留两种职能:
提炼中心思想就是云端一切皆可编排,加上我们“三位一体”的可靠性保障体系,这两个方向构成了我们第一期的整体目标。
有了目标之后,我们还需要一些指导的原则,告诉我们应该怎么做。这里我也提炼总结出了8点,我们内部叫SRE 8 准则,今天我会重点把核心三点(蓝色框)提出来讲,其它更多准则说明可以扫描右下角的二维码查看。
这是我们第一期的能力全景图,SRE能力主要集中在中间这层,包括了多级事件编排,MTBF及MTTR这三大块能力,内部我们把它称为“玄图SRE”体系,具体说明:1)事件编排
首先说明最底层部分,我们会定义SRE里面的标准规范、方法与目标,相当于我们在做好上层平台化之前,首先要把整个理论体系的底座梳理清楚,平台化只是将这套理论体系的实例化。中间层的平台化,大家看到的可能是三个独立的平台能力,但我们把它看成一个整体,相当于把这三个能力当成一个能力体系来建设。因为我们在实践的过程中发现,三个不同能力的任意组合都可以延伸出不同的玩法:
接下来我们讲的第一个应用是可观测性,举一个很简单的例子,就是我们运维经常碰到处理故障的一个典型过程。通常我们收到告警,第一步肯定是要去看Dashboard里是哪个曲线和图表出现了明显的异常,然后找出某个时间段异常发生的具体表现,是否有周期性,是哪个指标发生了异常,再切换到下一步链路追踪,分解出这个时间段,某个接口和方法是否延迟拉高了或报错了,通过追踪的方式定位。最后一步则是通过日志分析导致这个函数方法出现异常的根因,定位出来后即可解决这个问题。作为一个普通运维人员,经常按这个套路去定位与解决某个问题,在整个过程当中用到了指标、日志和追踪三个能力,实际上这三个能力就构成了可观测性的三大支柱。
这是我们的可观测性体系技术架构,这个架构可能与其他行业方案存在一定差异,共同点是我们也基于Opentelemetry完成业务端、采集、上报、传输、计算、存储和应用等一系列过程,但是我们会重点聚焦在综合治理,后面也会提到我们会支持很多治理的能力,因为我认为任何一种服务都需要实施治理,缺乏治理则无法很好地使用及发挥它的效能。2)平台能力接下来是我们的一些平台能力,有基础能力,也有我们认为比较满意的一些高级能力。
我们的综合治理分为采样治理和运营治理。①采样治理
4)异常检测
当我们采集大量的数据之后检测出异常点,此时需要定义告警,很多情况下会出现如指标毛刺等带有故障特征但实际上却不是故障的情况,为了减少误告,我们结合AIOps的技术做了一些探索,目前也取得了一定成效,具体的思路如下:我们采集最新几分钟的Trace与Metric的数据,通过训练好的模型去推理异常权重,识别出的异常Trace再通过告警发出,由此可以看出我们的特征模型非常重要,那么如何确保这个模型的准确性?有一个方案可供大家借鉴,我们分为两个阶段来实施:第一阶段是测试阶段,结合压测与混沌能力,在源头做流量压测及混沌实验,我们通过模拟CPU爆满、流量异常或丢包等等已知的故障原子,再结合压测的手段,观察服务表现出来的各类指标数据,这就是我们想要的特征,通过平台自动化给特征打标签,可以释放大量人力参与此类工作。但是再完备的测试环境也无法模拟线上所有问题,比如一些未知的问题我们历史上从未碰到过。所以会在第二阶段(即将上线),我们会去采集现网真实的数据做验证,不断地扩充跟修正特征模型,使模型越来越精准,但是生产环境时则不可避免地需要依赖人工去打标签。
我们采用的是Matrix Profile的算法,在此之前我们也盘点了行业内十几个针对Trace的异常检测算法,从推理速度、准确性和参数调整的变异性等维度进行选型,我们发现Matrix Profile这个算法是最接近我们需求的。Matrix Profile 的值表示子序列间的距离,距离越小的表示序列相似度高,而距离越大表示越异常,异常则对接我们的告警,我们当前这套的准确性能够达到大约83%。
混沌实验不少企业都已经在引入并积极建设,更多是通过模拟真实现网的故障注入,发现服务是否存在异常或弱点,但我个人觉得它的好处不仅限于此,对于SRE而言,它的价值在于一句古话说的:平时多流汗,战时少流血。我们平时模拟了大量的故障案例,在真正面临故障时则能够坦然面对,心里不会慌,包括在预防、发现、响应、定位方面都给我们积累了大量的经验,使我们能够快速处理和解决问题,我认为混沌的意义应该在于此。1)平台架构
这是我们的整体架构,这部分我们跟社区合作的比较多,比如PingCAP的Chaos Mesh,我们也参与了共建,所以很多原子是开放的,平台能力也很成熟,基本上用于做一些能力的封装,比如上面的编排、演练、模板,官方也带了一个简单的管理端,如果要求不高可以直接用。2)平台能力
这是我们的平台能力,分为基础和高级。我们平时做得最多的是红蓝对抗,红蓝对抗就是通过攻防不断验证可靠性是否达到要求,达不到则持续修改迭代,发布过后再进入下一轮攻防,还是比较有趣的,同时可以做一些依赖分析等能力。
我认为服务强弱依赖分析是很有价值的,可以轻松感知如A调B服务,B出现问题对A是否造成影响,我们分为三步来实施:
最后一个是全链路压测,我认为它的意义主要是两点:
这是我们压测的架构,与传统的压测不同在于:传统的压测只是制造压力源,但是当被压服务出现问题时,无法定位具体是哪个接口、方法、调用出现了问题,因为被压服务对于压测平台是一个黑盒子,需要研发自己去定位,这是传统压测面临的问题。我们的方案兼容传统的压测能力,即流量压力的制造,同时结合可观测性能力,将整个拓扑里所有环节中的每一条链路、每个接口、方法和函数出现的性能瓶颈,我们都能够快速定位并告警,开发进一步跟进,从而快速定位出具体的性能瓶颈点,并且具备针对异常做根因下钻分析等能力。2)平台能力
3)服务压测链路拓扑
接下来我想讲全链路压测其中的一个应用,即服务压测链路拓扑。我们在源头施压,平台能够完整地呈现整个观测链路,展示微服务间的调用关系链,同时能够实时计算出每一层微服务黄金指标,即A调用B的耗时、QPS、延迟、放大倍数等都能计算出来。放大倍数能够用于服务上线前的资源评估,比如链路中的某个节点B,它被放大了5倍,那么就可以得知存量是20000核的资源需要做5倍+的扩容,才能满足未来版本上线时的资源需求。
1)立项:我们会组建一个FT的临时团队,团队里有运维、开发、测试、产品等,运维也会参加技术方案的讨论,同时定制可观测性上报的规范。2)开发:开发需要落实运维制定的规范,做好指标埋点的上报,同时SRE会参与技术架构的评审。3)测试:我们会在这个阶段大量地做混沌实验和全链路压测。4)上线:更多关注SLI、SLO等指标和它的错误预算,以及OnCall的机制是否完备,提前准备好故障预案。5)结项:对整个项目从立项到下线整个过程中,做得好的和不足的点进行复盘和总结,沉淀的经验以便复制到下一个项目当中,同时我们会不断完善整个SRE工具链的全景图。很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。
我正在使用Devise在Rails应用程序中,并希望通过API公开一些模型数据,但应该像应用程序一样限制对API的访问。$curlhttp://myapp.com/api/v1/sales/7.json{"error":"Youneedtosigninorsignupbeforecontinuing."}很明显。在这种情况下是否有访问API的最佳实践?我更喜欢一步验证+获取数据,但这只是为了让客户的工作更轻松。他们将使用JQuery在客户端提取数据。感谢您提供任何信息!凡妮莎 最佳答案 我建议您按照以下帖子中的选项2:使用APIke
我正在开发一个Rails2.3.1网站。在整个网站中,我需要一个用于在各种页面(主页、创建帖子页面、帖子列表页面、评论列表页面等)上创建帖子的表单——只要说这个表单需要在由各种Controller)。这些页面中的每一个都显示在相应的Controller/操作中检索到的各种其他信息。例如,主页列出了最新的10篇文章、从数据库中提取的内容等。因此,我已将帖子创建表单移动到它自己的部分中,并将该部分包含在所有必要的页面中。请注意,部分POST中的表单到/questions(路由到PostsController::create——这是默认的Rails行为)。我遇到的问题是当Posts表单没有正
我正在按照我一直在研究的研讨会实现“服务对象”,我正在构建一个redditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化程序中的所有内容。我有这两个选择:选项1:类需要实例化classSubListFromUserdefuser_subscribed_subs(client)@client=client@subreddits=sort_subs_by_name(user_subs_from_reddit)endprivatedefsort_subs_by_name(subreddits)subreddits.sort_by{|sr|sr[:name].downcase}
美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此