自动化(或其他)快速云部署,亚马逊每11秒发布一次新的软件

您的IT和DevOps团队今天的移动速度有多快?无论答案是什么,可能还不够快。这不仅仅是我的观点 – 全球接受调查的CIO中有近90%认为,无论他们现在发布新产品和服务更新的速度如何,他们都需要在不久的将来更快地将其推出

这引发了全新的担忧:是否已经推出了新的功能和新功能,以至于IT尚未准备好提出有问题的,错误发布的前景?这些CIO中有四分之三的人似乎也这么认为!

当像亚马逊这样的公司每11秒发布一次新的软件更新时,难怪企业会感受到持续的压力,要求他们踩到天然气并将其保留在那里。但要紧跟这种创新速度更快的压力,并以不损害用户体验的方式这样做,需要进行一些内部创新 – 即通过建立持续创新和持续交付的渠道。

持续的管道使IT和DevOps能够更少地关注日常故障排除,更多地关注大图创新。但是,如果不首先投资自动化,你就无法获得这条管道。

自动化性能反馈

为了使企业能够可靠地为其用户群提供持续创新,而不会让客户体验处于风险之中,他们需要实施一种自动化的,以反馈为中心的文化。这需要通过内部和外部来实现。

例如,当开发人员团队正在开发新功能或服务更新时,需要在公司内部和外部对其进行严格测试。这可以通过A / B测试和早期访问beta周期等手段的组合来实现,以征求早期反馈并将其纳入开发周期。通过在开发早期自动建立对新功能的反馈,您可以将可能不会出现的潜在问题扼杀到过程的后期 – 或者因为反馈迟到而导致整体交付延迟(让您落后一步)您的竞争对手的速度有多快?或者因为这些问题根本没有被发现,您的团队最终会推出一个错误的发布版本。通过在整个技术堆栈中自动执行性能和依赖性分析,

构建一个可靠,一致和自动化的基于事实的反馈循环过程,在发布之前彻底测试新的创新,然后利用额外的反馈,以便将来证明更多的版本,有助于创建一个自给自足的持续创新和交付给您的最终用户。

通过信任建立反馈循环

但要达到这一点,完全需要其他东西:信任。希望创建持续交付模型的IT和DevOps团队需要首先在其组织中培养信任文化。这可能是企业在尝试建立连续管道时面临的最大挑战。

信任是双向的。IT团队需要知道他们可以依赖于每个可以按时,按时,按照用户期望和竞争对手设定的标准交付的高质量,具有发布价值的构建。与此同时,在这些团队中工作的人员也需要接受事情失败,特别是在CI / CD模型的初始阶段。而且,我们如何应对这些失败和错误至关重要 – 不是惩罚,而是利用它们作为学习经验,继续进一步改进并确保通过自动补救的交付过程 – 排除这些类型的失败从再次发生。

持续集成和交付不仅仅是软件挑战; 他们也是文化挑战。企业 – 无论是在IT还是整个企业 – 都需要敏锐地意识到他们在创建一个培养开发人员信任的环境中的责任,创建强大的自动化反馈循环,从而产生强大,高质量的功能和创新。

可以保持连续的连续管道

提供更好的软件 – 最终用户所需的各种版本和体验以及竞争对手所提供的 – 需要扩展DevOps以便以云的速度移动。这需要自动化。

自动化的持续交付管道使开发人员能够发布新的创新,通过基于事实的反馈循环周期进行测试,不仅速度更快,更一致,而且可以确保性能问题早期得到解决和修复。转变为连续的管道模型是允许创新以当今企业云环境所需的速度发生的,并确保开发人员能够在流程早期识别和修复潜在问题,以便推出新产品或功能正在满足您和您的用户 – 高标准。

在一天结束时,实际上没有办法解决这个问题:如果企业希望能够满足客户的期望,他们的DevOps团队需要投资建立自动化的连续管道。基于反馈回路基础的连续创新模型,能够自动修复性能问题,并以持续交付的节奏交付,是企业以云速度移动的最佳工具。

容器正在实现安全性和监控功能的融合

当我大约五年前看到集装箱的出现,有一点是明确的:如果-这是一个很大的,如果那时-如果容器成为一个事情,他们会改变企业如何将生产经营他们的应用程序。

快进到今天,这个观察并不是惊天动地。容器的早期采用者已经发现了这种情况(有时很难)。更有趣的是容器和微服务架构从根本上改变了运营方式。我甚至可以说容器正在实现安全性和监控功能的融合,从而加速向DevSecOps的迁移。

但让我们退后一步。

组织正在转向容器,以简化开发并加快创新步伐。2017年Forrester的一项研究发现,在接受调查的组织中,66%的公司实现了加速的开发人员效率,而75%的公司实现了应用程序部署速度的中等至显着增长。

话虽如此,容器对企业来说相对较新。在2018年6月的DockerCon旧金山活动中,Docker指出,在接受调查的参与者中,有50%的人在去年开始使用容器,这表明大多数IT专业人员和DevOps人群仍在学习。当这些新手用容器生产时,我怀疑他们的预生产计划将包括重新考虑监控和安全流程。

我们来讨论一下原因。

容器更易于创建和快速旋转,因为它们通常比虚拟机更小,重量更轻。

95%的容器不到一周就能存活,11%的容器可以存活不到10秒。

但是,创建它们的难易程度,通过持续开发/持续集成(CI / CD)管道快速启动容器的能力,以及使用编排工具来扩展和移动它们意味着容器会被淘汰,经常重生。事实上,去年的一项研究发现,95%的容器不到一周就能存活,11%的容器可以存活不到10秒。这对开发人员来说非常棒 – 更频繁地推动代码,更快地创新,并在竞争中保持领先地位。一切都好,对吗?

没那么快。可以想象,这使跟踪小虫子的工作变得复杂。虽然容器(如果使用得当)可以改善您的安全状况,它们的绝对数量,分布以及容器的黑盒性质会迫使您重新考虑风险和合规性配置文件。将容器设置为机器或虚拟机是不明智的:由于开销,您无法在每个容器中放置代理,并且使用代码注入技术类似于在每个容器中注入病毒。这两种方法都违反了容器的软件设计原则。

在过去,您可以采用以网络为中心的方法,观察进出机器或虚拟机的所有内容,以获得正在发生的事情的“真相”。但考虑到容器的动态特性以及容器跨云移动的能力,旧的以网络为中心的方法不像以前那样工作,既不用于安全也不用于监控。

但什么可以取代网络作为真相的来源?就像容器本身是从嵌入在操作系统中的功能创建的一样,事实证明,监视和保护容器的最佳方法是利用底层系统中的一些原语。

操作系统内核可以是这样的事实:内核从不关于系统上运行的内容或这些应用程序正在做什么。这使您可以查看主机上运行的每个容器内部,让您查看所有应用程序,网络,文件和系统级活动。

因此,当然,除了您可能想要跟踪的通常混合的监控细节之外,如果您有这种类型的仪器,您还可以观察异常的安全行为并观察入侵。容器的性质简单地导致监视和安全功能的自然集成。

当然,你不必这样做,但它变得如此容易,以至于大多数集装箱商店最终会到达那里。

另一方面,全面使用微服务架构的组织别无选择,只能实现这一飞跃。

这就是原因。

微服务架构和支持平台更加复杂,因为它们隔离了功能以增加组件的分离并加速开发。开发人员和服务团队可以更自由地更快,更频繁地启动功能。并且,功能越孤立,通过将微服务组件拼接在一起就可以创建更多的排列。

然而,最终结果是运动部件数量的大量增加,以及这些应用的攻击面的巨大增加。

这是攻击者的梦想成真,也是安全专业人员的噩梦。这就是为什么微服务商店发现必须将监控和安全任务集成到他们的平台中,如果他们还没有这样做的话。

这也是DevSecOps运动如此迅速地获得蒸汽的原因。好消息是,容器环境提供了在开发周期的多个点构建自动安全扫描的机会,这应该意味着容器最终在安全意义上比甚至虚拟机更加强大。

一组强大的开源安全构建块似乎有助于解决这些容器安全问题。Anchore这样的工具解决了扫描和已知漏洞的问题; Falco解决了运行时安全违规和活动审计,并且Inspect解决了取证和事件响应问题。容器安全产品就在那里,而Sysdig等一些产品提供统一的安全性,监控,取证和故障排除,为快速发展的容器环境提供单点控制。

这简化了部署并简化了容器的管理,使组织能够从风险,安全性和合规性角度更快地移动并提高他们提供的服务质量。

根据Gartner的说法

“在应用层,不需要两个单独的工具(一个用于安全,一个用于操作)执行服务的详细监控。至少,数据将在各个团队之间共享,但理想情况下,应用程序性能监视和安全监视将合并到支持单个DevSecOps团队的应用程序监视和性能中。

容器的引入颠覆了许多惯例,并要求IT组织重新思考一切。虽然所有采用容器的组织似乎最终都会在这些环境中集成监控和安全功能,但采用微服务架构的商店别无选择,只能走今天的道路。

您应该学习微服务的十大理由

学习微服务的十大理由

始终关注新技术,语言和框架,以彻底改变您的组织。如果你仍然在你的立方体中粘贴你的整体框架中的代码,那么你可能生活在过去,你有一个小应用程序和很少的员工来处理它。现在情况发生了变化!你需要采取领先一步,并与革命性的技术在那里走路  微服务  是领导人之一。 

想知道微服务在2018年的最热门技术中的地位吗?了解Edureka的技能报告 !!

您是否正在寻找最佳理由来投入时间学习微服务以期成为架构师并使用它们来开发应用程序? 

以下是我学习微服务的十大理由:

  1. 高薪工作
  2. 使用最少的资源,降低拥有成本
  3. 促进最佳大数据实践
  4. 降低风险
  5. 提供粒度缩放
  6. 提供高质量的代码
  7. 提供跨团队协调
  8. 灵活地使用各种工具来完成所需的任务
  9. 提供持续交付
  10. 易于构建和维护应用程序

学习微服务的十大理由| Edureka

现在,让我帮助您更详细地了解这些内容。

10.易于构建和维护应用程序

当开发人员构建的产品变得稳定并且在市场上供客户使用时,开发人员团队主要分为以下活动。

  • 实现新功能
  • 修复错误
  • 更改现有功能

在这种情况下,如果产品基于单一框架,则代码库的每个更改都必须通过构建,维护和部署的所有阶段。

所以在这种情况下,微服务就像一个救世主!

易于构建和维护 - 学习微服务的十大理由 - Edureka

微服务解决了基于组织的问题,使调试和测试应用程序变得容易。在此框架的帮助下,持续交付,测试过程和提供无差错应用程序的能力大大提高。

9.提供持续交付

与专用团队为每个离散功能(如处理数据库,维护服务器端逻辑)工作的单片应用程序不同,微服务使用持续交付模型来处理应用程序的整个生命周期。

开发人员,操作人员,测试团队同时在单个服务上执行诸如构建,测试和调试之类的活动。

持续交付 - 学习微服务的十大理由 - Edureka

这种开发方法使代码能够不断开发,测试和部署。

因此,每次进行更改时都不必重新编写代码,只需从现有库中使用它即可!

8.灵活地使用各种工具完成所需任务

微服务架构鼓励使用最合适的技术来满足服务的特定需求。每项服务都可以自由使用自己的语言,框架或辅助服务。即使使用这种不同的框架,服务仍然可以与应用程序中的其他服务轻松通信。

混合技术 - 学习微服务的十大理由 - Edureka

7.提供跨团队协调

跨团队协调 - 学习微服务的十大理由 - Edureka

传统的面向服务的体系结构(SOA)涉及重量级的进程间通信协议。

但是,微服务,遵循分散化和解耦服务的概念,以便它们作为独立的实体。因此,在微服务架构中,每个团队处理各种实体,然后相互通信以处理不同的功能。

6.提供高质量的代码

遵循微服务的体系结构,完整的框架被模块化为离散组件。这有助于应用程序开发团队一次专注于一项特定的工作。因此,这反过来简化了整个编码和测试过程。

良好的质量准则 - 学习微服务的十大理由 - Edureka

5.提供粒度缩放

如果你谈论可扩展性,那么微服务就会胜过许多其他架构选择。

由于每个服务都是框架中的单独组件,因此您无需扩展整个应用程序即可扩展单个功能或服务。可以在多个服务器上部署关键业务服务,以提高可用性和性能,而不会影响其他服务的性能。

粒度缩放 - 学习微服务的十大理由 - Edureka

因此,微服务可以轻松识别扩展瓶颈,然后在每个微服务级别解决这些瓶颈。

4.降低风险

每个服务都是微服务框架中的一个独立实体,这允许本地化更改,更高的质量信任度和端到端回归方案。

降低风险 - 学习微服务的十大理由 - Edureka

因此,即使应用程序的一个服务或组件出现故障,整个应用程序也不会停止运行。相反,只有特定的服务或组件需要由开发人员重建。 

因此,这可以降低业务应用程序完全崩溃的风险!

3.促进大数据实践

微服务拥有其私有数据库来收集,摄取,处理和交付数据以实现其各自的业务功能。

大数据源 - Edureka因此,您可以说微服务与数据管道架构协作,以协调大数据收集,提取,处理和交付的方式,以微服务的形式处理小任务。

2.使用最少的资源,降低拥有成本

多个团队致力于独立服务,以便轻松部署。这种提高的微服务效率降低了基础架构成本,最大限度地减少了停机时间,优化了资源并使代码可重用。因此,在这些服务的帮助下,您不必在大型机器上运行,但基本机器将为您服务。

通过降低TCO提高投资回报率 - 学习微服务的十大理由 - Edureka

1.高薪工作

据Indeed.com称,“微服务”的平均工资范围从软件工程师每年约97,994美元到高级软件工程师每年116,027美元不等。 不仅在个人层面,而且许多超级增长公司,如Netflix,eBay,PayPal,Twitter,亚马逊在其结构中使用微服务。

我希望我的博客“学习微服务的十大理由”对你来说很重要。 

虽然它仍然处于起步阶段,如果您对这种架构很感兴趣,并且想要进行结构化学习,那么请查看我们的微服务  架构培训  ,该培训包括讲师指导的现场培训和现实生活项目经验。此培训将帮助您深入了解微服务,帮助您掌握主题。

微服务架构 – 学习,构建和部署微服务

微服务架构:

从我之前的博客中,您必须对微服务架构有基本的了解。 但是,作为一名拥有微服务认证专业知识的专业人士,需要的不仅仅是基础知识。 在本博客中,您将深入了解架构概念并使用UBER案例研究来实现它们。

在本博客中,您将了解以下内容:

  • 微服务架构的定义
  • 微服务架构的关键概念
  • 微服务架构的优缺点
  • UBER – 案例研究

您可以参考  什么是微服务,以了解微服务的基本原理和优点。

如果我给你微服务的定义,那将是公平的。

微服务的定义

因此,没有适当定义微服务又称微服务架构,但可以说它是一个由执行不同操作的小型,可单独部署的服务组成的框架。

微服务专注于单个业务域,可以作为完全独立的可部署服务实现,并在不同的技术堆栈上实现它们。

单片架构和微服务之间的差异 - 微服务架构 - Edureka

图1:   单片和微服务架构之间的差异 – 微服务架构

请参阅上图以了解单片和微服务架构之间的区别。为了更好地理解两种架构之间的差异,您可以参考我之前的博客  What Is Microservices

为了让您更好地理解,让我告诉您微服务架构的一些关键概念。

微服务架构的关键概念

在使用微服务开始构建自己的应用程序之前,您需要清楚应用程序的范围和功能。

以下是在讨论微服务时应遵循的一些指导原则。

设计微服务时的指南

  • 作为开发人员,当您决定构建一个单独的域应用程序并明确其功能时。
  • 您设计的每个微服务应仅集中于应用程序的一项服务。
  • 确保您已设计应用程序,使每个服务都可单独部署。
  • 确保微服务之间的通信是通过无状态服务器完成的。
  • 每个服务都可以进一步重构为更小的服务,拥有自己的微服务。

现在,您在设计微服务时已经阅读了基本指南,让我们了解微服务的架构。 

微服务架构如何工作?

典型的微服务架构(MSA)应包含以下组件:

  1. 客户端
  2. 身份提供者
  3. API网关
  4. 消息格式
  5. 数据库
  6. 静态内容
  7.  管理
  8. 服务发现

请参考下图。

微服务架构 - 微服务建筑学 - Edureka

图2:微服务 架构 – 微服务架构

我知道架构看起来有点复杂,但让 为你简化一下。

1.客户

该体系结构从不同类型的客户端开始,从尝试执行各种管理功能的不同设备(如搜索,构建,配置等)开始。

2.身份提供者

然后,来自客户端的这些请求在身份提供者上传递,身份提供者验证客户端的请求并将请求传递给API网关。然后通过定义良好的API网关将请求传递给内部服务。

3. API网关

由于客户端不直接调用服务,因此API网关充当客户端将请求转发到适当微服务的入口点。

使用API网关的优点包括:

  • 所有服务都可以在客户不知情的情况下进行更新。
  • 服务还可以使用非Web友好的消息传递协议。
  • API网关可以执行交叉功能,例如提供安全性,负载平衡等。

在接收到客户端的请求之后,内部体系结构由微服务组成,这些微服务通过消息相互通信以处理客户端请求。

4.消息格式

他们通过两种类型的消息进行通信:

  • 同步消息:  在客户端等待服务响应的情况下,微服务通常倾向于使用REST(Representational State Transfer),因为它依赖于无状态,客户端服务器和HTTP协议使用该协议,因为它是分布式环境,每个功能都用资源来表示以执行操作
  • 异步消息:在客户端不等待服务响应的情况下,微服务通常倾向于使用AMQP,STOMP,MQTT等协议这些协议用于此类通信,因为定义了消息的性质,并且这些消息必须在实现之间可互操作。

您可能会想到的下一个问题是使用微服务的应用程序如何处理他们的数据?

微服务架构培训

5.数据处理

好吧,每个微服务都拥有一个私有数据库来捕获他们的数据并实现相应的业务功能。此外,微服务的数据库仅通过其服务API进行更新。请参考下图:

每个微服务中的数据库表示 - 微服务架构 - Edureka494-02图3:   处理数据的微服务的表示 – 微服务架构

微服务提供的服务被转发到任何支持不同技术堆栈的进程间通信的远程服务。

6.静态内容

在微服务自身通信之后,他们将静态内容部署到基于云的存储服务,该服务可以通过内容交付网络(CDN)将它们直接传递给客户端  

除了上述组件外,还有一些其他组件出现在典型的微服务架构中:

7.管理

该组件负责平衡节点上的服务和识别故障。

8.服务发现

充当微服务的指南,以查找它们之间的通信路由,因为它维护节点所在的服务列表。

订阅我们的YouTube频道以获取新的更新..!

现在,让我们来看看这个架构的优缺点,以便更好地理解何时使用这个架构。

微服务架构的优缺点

请参阅下表。

 

微服务架构的优点 微服务架构的缺点
自由使用不同的技术 增加故障排除挑战
每个微服务都侧重于单一业务能力 由于远程呼叫而增加延迟
支持单个可部署单元 增加了配置和其他操作的工作量
允许频繁的软件发布 难以保持交易安全
确保每项服务的安全性 艰难地跟踪各种服务边界的数据
并行开发和部署多个服务 很难在服务之间移动代码

通过比较UBER以前的架构和现在的架构,让我们更多地了解微服务。

优步案例研究

UBER的先前架构

像许多创业公司一样,UBER开始了它的旅程,采用单一的架构,为单个城市的单一产品而建。当时似乎已经清理了一个代码库,并解决了UBER的核心业务问题。然而,随着UBER开始在全球范围内扩展,他们在可扩展性和持续集成方面严格面临各种问题。

UBER整体建筑学 - 微服务建筑学 - Edureka

  图4:   UBER的整体架构 – 微服务架构

上图描绘了UBER以前的架构。

  • 存在REST API,乘客和驾驶员连接。
  • 三个不同的适配器与其中的API一起使用,以执行诸如计费,付款,发送我们预订出租车时看到的电子邮件/消息等操作。
  • 用于存储所有数据的MySQL数据库。

因此,如果你注意到这里所有的功能,如乘客管理,计费,通知功能,支付,旅行管理和驾驶员管理都是在一个框架内组成的。

问题陈述

当UBER开始在全球范围内扩展时,这种框架引入了各种挑战。以下是一些突出的挑战

  • 必须一次又一次地重新构建,部署和测试所有功能以更新单个功能。
  • 修复错误在单个存储库中变得非常困难,因为开发人员不得不一次又一次地更改代码。
  • 通过在全球范围内引入新功能来同时扩展功能非常难以一起处理。

为了避免这些问题,UBER决定改变其架构,并关注其他超级增长型公司,如亚马逊,Netflix,Twitter和其他许多公司。因此,UBER决定将其单片架构分解为多个代码库,以形成微服务架构。

请参考下图查看UBER的微服务架构。

UBER微服务架构 - 微服务架构 - Edureka

图5:   UBER的微服务架构 – 微服务架构

  • 我们在这里观察到的主要变化是引入了所有驾驶员和乘客所连接的API网关。从API网关,所有内部点都连接起来,例如乘客管理,驾驶员管理,旅行管理等。
  • 这些单元是单独的可部署单元,执行单独的功能。

    • 例如:如果要更改计费微服务中的任何内容,则只需部署计费微服务,而不必部署其他微服务。
  • 所有功能现在都是单独缩放的,即每个功能之间的相互依赖性已被删除。

    • 例如,我们都知道搜索出租车的人数比实际预订出租车和付款的人数要多得多。这使我们得出一个推论,即在客运管理微服务上工作的流程数量超过了支付工作流程的数量。

通过这种方式,UBER将架构从单片机转移到微服务中获益

https://www.edureka.co/blog/microservice-architecture/

监控您无法忽视的指标

随着DevOps运动的兴起,人们开始关注Web应用程序监控工具。这是一件好事。监控Web应用程序(特别是在生产环境中)通常是事后的想法 – 通常在发生一些事件后才会实施。到那个时候,价值已经失去 – 无论是崩溃,性能不佳还是安全漏洞。

拥有强大的监控策略可收集有关Web应用程序运行状况的信息。在解决您的应用程序问题时,将硬信息用作指南会产生奇迹。然而,可能有太多好事。信息太多会导致信息疲劳,这与没有足够的信息一样糟糕。如果您的应用程序中显示的信息太多,那么它最终可能会被调整掉。发生这种情况时,就像没有监控一样。

在本文中,我将讨论一些需要考虑进行监控的最重要指标。此外,我们将介绍用于无缝提供信息的信息呈现方法。让我们开始吧。

选择最重要的指标

如上所述,任何无法采取行动的信息都是您需要消耗的精神体重。充其量,你只会忽略这些信息,最糟糕的是,它会将你的监控变成一个混乱的混乱,并没有提供太多的价值。一个很好的起点是过滤掉信息以显示关键指标,这是否意味着减少信息或建立监控策略。

让我们考虑一些关键指标:

错误处理

有几种方法可以处理应用程序中的监视错误:

  • 使用Raygun的崩溃报告 等工具可以轻松地显示Web应用程序中发生的任何错误。该工具允许使用交钥匙解决方案来确定应用程序中发生的错误,包括频率和确定优先级;
  • 为适当的环境使用内置度量报告。例如,如果您使用Microsoft Azure进行托管,则可以设置指标,以通过电子邮件向您发送有关服务器上可能出现的任何类型的5xx错误的信息。
  • 在您的应用程序中构建错误处理 这通常是最经济和最简单的方法,但很容易失控(同时,确保您的错误处理不会产生自己的错误)。

应用程序性能监控:内部工作

接下来,应用程序性能监视(APM)是应用程序的关键指标。APM工具提供了一种监视应用程序内部工作方式的方法。最有用的功能是确定应用程序中发生的任何瓶颈。应用程序性能管理包含两组主要指标:

  1. 应用程序最终用户所体验的性能。这包括加载时间,请求量等等;
  2. 用于应用程序的计算资源。这允许确定应用程序中的任何硬件瓶颈。

例如,假设性能正在成为您的应用程序的问题,并且用户开始经历缓慢。这些问题可能变得非常模糊,难以发现。与应用程序中发生的错误不同,性能问题更多的是滑动规模。也许它只是慢,因为互联网连接很差?也许用户只会责备自己?由于性能不是绝对的,因此用户的阈值可能会有所不同。

就像错误处理一样,有几种方法可以处理应用程序性能管理:

  • Raygun的APM As APM 这样的开箱即用的工具可以是一项非常大的工作,这是一种简单的方法,可以立即从监控中获得大量价值,而无需太多工作。
  • 手动将性能记录添加到应用程序中。这包括为查询语句添加调试语句,计算时间等。

到目前为止,我们已经指出了两个用于您的应用程序的关键指标。这有助于减少信息疲劳并仅查看最重要的信息,从而使您的Web应用程序保持完美状态。下一步是查看该信息,演示文稿可以在评估Web应用程序的状态时发挥重要作用。

演示:有效地消化信息

与指标一样重要的是,管理监控功能的另一个关键方面是接收信息。理想的交付方法是不需要大量工作来收集所需信息的方法。我有两种方式来考虑这个问题:

  1. 尽快向我提供重要信息。应用程序发生故障或严重错误之类的内容符合此条件;
  2. 获得所有应用程序状态的高级视图。我应该能够快速看到这个并获得应用程序的工作状态,如果需要,可以深入挖掘。

让我们来看看以下每一个:

#1:关键信息警报

正确消化监控信息的第一个方面是收到紧急情况的警报。与涉及优先权的所有事项一样,区分紧急问题和非紧急问题也很重要。信息过载在这里成为一种风险 – 如果您开始收到数百封有关系统错误的电子邮件,那么下一个合乎逻辑的步骤就是过滤掉这些电子邮件。这使你回到以前的状态,没有良好的监控。

有一种简单的方法可以实现有效的警报:

  • 需要立即关注的关键问题是什么?停机时间,安全问题或性能下降超过SLA可以成为优秀候选人;
  • 警报的最佳方式是什么?如果您的团队正在使用Slack,获取Slack通知可能是立即与您联系的最佳方式。也许短信息?电子邮件也是一种选择,尽管将这些警报与其他电子邮件混乱区分开来可能很困难。

重新审视前面提到的Raygun产品,有一系列集成可以使警报方法易于实现。无论您认为哪种方法最适合接收警报,Raygun都应该能够覆盖它。

#2:仪表板

最后,让我们看一下在管理监控功能时消化数据的最后一个方面。仪表板提供了在任何给定时间查看应用程序状态的视觉效果。

让我们来看看Raygun为其Crash Reporting应用程序提供的仪表板:

快速浏览一下,我可以看到如下数据:

  • 当前在应用程序上的实时用户数;
  • 平均加载时间;
  • 最近崩溃的数量。

所有这些都以易于呈现的方式提供了关于应用程序性能的硬数据。如果由于开发工作而提高性能,您将能够以有意义的方式呈现它。

纠缠您的监控能力

现在您已阅读本指南,您应该配备监控的关键信息和接收所述信息的最佳方式。您是否淹没了无法弄清楚如何有效使用的指标?考虑过滤掉您的指标,只使用上面探讨的指标,看看它是否有帮助。

https://thenewstack.io/monitoring-metrics-you-cant-afford-to-ignore/

无线技术比较 蓝牙,WiFi,BLE,Zigbee,Z-Wave,6LoWPAN,NFC,WiFi Direct,GSM,LTE,LoRa,NB-IoT和LTE-M

确定新产品应使用何种类型的无线技术可能是一项艰巨的任务。目前不仅有大量的无线技术可用,而且它也是一个不断推出新技术的移动目标。

为了简化为您的产品选择最佳无线技术的过程,我已根据功能,数据速度和操作范围将各种无线技术组织成一个组。

本文最初发布于PredictableDesigns.com。下载他们的免费备忘单15步骤开发您的新电子硬件产品

根据产品的预期功能,您可以相对简单地立即确定需要考虑的技术组。

例如,如果您需要两个相隔30英尺的设备来传输少量数据,那么使用任何长距离或高速无线技术都没有意义。

话虽如此,我建议您阅读整篇文章,无论您的产品具体需求如何,因为您可以大致了解所有可用的无线技术。

注意:这是一篇冗长,非常详细的文章,所以这里有一个免费的PDF版本,便于阅读和将来参考。您还将获得一个比较各种无线技术的Excel电子表格。

点对点技术

点对点简单地表示两个设备连接在一起以进行直接通信。通常只有两个设备可以参与对等连接。

在下一节中,我将讨论所谓的网状网络技术,它们允许许多设备互相连接。

蓝牙经典

最着名的点对点无线技术是蓝牙将手机连接到蓝牙扬声器时,蓝牙扬声器是手机和扬声器之间的点对点无线连接。

蓝牙主导着点对点流媒体音频应用,例如这款蓝牙耳机。

由于相对较短的工作范围,蓝牙功耗相当低。它比WiFi消耗更少的功率,比蜂窝技术少得多,但仍远远超过蓝牙低功耗或Zigbee等技术。

WiFi Direct

每个人都知道WiFi,但很少有人听说过WiFi Direct即使几乎所有手机和平板电脑都支持它,情况也是如此。与蓝牙一样,但与传统WiFi不同,WiFi Direct是一种点对点无线技术。

您可能已经知道,传统的WiFi设置了一个允许许多设备连接到它的接入点。但是,如果您想在没有接入点开销的情况下将数据直接从一个设备传输到另一个设备,该怎么办?这就是WiFi Direct发挥作用的地方。

WiFi Direct使用与传统WiFi相同的基本技术。它使用相同的频率并提供类似的带宽和速度。但是,它不需要接入点,允许两个设备具有类似于蓝牙的直接连接。

WiFi Direct相对于蓝牙的优势主要是传输速度更快。事实上,WiFi Direct比蓝牙快一百倍。虽然这个速度是有代价的,但价格主要是更高的功耗。

近场通信

近场通信(NFC)与本文中讨论的其他无线技术根本不同。NFC使用在两个线圈之间共享的电磁场进行通信,而所有其他无线技术发射无线电波。

由于NFC通过两个电磁耦合在一起的线圈进行通信,因此工作范围仅为一英寸或两英寸。两个耦合线圈基本上形成具有空气芯的变压器。

NFC最常见的用途是非接触式支付系统。虽然支付数据当然是加密的,但NFC的极短操作范围也有助于消除附近其他人破解交易的可能性。

NFC允许使用无源NFC标签。在这种情况下,被动意味着没有电源。相反,无源标签由NFC读取器设备的电磁场供电。通信和功率传输都发生在两个耦合线圈之间。

无源标签的优点是它们简单,便宜,小巧,并且几乎无限期,因为没有电池。还提供有源标签,其中包括电池。

作为旁注,无线充电,通过将设备放置在充电垫上为设备充电,也可以利用两个耦合线圈之间的相同功率传输现象。

低功耗/短程/低数据网格技术

创建低功耗,低数据网络有四种常用技术:蓝牙低功耗,Zigbee,Z-Wave和6LoWPAN。

如果您的产品是电池供电的,并且需要在短距离内发送相对较少的数据,那么这四种技术中的一种可能是最佳解决方案。

所有这四种技术支持的关键特性称为网状网络,有时也称为多对多网络

网状网络允许多对多通信。

通常,要将数据从设备A发送到设备C,您必须在设备A和设备C之间形成直接链接。对于蓝牙和WiFi Direct等对等技术就是这种情况。

但是通过网状网络,您可以通过设备B将数据从设备A发送到设备C.数据从设备A发送到设备B,设备B然后将数据中继到设备C.这允许您创建庞大的互连设备网络可以覆盖功率极低的大面积区域。

例如,假设您有26个标记为A到Z的设备,这些设备在每个设备之间以一百英尺的距离间隔开。通常情况下,如果您想将数据从设备A一直发送到距离2500英尺远的设备Z,您需要一台功率相当大的发射机。这需要具有大电池的产品。

但是使用网状网络,您可以将数据从设备A中继到设备B,再到设备C等,直到设备Z.没有一台设备必须传输超过一百英尺的数据,因此需要的功率由每个设备都小得多。

网状网络可以打开很多非常有趣的应用程序。

蓝牙低功耗(BLE)

蓝牙低功耗不仅仅是蓝牙经典的低能耗版本。事实上,它的应用程序与普通蓝牙完全不同。

蓝牙LE可能是我帮助开发的产品最常见的无线功能类型。它设计用于在相当不频繁的基础上传输/接收少量数据,同时消耗极低的功率。

BLE有许多应用,但最常见的一种是传输传感器数据。每分钟测量一次温度的传感器设备,或者每10分钟记录并传输其位置的GPS设备就是一些例子。

在许多情况下,蓝牙LE产品仅使用小型纽扣电池供电。如果数据不经常发送,则从纽扣电池运行的BLE设备可能具有一年或更长的电池寿命。

手机和平板电脑广泛支持蓝牙LE,使其成为将产品连接到移动应用的理想解决方案。它还支持高达1Mbps的下降传输速度(经典蓝牙可以达到2-3 Mbps)。

与本节中讨论的所有技术一样,BLE支持网状网络。实际上,它允许最多32,767个设备的网状网络!

除非您有充分的理由选择我在本节中讨论的其他技术(Zigbee,Z-Wave和6LoWPAN),否则我强烈建议您使用蓝牙LE。它是最简单的无线技术,功耗极低,是最受支持的技术。

BLE,Zigbee,Z-Wave和6LoWPAN都是智能家居应用的潜在解决方案。

Zigbee的

Zigbee是另一种短距离网络技术,在许多方面类似于具有类似应用的蓝牙LE。它使用相同的2.4 GHz载波频率,功耗极低,在相似范围内运行,并提供网状网络。

实际上,Zigbee网状网络可以包含多达65,000个设备,这是蓝牙LE可以支持的两倍。但是,我还没有看到推动任何限制的应用程序。

Zigbee主要用于家庭自动化应用,如智能照明,智能恒温器和家庭能源监控。它还常用于工业自动化,智能仪表和安全系统。

Z-波

Z-Wave是一种专有无线技术(由Silicon Labs于2018年收购),主要与家庭自动化市场中的Zigbee和BLE竞争。

与使用流行的2.4 GHz频段的BLE和Zigbee不同,Z-Wave使用的是低于1GHz的频段。如果您希望在全球范围内销售产品,则许多国家/地区的确切频段会有所不同,这可能会导 在美国,Z-Wave工作在908 MHz,而在欧洲,它使用868 MHz。其他国家和地区使用从865 MHz到921 MHz的所有内容。

载波频率较低有两个显着优点:增加范围和减少干扰。较低频率的无线电波进一步传播。BLE和Zigbee使用的2.4 GHz频段也用于WiFi,Bluetooth Classic甚至是微波炉,因此存在很多干扰的可能性。

Z-Wave使用的频段往往不那么拥挤。较低载波频率的缺点是较低的数据传输速度,最终比蓝牙LE慢近10倍。

Z-Wave支持最多232个设备的小型网状网络,这对大多数应用来说已经足够了。

6LoWPAN的

6LoWPAN是一种奇怪命名的技术,它结合了两种不同的首字母缩略词。6指的是Internet协议(IP)版本6,而LoWPAN指的是低功耗无线个人局域网。我知道,这个名字很敏捷。

6LoWPAN基本上是Zigbee的新竞争者。主要区别在于6LoWPAN是基于IP的网络,如WiFi。与Zigbee和Z-Wave一样,6LoWPAN主要用于家庭自动化应用和智能电表。

局域网(LAN)技术

WiFi,甚至可能比蓝牙更多,可能几乎不需要介绍。如果您的产品需要访问互联网,并且将始终在WiFi接入点附近使用,那么WiFi就是答案。由于其适度的覆盖区域,WiFi被称为局域网(LAN)技术。

WiFi快速,便宜,易于实施,具有良好的操作范围,并且可以广泛使用。至少对于移动产品而言,WiFi的最大缺点是功耗。由于功耗较高如果您不需要WiFi提供的性能通常最好使用其他无线技术。

远程蜂窝技术

如果您的产品需要访问云,但它不会始终位于WiFi接入点附近,那么您的产品可能需要蜂窝无线电进行长途通信。

您的产品所需的确切蜂窝技术类型取决于您传输数据的速度,以及产品销售地点的较小程度。

GSM / GPRS

长期以来,GSM(全球移动通信系统)与GPRS(通用分组无线业务)相结合进行数据传输已成为不需要大量数据传输的产品最常用的蜂窝技术。这主要是由于GSM / GPRS硬件的广泛可用性和相对低的硬件成本。

不幸的是,这种情况即将结束。世界上大多数蜂窝运营商都在逐步淘汰GSM,因此他们可以为需要大量数据传输的4G和5G智能手机释放更多带宽。

更不幸的是,至少还没有明显的替代技术。最可能的选择是将硬件从GSM解决方案升级到LTE蜂窝技术,但随之而来的是价格大幅提升。

LTE

LTE是一种4G蜂窝技术,支持比GSM更快的数据速率。如果您的产品需要非常快速的蜂窝数据传输速度,那么LTE可能是最佳选择。

但是,如果您的产品并不真正需要这种级别的数据速度,那么您将支付您根本不需要的硬件。嵌入式GSM模块可以从中国购买,只需几美元,而LTE模块的价格可能超过20美元。LTE的运营商服务成本也将明显高于GSM。

随着物联网(IoT)设备的大量普及这种技术选择的差距变得更加明显。不过,这个差距正在被几种不同的新无线技术所填补,我将在下一节讨论。

低功耗远程技术

如果您需要长距离,低数据通信,就像许多物联网产品一样,那么您的技术选择并不像其他应用那样清晰。这种类型的网络通常被称为LPWAN或低功率广域网。

例如,如果您的产品在远程位置收集天气数据并自动将该数据上传到云,则可能需要LPWAN技术。正如我已经指出的那样,GSM或LTE蜂窝技术都不适合低数据速率应用。

还有其他无线技术可以解决这个问题,包括LoRa,NB-IoT和LTE-M。不幸的是,这些都不是广泛支持的全球标准。这使得许多产品的实施具有挑战性或不可能性,具体取决于它们的销售地点。

LoRa / LoRaWAN

LoRa长距离的缩写)可以在某些区域进行超过6英里的远距离通信,同时消耗很少的电量。它是Semtech在2012年收购的专有无线技术

LoRa根据操作区域使用各种频带。在北美,使用915 MHz,在欧洲,频率为868 MHz。其他区域也可能使用169 MHz和433 MHz。

LoRa指的是底层技术,可以直接用于点对点通信。LoRaWAN是指上层网络协议。

如果您正在寻找低功耗,长距离,点对点的解决方案,那么LoRa是一个很好的选择。您通常可以购买比LoRaWAN模块便宜的LoRa模块。

如果您希望您的产品连接到现有的LoRaWAN网络,则需要包含网络层的更昂贵的LoRaWAN模块。不幸的是,LoRaWAN网络仅在欧洲部分地区提供,而在北美地区则不提供。这严重限制了LoRaWAN对大多数产品的实用性。

尽管LoRa的设计可以在很大范围内运行,但它并不是可以连接到移动网络的蜂窝技术。这使得它更简单,实施起来更便宜,但它的应用程序是有限的。

例如,如果您的产品需要远程访问云,那么您还需要提供LoRa网关设备以连接到Internet。网关设备连接到互联网,并与任何远程LoRa设备通信。

假设在操作范围内没有LoRa网关,LoRa不为任何单个远程设备提供远程访问云的方法。

NB-IT

与LoRa / LoRaWAN不同,NB-IoT是一种蜂窝技术。这意味着它更复杂,实施起来更昂贵,并且消耗更多功率。但是,它提供更高质量的蜂窝连接和直接访问互联网。

NB-IoT仅用于传输非常少量的数据。NB-IoT的最大缺点是可用性有限。目前还没有美国运营商支持它,目前它只在欧洲进行测试。但它有望在2019年的某个时候在美国推出。

这项技术现在可能无法在您的产品中实施,但在未来几年内它将变得更加实用。

LTE-M

如果您的产品需要具有比LoRa或NB-IoT支持的更高数据速率的远程蜂窝接入,那么LTE-M可能是您的最佳选择。

LTE-M是LTE(长期演进)Cat-M1的缩写。该技术适用于需要直接连接到4G移动网络的物联网设备。它是LTE蜂窝技术的一个子集,针对从小型电池运行的低数据速率设备进行了优化。

LTE-M在几个关键方面与标准LTE不同。 首先,实施起来更便宜,因为由于带宽更有限,可以使用更简单的芯片。

其次,它针对降低功耗进行了优化,以免快速耗尽小电池。最后,蜂窝服务成本显着降低,因为您没有使用接近标准LTE所需带宽的任何地方。

结论

选择无线技术的关键是缩小您的要求,以便您可以专注于可行的技术。所需的工作范围,数据传输速度,功耗和成本是选择无线技术的主要标准。

当然,就像工程中的所有事情一样,你不可能拥有一切。例如,大的工作范围需要增加功耗。对于更快的数据速率也是如此。这些标准之间总会有一些让步。从来没有一个完美的解决方案。

如果您正在寻找提供长距离,低功耗,高数据速率和低成本的技术,您将永远找不到真实的解决方案。相反,我建议您优先考虑您的设计标准,并从那里开始缩小您的选择范围。

现代网络负载平衡和代理简介

最近引起我注意的是,缺乏关于现代网络负载平衡和代理的介绍性教育材料。我心想:这怎么可能?负载平衡是构建可靠分布式系统所需的核心概念之一。当然必须有高质量的信息吗?我搜索并发现这些采摘确实很苗条。关于负载平衡代理服务器的维基百科文章包含一些概念的概述,但不是对主题的流畅处理,特别是因为它涉及现代微服务架构。一个谷歌搜索的负载均衡主要是轮番上涨是对细节的流行语和轻重供应商的网页。

在这篇文章中,我试图通过提供对现代网络负载平衡和代理的温和介绍来纠正缺乏信息。坦率地说,这是一个可能成为整本书主题的大型话题。为了保持这篇文章(有点)博客篇幅,我尝试将一组复杂的主题提炼成一个简单的概述; 根据兴趣和反馈,我将在稍后考虑更详细的关于个别主题的后续帖子。

有一些背景知道我为什么写这个 – 我们走了!

什么是网络负载平衡和代理?

Wikipedia 负载平衡定义为:

在计算中,负载平衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器)的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

以上定义适用于计算的所有方面,而不仅仅是网络。操作系统使用负载平衡来跨物理处理器调度任务,容器协调器(如Kubernetes)使用负载平衡来跨计算群集调度任务,网络负载平衡器使用负载平衡来跨可用后端调度网络任务。本文的其余部分仅涵盖网络负载平衡

图1:网络负载平衡概述

图1显示了网络负载平衡的高级概述。一些客户端正在从一些后端请求资源。负载均衡器位于客户端和后端之间,并且在高级别执行几项关键任务:

  • 服务发现:系统中有哪些后端可用?它们的地址是什么(即负载均衡器应该如何与它们通信)?
  • 健康检查:目前哪些后端健康且可以接受请求?
  • 负载平衡:应该使用什么算法来平衡健康后端的各个请求?

在分布式系统中正确使用负载平衡可带来以下好处:

  • 命名抽象:客户端可以通过预定义的机制解决负载均衡器,而不是每个客户端需要了解每个后端(服务发现),然后可以将名称解析行为委托给负载均衡器。预定义机制包括内置库和众所周知的DNS / IP /端口位置,并将在下面更详细地讨论。
  • 容错:通过运行状况检查和各种算法技术,负载均衡器可以有效地路由坏的或过载的后端。这意味着操作员通常可以在休闲时修复坏后端,而不是紧急情况。
  • 成本和性能优势:分布式系统网络很少是同质的。该系统可能跨越多个网络区域和区域。在区域内,网络通常以相对不足的方式构建。在区域之间,超额认购成为常态。(在此上下文中,/ underubscription指的是通过NIC消耗的带宽量占路由器之间可用带宽的百分比)。智能负载平衡可以尽可能地保持区域内的请求流量,从而提高性能(减少延迟)并降低整体系统成本(区域之间所需的带宽和光纤更少)。

负载均衡器与代理

在谈论网络负载平衡器时,术语负载平衡器代理在业内大致可互换使用。这篇文章也将这些条款视为一般等同。(小心并非所有代理都是负载均衡器,但绝大多数代理都将负载均衡作为主要功能)。

有些人可能会争辩说,当负载均衡作为嵌入式客户端库的一部分完成时,负载均衡器实际上并不是代理。但是,我认为区别会给已经令人困惑的话题带来不必要的复杂性。负载平衡器拓扑的类型将在下面详细讨论,但是这篇文章将嵌入式负载均衡器拓扑视为代理的特殊情况; 应用程序通过嵌入式库进行代理,该库提供与应用程序进程之外的负载均衡器相同的抽象。

L4(连接/会话)负载平衡

在讨论当今整个行业的负载平衡时,解决方案通常分为两类:L4L7这些类别涉及OSI模型的第4层第7层由于我在讨论L7负载平衡时会变得明显的原因,我认为这些是我们使用的术语是不幸的。OSI模型是负载平衡解决方案的复杂性的非常差的近似,其包括传统的第4层协议(例如TCP和UDP),但通常最终包括在各种不同OSI层的位和协议。即,如果L4 TCP负载均衡器也支持TLS终端,它现在是L7负载均衡器吗?

图2:TCP L4终端负载平衡

图2显示了传统的L4 TCP负载均衡器。在这种情况下,客户端与负载均衡器建立TCP连接。负载均衡器终止连接(即直接响应SYN),选择后端,并与后端建立新的TCP连接(即发送新的SYN)。该图的细节并不重要,将在下面专门讨论L4负载平衡的部分中详细讨论。

本节的关键点是L4负载均衡器通常仅在L4 TCP / UDP连接/会话级别运行。因此,负载均衡器大致来回抽取字节,并确保来自同一会话的字节在同一后端结束。L4负载均衡器不知道它正在混洗的字节的任何应用程序细节。字节可以是HTTP,Redis,MongoDB或任何其他应用程序协议。

L7(应用程序)负载平衡

L4负载平衡很简单,仍然可以广泛使用。L4负载平衡有哪些缺点需要投资L7(应用程序)负载平衡?以下面的L4特定案例为例:

  • 两个GRPC / HTTP2客户希望,使他们通过L4负载均衡器连接到跟一个后端。
  • L4负载均衡器为每个传入的TCP连接建立单个传出TCP连接,从而产生两个传入和两个传出连接。
  • 但是,客户端A通过其连接每分钟发送1个请求(RPM),而客户端B通过其连接发送每秒50个请求(RPS)。

在上一个场景中,选择处理客户端A的后端将处理大约3000倍的负载,然后选择后端来处理客户端B这是一个大问题,并且通常首先会破坏负载平衡的目的。另请注意,任何多路复用保持活动协议都会出现此问题多路复用意味着通过单个L4连接发送并发应用程序请求,并且保持活动意味着在没有活动请求时不关闭连接)。由于效率原因,所有现代协议都在发展为多路复用和保持活动(创建连接通常很昂贵,尤其是当使用TLS加密连接时),因此L4负载平衡器阻抗不匹配随着时间的推移变得越来越明显。此问题由L7负载平衡器修复。

图3:HTTP / 2 L7终端负载平衡

图3显示了L7 HTTP / 2负载均衡器。在这种情况下,客户端与负载均衡器建立单个HTTP / 2 TCP连接。然后负载平衡器继续进行两个后端连接。当客户端向负载均衡器发送两个HTTP / 2流时,流1被发送到后端1,而流2被发送到后端2.因此,即使多路复用具有非常不同的请求负载的客户端也将在后端有效地平衡。这就是L7负载平衡对于现代协议如此重要的原因。(L7负载平衡由于其检查应用程序流量的能力而产生了大量额外的好处,但这将在下面更详细地介绍)。

L7负载均衡和OSI模型

正如我在上面关于L4负载平衡的部分所述,使用OSI模型来描述负载平衡功能是有问题的。原因是L7,至少如OSI模型所描述的那样,本身包含多个离散的负载平衡抽象层。例如,对于HTTP流量,请考虑以下子层:

  • 可选的传输层安全性(TLS)。请注意,网络人员争论TLS属于哪个OSI层。为了便于讨论,我们将考虑TLS L7。
  • 物理HTTP协议(HTTP / 1或HTTP / 2)。
  • 逻辑HTTP协议(标头,正文数据和预告片)。
  • 消息传递协议(gRPC,REST等)。

复杂的L7负载平衡器可以提供与上述每个子层相关的特征。另一个L7负载均衡器可能只有一小部分功能将其置于L7类别中。简而言之,从功能比较的角度来看,L7负载均衡器的格局要比L4类别复杂得多。(当然,本节刚刚介绍了HTTP; Redis,Kafka,MongoDB等都是受益于L7负载平衡的L7应用协议的例子)。

负载平衡器功能

在本节中,我将简要总结负载平衡器提供的高级功能。并非所有负载平衡器都提供所有功能。

服务发现

服务发现是负载均衡器确定可用后端集的过程。方法多种多样,一些例子包括:

健康检查

运行状况检查是负载均衡器确定后端是否可用于提供流量的过程。健康检查通常分为两类:

  • 活动:负载均衡器以固定间隔(例如,对/healthcheck端点的HTTP请求)向后端发送ping,并使用它来衡量运行状况。
  • 被动:负载均衡器从主数据流中检测健康状态。例如,如果一行中存在三个连接错误,则L4负载均衡器可能会判定后端是不健康的。如果连续存在三个HTTP 503响应代码,则L7负载均衡器可能会判定后端运行状况不佳。

负载均衡

是的,负载平衡器必须实际平衡负载!给定一组健康的后端,如何选择后端来提供连接或请求?负载平衡算法是一个活跃的研究领域,范围从简单的算法,如随机选择和循环,到考虑可变延迟和后端负载的更复杂的算法。鉴于其性能和简单性,最流行的负载平衡算法之一被称为2个最小请求负载平衡的功能

粘性会议

在某些应用程序中,同一会话的请求到达相同的后端非常重要这可能与缓存,临时复杂构造状态等有关。会话的定义各不相同,可能包括HTTP cookie,客户端连接的属性或某些其他属性。许多L7负载均衡器对粘性会话有一些支持。顺便说一句,我会注意到会话粘性本质上是脆弱的(托管会话的后端可能会死),所以在设计依赖它们的系统时要小心。

TLS终止

TLS的主题及其在边缘服务和保护服务到服务通信中的作用值得自己发表。话虽如此,许多L7负载均衡器进行了大量的TLS处理,包括终止,证书验证和固定,使用SNI的证书服务等。

观测

正如我在会谈中所说的那样:“可观察性,可观察性,可观察性。”网络本质上是不可靠的,负载均衡器通常负责导出统计数据,跟踪和日志,帮助运营商找出问题所在,以便他们能够解决问题。负载平衡器的可观察性输出差异很大。最先进的负载平衡器提供丰富的输出,包括数字统计,分布式跟踪和可自定义的日志记录。我要指出,增强的可观察性不是免费的; 负载均衡器必须做额外的工作来生产它。但是,数据的好处大大超过了相对较小的性能影响。

安全和DoS缓解

尤其是在边缘部署拓扑(见下文),负载平衡器通常实现的各种安全功能,包括速率限制,认证和DoS缓解(例如,IP地址标记和识别,缓送等)。

配置和控制平面

需要配置负载平衡器。在大型部署中,这可能成为一项重大任务。通常,配置负载平衡器的系统称为“控制平面”,并且在其实现中变化很大。有关此主题的更多信息,请参阅我在服务网格数据平面与控制平面上的帖子

还有更多

本节刚刚介绍了负载均衡器提供的功能类型。有关L7负载平衡器的部分,请参见其他讨论。

负载均衡器拓扑的类型

现在我已经介绍了负载均衡器的概况,L4和L7负载均衡器之间的差异以及负载均衡器功能的摘要,我将继续讨论部署负载均衡器的各种分布式系统拓扑。(以下每种拓扑适用于L4和L7负载平衡器)。

中间代理

图4:中间代理负载平衡拓扑

图4中所示的中间代理拓扑可能是获得大多数读者负载平衡的最熟悉的方法。此类别包括Cisco,Juniper,F5等硬件设备; 亚马逊的ALB和NLB以及谷歌的云负载均衡器等云软件解决方案和纯软件自托管解决方案,如HAProxyNGINXEnvoy中间代理解决方案的专家是用户简单性。通常,用户通过DNS连接到负载均衡器,无需担心其他任何问题。中间代理解决方案的一个问题是代理(即使是集群)是单点故障以及扩展瓶颈。中间代理通常也是黑盒子,使操作变得困难。客户端是否存在问题?在物理网络中?在中间代理?在后端?这很难说。

边缘代理

图5:边缘代理负载平衡拓扑

边缘代理拓扑如图5所示实际上只是中间代理拓扑的一种变体,可以通过Internet访问负载均衡器。在这种情况下,负载均衡器通常必须提供额外的“API网关”功能,例如TLS终止,速率限制,身份验证和复杂的流量路由。边缘代理的优缺点与中间代理相同。需要注意的是,在面向Internet的大型分布式系统中部署专用边缘代理通常是不可避免的。客户端通常需要使用服务所有者无法控制的任意网络库通过DNS访问系统(使以下部分中描述的嵌入式客户端库或sidecar代理拓扑不能直接在客户端上运行)。另外,

嵌入式客户端库

图6:通过嵌入式客户端库进行负载平衡

为了避免中间代理拓扑中固有的单点故障和扩展问题,更复杂的基础架构已经转向通过库将负载均衡器直接嵌入到服务中,如图6所示图书馆在支持的功能方面差异很大,但这一类中最知名且功能最丰富的一些是FinagleEureka / Ribbon / HystrixgRPC(松散地基于称为Stubby的内部Google系统)。基于库的解决方案的主要优势在于它将负载均衡器的所有功能完全分配给每个客户端,从而消除了先前描述的单点故障和扩展问题。基于库的解决方案的主要目标是,库必须以组织使用的每种语言实现。分布式架构正变得越来越“多语言”(多语言)。在这种环境下,以多种不同语言重新实现极其复杂的网络库的成本可能会变得令人望而却步。最后,在大型服务架构中部署库升级可能会非常痛苦,因此很可能会在生产中同时运行许多不同版本的库,

综上所述,上述图书馆已经成功地为那些能够限制编程语言扩散并克服库升级难度的公司提供了帮助。

边车代理

图7:通过sidecar代理进行负载平衡

嵌入式客户端库负载平衡器拓扑的变体是图7中所示的边车代理拓扑近年来,这种拓扑结构已经被推广为“服务网格”。边车代理背后的想法是,通过跳转到不同的进程而导致轻微的延迟损失,嵌入式库方法的所有好处都可以是没有任何编程语言锁定获得。在撰写本文时最受欢迎的边车代理负载均衡器是EnvoyNGINXHAProxyLinkerd有关边车代理方法的更详细的处理,请参阅我的博客文章介绍Envoy以及我的在服务网格数据平面与控制平面上发布

不同负载均衡器拓扑的总结和优缺点

  • 中间代理拓扑通常是最容易使用的负载平衡拓扑。由于单点故障,缩放限制和黑盒操作,它不足。
  • 边缘代理拓扑类似于中间代理,但通常无法避免。
  • 嵌入式客户端库拓扑提供了最佳性能和可伸缩性,但是需要以每种语言实现库以及跨所有服务升级库的需要。
  • sidecar代理拓扑的性能不如嵌入式客户端库拓扑,但不受任何限制。

总的来说,我认为sidecar代理拓扑(服务网格)正在逐步取代所有其他拓扑以进行服务到服务通信。在流量进入服务网格之前,始终需要边缘代理拓扑。

L4负载平衡的当前技术水平

L4负载平衡器是否仍然相关?

这篇文章已经讨论了L7负载平衡器对于现代协议的优势,并将在下面进一步详细介绍L7负载平衡器功能。这是否意味着L4负载平衡器不再相关?没有!虽然在我看来L7负载平衡器最终将完全取代用于服务到服务通信的 L4负载平衡器,但L4负载平衡器在边缘仍然非常相关因为几乎所有现代大型分布式架构都使用双层L4 / L7负载平衡架构用于互联网流量。在边缘部署中在L7负载平衡器之前放置专用L4负载平衡器的好处是:

  • 由于L7负载平衡器执行应用程序流量的更复杂的分析,转换和路由,因此它们可以处理相对较小部分的原始流量负载(以每秒数据包数和每秒字节数衡量),而不是优化的L4负载均衡器。这一事实通常使L4负载平衡器成为处理某些类型的DoS攻击(例如,SYN泛洪,通用数据包泛洪攻击等)的更好位置。
  • L7负载平衡器往往更积极地开发,更频繁地部署,并且比L4负载平衡器具有更多错误。在L7负载平衡器部署期间,前面有L4负载平衡器可以进行健康检查和排放,这比现代L4负载平衡器使用的部署机制要容易得多,后者通常使用BGP和ECMP(下面有更多内容)。最后,因为L7负载平衡器更容易出现缺陷,纯粹是由于其功能的复杂性,拥有可以绕过故障和异常的L4负载平衡器可以使整个系统更加稳定。

在下面的部分中,我将介绍中/边缘代理L4负载平衡器的几种不同设计。以下设计通常不适用于客户端库和边车代理拓扑。

TCP / UDP终端负载均衡器

图8:L4端接负载平衡器

仍在使用的第一种L4负载平衡器是终端负载平衡器,如图8所示这与我们在上面的L4负载平衡介绍中看到的负载均衡器相同。在这种类型的负载均衡器中,使用两个离散的TCP连接:一个在客户端和负载均衡器之间,一个在负载均衡器和后端之间。

L4终端负载平衡器仍然使用有两个原因:

  1. 它们实施起来相对简单。
  2. 对客户端的近距离(低延迟)连接终止具有重大的性能影响。具体地,如果终端负载平衡器可以靠近使用有损网络(例如,蜂窝网络)的客户端放置,则在数据被移动到可靠光纤传输到其最终位置之前,重传可能更快发生。换句话说,这种类型的负载平衡器可以在用于原始TCP连接终止的存在点(POP)场景中使用。

TCP / UDP直通负载均衡器

图9:L4直通负载平衡器

第二种L4负载平衡器是直通负载平衡器,如图9所示在这种类型的负载均衡器中,负载均衡器不会终止TCP连接而是在连接跟踪和网络地址转换(NAT)发生后,将每个连接的数据包转发到选定的后端首先,让我们定义连接跟踪和NAT:

  • 连接跟踪:是跟踪所有活动TCP连接状态的过程。这包括诸如握手是否已完成,是否已收到FIN,连接已空闲多长时间,已为连接选择了哪个后端等数据。
  • NAT:NAT是使用连接跟踪数据在数据包遍历负载均衡器时更改数据包的IP /端口信息的过程。

使用连接跟踪和NAT,负载均衡器可以通过从客户端到后端的大多数原始TCP流量。例如,假设客户端正在与之通信,1.2.3.4:80并且所选择的后端位于10.0.0.2:9000客户端TCP数据包将到达负载均衡器1.2.3.4:80然后,负载均衡器将交换数据包的目标IP和端口10.0.0.2:9000它还将交换数据包的源IP和负载均衡器的IP地址。因此,当后端响应TCP连接时,数据包将返回负载均衡器,在负载均衡器中发生连接跟踪,NAT可以反向再次发生。

为什么使用这种类型的负载平衡器代替上一节中描述的终端负载平衡器,因为它更复杂?原因如下:

  • 性能和资源使用情况:由于直通负载均衡器不会终止TCP连接,因此它们不需要缓冲任何TCP连接窗口。每个连接存储的状态量非常小,通常通过有效的哈希表查找来访问。因此,直通负载平衡器通常可以处理比终止负载平衡器大得多的活动连接数和每秒数据包数(PPS)。
  • 允许后端执行自定义拥塞控制TCP拥塞控制是Internet上端点限制发送数据以便不会压倒可用带宽和缓冲区的机制。由于直通负载均衡器未终止TCP连接,因此它不参与拥塞控制。这一事实允许后端根据其应用用例使用不同的拥塞控制算法。它还允许更容易地进行拥塞控制变更的实验(例如,最近的BBR推出)。
  • 形成直接服务器返回(DSR)和集群L4负载平衡的基线:更高级的L4负载平衡技术(例如DSR和具有分布式一致性散列的集群)需要直通负载平衡(将在以下各节中讨论)。

直接服务器返回(DSR)

图10:L4直接服务器返回(DSR)

直接服务器返回(DSR)负载均衡器如图10所示DSR建立在上一节中描述的直通负载均衡器之上。DSR是一种优化,其中只有入口/请求数据包遍历负载均衡器。出口/响应数据包在负载均衡器周围直接返回客户端。执行DSR有趣的主要原因是,在许多工作负载中,响应流量使请求流量相形见绌(例如,典型的HTTP请求/响应模式)。假设10%的流量是请求流量,90%的流量是响应流量,如果DSR正在使用1/10的负载均衡器容量可以满足系统的需要。由于历史上负载平衡器非常昂贵,因此这种类型的优化会对系统成本和可靠性产生重大影响(总是更好)。DSR负载平衡器扩展了直通负载均衡器的概念,具体如下:

  • 负载平衡器通常仍执行部分连接跟踪。由于响应数据包不会遍历负载均衡器,因此负载均衡器将不会知道完整的TCP连接状态。但是,负载均衡器可以通过查看客户端数据包和使用各种类型的空闲超时来强烈推断状态。
  • 负载均衡器通常使用通用路由封装(GRE)来封装从负载均衡器发送到后端的IP数据包,而不是NAT 因此,当后端接收封装的数据包时,它可以对其进行解封装并知道客户端的原始IP地址和TCP端口。这允许后端直接响应客户端,而响应数据包不会流经负载均衡器。
  • DSR负载均衡器的一个重要部分是后端参与负载均衡后端需要具有正确配置的GRE隧道,并且根据网络设置的低级细节可能需要其自己的连接跟踪,NAT等。

请注意,在直通负载均衡器和DSR负载均衡器设计中,可以通过负载均衡器和后端设置连接跟踪,NAT,GRE等多种方式。不幸的是,该主题超出了本文的范围。

通过高可用性对实现容错

图11:通过HA对和连接跟踪的L4容错

到目前为止,我们一直在考虑单独设计L4负载平衡器。passthrough和DSR负载均衡器都需要在负载均衡器本身中进行一定量的连接跟踪和状态。如果负载均衡器死了怎么办?如果负载平衡器的单个实例死亡,则将切断遍历负载平衡器的所有连接。根据应用程序的不同,这可能会对应用程序性能产生重大影响。

从历史上看,L4负载平衡器是从典型供应商(Cisco,Juniper,F5等)购买的硬件设备。这些设备非常昂贵并且处理大量流量。为了避免单个负载平衡器故障切断所有连接并导致严重的应用程序中断,负载平衡器通常部署在高可用性对中,如图11所示典型的HA负载平衡器设置具有以下设计:

  • 一对HA边缘路由器服务于一定数量的虚拟IP(VIP)。这些边缘路由器使用边界网关协议(BGP宣告VIP 主边缘路由器的BGP权重高于备份,因此在稳定状态下,它为所有流量提供服务。(BGP是一个极其复杂的协议;出于本文的目的,只考虑BGP一种机制,通过该机制,网络设备宣布它们可用于从其他网络设备获取流量,并且每个链路可以具有优先考虑链路流量的权重)。
  • 类似地,主L4负载均衡器向具有比备份更高的BGP权重的边缘路由器宣告自己,因此在稳定状态下它正在为所有流量服务。
  • 主负载均衡器交叉连接到备份,并共享其所有连接跟踪状态。因此,如果主模块死亡,则备份可以接管处理所有活动连接。
  • 两个边缘路由器和两个负载平衡器都是交叉连接的这意味着如果其中一个边缘路由器或其中一个负载平衡器死亡,或者由于某些其他原因而撤销其BGP通知,则备份可以接管所有流量。

上面的设置是今天仍然有多少高流量的互联网应用程序。但是,上述方法存在很大的缺点:

  • 考虑到容量使用情况,必须在HA负载均衡器对之间正确分片VIP。如果单个VIP增长超过单个HA对的容量,则VIP需要分成多个VIP。
  • 系统的资源使用率很低。50%的容量处于稳定状态。鉴于历史上硬件负载平衡器非常昂贵,这导致大量闲置资本。
  • 现代分布式系统设计比主动/备份提供更好的容错能力。例如,最佳地,系统应该能够遭受多个同时发生的故障并继续运行。如果活动和备份负载平衡器同时死亡,则HA负载平衡器对容易发生完全故障。
  • 供应商提供的专有大型硬件设备非常昂贵,导致供应商锁定。通常希望用使用商用计算服务器构建的水平可扩展软件解决方案来替换这些硬件设备。

通过具有分布式一致性散列的集群进行容错和扩展

图12:通过集群负载平衡器和一致性散列的L4容错和扩展

上一节介绍了通过HA对的L4负载均衡器容错以及该设计中固有的问题。从2000年代早期到中期,大型互联网基础设施开始设计和部署新的大规模并行L4负载平衡系统,如图12所示这些系统的目标是:

  • 减轻上一节中描述的HA对设计的所有缺点。
  • 从供应商的专有硬件负载平衡器转向使用标准计算服务器和NIC构建的商品软件解决方案。

此L4负载平衡器设计最好称为容错和通过群集和分布式一致性散列进行扩展它的工作原理如下:

  • N个边缘路由器以相同的BGP权重宣布所有Anycast VIP。等价多路径路由(ECMP)用于确保通常来自单个流的所有分组到达相同的边缘路由器。流通常是源IP /端口和目标IP /端口的4元组。(简而言之,ECMP是一种使用一致哈希在一组相同加权的网络链路上分发数据包的方法)。虽然边缘路由器本身并不特别关心哪些分组到达那里,但是通常优选的是来自流的所有分组遍历同一组链路,以避免乱序性能降低性能的分组。
  • N L4负载均衡器机器以与边缘路由器相同的BGP权重通告所有VIP。再次使用ECMP,边缘路由器通常会为流选择相同的负载平衡器机器。
  • 每个L4负载均衡器机器通常会执行部分连接跟踪,然后使用一致性散列来选择流的后端。GRE用于封装从负载均衡器发送到后端的数据包。
  • 然后,DSR用于通过边缘路由器将数据包直接从后端发送到客户端。
  • L4负载均衡器使用的实际一致性哈希算法是一个活跃的研究领域。在权衡负载,最小化延迟,最小化后端更改期间的中断
    以及最小化内存开销方面存在权衡对该主题的完整讨论超出了本文的范围。

让我们看看上述设计如何减轻HA对方法的所有缺点:

  • 可根据需要添加新的边缘路由器和负载平衡器。在添加新计算机时,每层都使用一致的哈希来尽可能减少受影响流的数量。
  • 系统的资源使用可以根据需要运行,同时保持足够的突发容限和容错。
  • 边缘路由器和负载平衡器现在都可以使用商用硬件构建,而成本只是传统硬件负载平衡器的一小部分(下面将详细介绍)。

通常被问到这个设计的一个问题是“边缘路由器为什么不通过ECMP直接与后端通信?为什么我们需要负载均衡器?“其原因主要是围绕DoS缓解和后端操作简便性。如果没有负载均衡器,每个后端都必须参与BGP,并且执行滚动部署的难度要大得多。

所有现代L4负载平衡系统都在朝着这种设计(或其某些变体)发展。最着名的两个例子是Google的Maglev亚马逊网络负载均衡器(NLB)目前没有任何OSS负载均衡器可以实现这种设计,但是,我知道有一家公司计划在2018年向OSS发布一个。我对这个版本感到非常兴奋,因为现代L4负载均衡器是一个至关重要的部分在网络空间中缺少OSS。

L7负载平衡的当前技术水平

确实是的。最近几年L7负载均衡器/代理开发出现了复苏。这与分布式系统中对微服务架构的持续推动非常吻合。从根本上说,当更频繁地使用时,固有故障的网络变得更难以有效地操作。此外,自动扩展,容器调度程序等的兴起意味着在静态文件中供应静态IP的日子早已不复存在。系统不仅更多地利用网络,它们变得更加动态,需要负载平衡器中的新功能。在本节中,我将简要总结现代L7负载平衡器中发展最多的领域。

协议支持

现代L7负载平衡器正在为许多不同的协议添加明确的支持。负载均衡器对应用流量的了解越多,它在可观察性输出,高级负载平衡和路由等方面就可以做得越复杂。例如,在撰写本文时,Envoy明确支持L7协议解析和路由。对于HTTP / 1,HTTP2,gRPC,Redis,MongoDB和DynamoDB。未来可能会添加更多协议,包括MySQL和Kafka。

动态配置

如上所述,分布式系统的日益动态的性质需要在创建动态和反应控制系统方面进行并行投资。Istio就是这种系统的一个例子。有关此主题的更多信息,请参阅我在服务网格数据平面与控制平面上的帖子

高级负载平衡

L7负载平衡器现在通常内置支持高级负载平衡功能,如超时,重试,速率限制,断路,阴影,缓冲,基于内容的路由等。

观测

如上面关于一般负载平衡器功能的部分所述,正在部署的越来越动态的系统变得越来越难以调试。强大的协议特定可观察性输出可能是现代L7负载平衡器提供的最重要的功能。现在,任何L7负载平衡解决方案几乎都需要输出数字统计,分布式跟踪和可自定义日志记录。

可扩展性

现代L7负载平衡器的用户通常希望轻松扩展它们以添加自定义功能。这可以通过编写加载到负载均衡器中的可插入过滤器来完成。许多负载平衡器也支持脚本,通常通过Lua

容错

我写了很多关于L4负载均衡器容错的文章。L7负载均衡器容错怎么样?通常,我们将L7负载平衡器视为可消耗和无状态的。使用商用软件可以轻松地水平缩放L7负载平衡器。此外,L7负载平衡器执行的处理和状态跟踪比L4复杂得多。尝试建立L7负载均衡器的HA配对在技术上是可行的,但这将是一项重大任务。

总的来说,在L4和L7负载均衡域中,业界正逐渐从HA配对转向通过一致散列融合的水平可扩展系统。

和更多

L7负载平衡器正在以惊人的速度发展。有关Envoy提供的示例,请参阅Envoy的架构概述

全局负载均衡和集中控制平面

图13:全局负载平衡

负载平衡的未来将越来越多地将各个负载平衡器视为商品设备。在我看来,真正的创新和商业机会都在控制平面内。图13显示了全局负载平衡系统的示例在这个例子中,发生了一些不同的事情:

  • 每个边车代理与三个不同区域(A,B和C)中的后端通信。
  • 如图所示,90%的流量被发送到区域C,而5%的流量被发送到区域A和B.
  • sidecar代理和后端都向全局负载均衡器报告周期性状态。这允许全局负载平衡器做出考虑延迟,成本,负载,当前故障等的决策。
  • 全局负载平衡器周期性地为每个边车代理配置当前路由信息。

全局负载均衡器将越来越能够完成任何单个负载均衡器无法独立完成的复杂事物。例如:

  • 自动检测并绕过区域性故障。
  • 应用全局安全和路由策略。
  • 使用机器学习和神经网络检测和缓解包括DDoS攻击在内的流量异常。
  • 提供集中的UI和可视化,使工程师能够聚合地理解和操作整个分布式系统。

为了实现全局负载平衡,用作数据平面的负载平衡器必须具有复杂的动态配置功能。有关此主题的更多信息,请参阅我在Envoy的通用数据平面API以及服务网格数据平面与控制平面帖子

从硬件到软件的演变

到目前为止,这篇文章仅简要提到了硬件与软件,主要是在历史L4负载均衡器HA对的上下文中。这个领域的行业趋势是什么?

之前的推文是一种幽默的夸张,但仍然总结了很多趋势,它们是:

  • 从历史上看,路由器和负载平衡器已被提供为极其昂贵的专有硬件。
  • 越来越多的大多数专有L3 / L4网络设备正在被商用服务器硬件,商用NIC以及基于IPVSDPDKfd.io等框架构建的专用软件解决方案所取代成本低于5千美元的现代数据中心机器可以使用Linux和使用DPDK编写的自定义用户空间应用程序轻松地使用非常小的数据包使80Gbps网卡饱和。与此同时,能够以惊人的总带宽和数据包速率进行ECMP路由的廉价且基本的路由器/交换机ASIC被打包为商品路由器。
  • 复杂的L7软件负载平衡器,如NGINX,HAProxy和Envoy,也在快速迭代和侵占之前的F5等供应商领域。因此,L7负载平衡器也在积极地转向商用软件解决方案。
  • 与此同时,整个行业向主要云提供商推动IaaS,CaaS和FaaS的转变意味着越来越少的工程师需要了解物理网络的工作原理(这些是“黑魔法“和”我们不再需要知道蹲下的“上面的部分”。

结论和负载平衡的未来

总而言之,这篇文章的主要内容是:

  • 负载平衡器是现代分布式系统中的关键组件。
  • 有两种通用类型的负载平衡器:L4和L7。
  • L4和L7负载平衡器都与现代架构相关。
  • L4负载平衡器正朝着可水平扩展的分布式一致性散列解决方案发展。
  • 由于动态微服务架构的激增,L7负载平衡器最近投入巨资。
  • 全局负载平衡以及控制平面和数据平面之间的分离是负载平衡的未来,并且可以找到大多数未来的创新和商业机会。
  • 该行业正在积极地转向用于网络解决方案的商用OSS硬件和软件。我相信像F5这样的传统负载平衡供应商将首先被OSS软件和云供应商所取代。传统路由器/交换机供应商,如Arista / Cumulus /等。我认为在内部部署方面有更大的发展,但最终也将被公共云供应商和他们自己开发的物理网络取代。

总的来说,我认为这是计算机网络的一个迷人时刻!大多数系统向OSS和软件的转变正在将迭代速度提高几个数量级。此外,随着分布式系统通过“无服务器”范例继续向动态迈进,底层网络和负载平衡系统的复杂性将需要相应增加。

人永远不够用——在复旦大学分享SRE团队组织和管理

从10月底到12月初, 数人云与复旦大学合作开授了面向复旦大学软件工程学院软件工程硕士的《信息系统工程概论(SRE:大规模应用运维实践)》系列选修课程,今天小数为大家带来此次选修课上有关SRE团队建设的精彩分享。

源于Google的SRE有助于解决传统运维模式上的问题,SRE是在运维模式上的全新探索,也是DevOps思想在运维方面的真正实践。SRE代表了一套先进的、完整的运维体系,作为Google最早提出,又经由Google发展完善的一个崭新概念,SRE已成为一个涵盖运维理念、思路、组织架构、和具体实践的完整体系。

SRE团队的建设和管理是SRE体系中重要的部分,今天我们来介绍一下SRE团队组织和管理,其中包括SRE工程师的特点,SRE的团队组织和工作原则,SRE的内部沟通机制,SRE的新人培训,SRE团队学习演练和总结。

SRE是这样一种人

SRE(Site Reliability Engineer)即站点可靠性工程师,是一种和传统系统管理员以及普通软件工程师有所区别的新型职业类型。从这张表里我们可以看到这三类人群从工作内容、关注点、技能特长和思维特征都不尽相同。

关于程序员、系统管理员、SRE在关注事项上的区别我们可以用一个例子来说明。比如图上这是一个标准的三层结构网站,对于这样一个结构的网站,程序员的着眼点是如何处理前端HTTP的request和生成response,如何构建数据库表的结构,通过API来访问数据库以及如何优化SQL语句来提高查询的效率。

系统管理员则关注的是如何承载业务压力,规划容量和保证日常运维工作的顺利开展。这包括服务器和网络的配置是什么,如何配置和对接监控和收集日志,该使用哪种版本的中间件和数据库,防火墙和iptable的设置等等。

而一个SRE人员关注的是什么呢?重点是如何在系统地灵活性和可靠性之间找到一个平衡。比如Web服务器的负载均衡策略是什么;数据库的高可用该选择什么样的方案;如果数据库未来需要扩容,当前方案是否支持;是否要跨地域多中心地部署,相应的流量引导和数据同步问题如何解决,评估系统变化对于可靠性和可扩展性的影响等等。

所以,综上所述可以归纳出SRE应该是这样的人。他们关注问题发生的根本原因,更够通过现象看本质,能够将复杂的问题切分成很多部分,这就是我们常说的决策树。再针对这些拆分的部分提出假设,并进行测试。不断深入不同的分支,直到找到根本的原因。他们能够根据大量信息进行归纳和抽象,以便进行深入的调查。基于现有数据和经验进行判断,拒绝主观的臆断。他们不拘泥于现成的“最佳方案”而是根据实际情况追求各方诉求的动态平衡。不但解决眼前出现的问题,还会预见未来的风险和扩展可能性,从而设计出有长远目标的实施方案。最后他们不默守陈规,勇于拥抱变化,不断打破旧的经验,重复造轮。

SRE的团队组织和工作原则

下面我们来介绍一下Google的团队组织和工作原则。Google在团队组建的时候秉承的是多样化原则。团队组织成员如果过于专业化虽然能够提高成熟度,但是只有多样化才能不断解决新的问题。Google SRE团队中有着包括“技术负责人”(TL)、“SRE经理”(SRM)和“项目经理”(PM/TPM/PGM)等多种角色。

很多时候组织内部是一个动态的环境,各种角色之间可以动态地协商切换责任。一般来说,越动态的团队成员的个人能力越强,每个人都要能写代码,每个人都要具备通用的工程能力。但是动态的团队不得不面临在沟通上需要花费更多时间的问题,因此这就要求团队持续进行沟通用以平衡多样化带来的弊端。

虽然团队的角色是多样化的,但是每一项工作内容要求专业化,明确区分系统性和值班化的工作,每个阶段都必须要有一个单一的目标,确保专注做好每件事情。

SRE的内部沟通机制

Google SRE一般是通过生产会议(production meeting)来进行内部的有效沟通。会议组织者一般由相关的SRE进行轮值,项目经理、所有SRE、开发团队代表、商务等任何和项目相关的成员都会被邀请参加会议。一般这个会议一周一次,一次一个小时左右。会议的议程包括变更预告、SLO review、故障的事后总结、警报紧急评估等相关议题。

SRE的新人培训

如何培养一个合格的SRE,Google也积累了一些内容和方法。这张图内包含了SRE团队可以采用的几个培训新员工的最佳实践,同时保证老员工不会落伍。从下面描述的很多个工具中,我们可以从中选择最适合团队的几个来使用。

这张图中包含两个轴 :

  • X 轴代表了工作类型的范围,从抽象的,一直到具体的工作;
  • Y 轴代表了时间,从上至下,新加入的SRE通常对系统和服务知识了解很少。

阅读之前故障的事后总结对他们很有帮助。新的SRE也可以试图从基本元素出发反向工程整个系统,因为他们本来对系统也没有任何了解。当学员对系统有一定程度的了解,并且已经进行了一些实际操作时,SRE就可以参与见习on-call值班了,同时可以修订文档中不完善或者过时的部分。

阅读上述图表的一些建议 :

  • 正式参加on-call值班是SRE新员工的一个重要里程碑,在这之后,学习过程将基本靠自己主导,是未定义的——所以SRE参与on-call值班之后的培训计划都是用虚线标注的;
  • 三角形的“项目工作”意味着新项目刚开始都很小,随着时间推移复杂程度逐渐增大,所需投入也在增加,很有可能在参与on-call值班之后还会继续;
  • 这里的某些活动是抽象性的,还有些是被动性的。其他的一些活动,则是非常具体和非常具有主动性的,还有一些活动则是混合型的,这样的安排是为了满足不同学习方式的人,让他们都能找到合适自己的活动;
  • 为了使培训效果最优,培训课程应该节奏合理:有些可以立即开始,有些则应该在SRE正式参见on-call之前开始,而其他的则应该是持续性的,同时要求SRE老员工也参与的,在SRE正式参加on-call之前,应该处于持续不断的学习过程中。

SRE的团队学习演练

故障处理分角色演习

当面对一个经验各异、能力各异的SRE团队时,如何能够将所有人紧密结合在一起启发他们互相学习是一个挑战。同时,如何将SRE文化——不断解决问题的文化——传授给新员工,同时保证老员工始终能跟上不断变化的环境和服务发展也是一个挑战。Google的SRE团队通过一个老传统——“故障处理分角色演习”来解决这些问题。这个活动同时也被称为“不幸之轮”(Wheel of misfortune)或者“走木板”(Walk the plank)等。这个活动能很好地帮助全体成员每周共同学习并且富有趣味。具体过程很简单,和桌上RPG游戏类似:“主持人”(GM)选择两个团队成员成为主on-call和副on-call;

这些SRE与GM同时坐在房间的最前面。主持人宣布某个警报发生了,这个on-call团队就需要进行调查和现场处理该报警。

GM事先准备一个故障场景,这个场景可能是某个以前发生过的故障,新成员可能没有经历过,老成员可能已经忘记了。或者该场景是某个新功能或者马上上线的功能的假想故障场景,这样参与的所有人都不知道如何处理。

在接下来的30~60分钟内,主on-call和副on-call要试着寻找问题的根源所在。GM会随着问题的展开而提供更多的信息,例如可能会告知大家某个监控图表的走势等。如果该问题需要向其他团队寻求帮助,GM会假扮成其他团队成员回答问题。

当灾难演习RPG运转成功时,每个人都会从中学到一点东西:可能是一个新工具、新技巧,或者解决问题的另外一个角度,或者(对新员工来说)对成功解决某个问题的认可。也许这项练习可以鼓励团队成员面对下周的挑战,甚至成为接下来某一周的GM。

总结

我们已经讲过构建一个合理的错误预算是非常重要的,极端的可靠性会带来成本的大幅提升,这也包括SRE团队的人力成本。因此对SLO要有一个量化的评估,以确保和人力水平相匹配。要从根源上解决问题就是要减少琐事,将重复性工作自动化,消除运维负载,否则人永远不够用。

http://blog.shurenyun.com/shurenyun-sre-203/

SRE系列教程 | 孙宇聪:来自Google的DevOps理念及实践(下)

上一期孙宇聪老师关于SRE基本概念和核心原理的线上分享一经推出就引起了小伙伴们的热烈关注,看来大家对SRE的相关内容很感兴趣呀。

今天小数继续为大家带来孙老师的第二次线上分享内容,探讨SRE的一些最佳实践和成功标准,希望大家阅读愉快并持续关注我们后续的SRE内容:)

接下来聊一聊SRE的一些最佳实践,我认为Google做得比较好的几点。

SRE的最佳实践

建设平台化服务体系

首先, Google现在是一个六万人的公司,涉及到的产品线可能一百多个,各个部门之间差距很大,而且Google全球几百个数据中心,有很多机器,它如何管理?如果按照国内公司的方式去管理早就累死了。因为国内很多运维部门从上到下什么都管,从买机器开始,一直到最上面安装服务器、调试,配网络,所以业务线、运维部门经常好几千人。Google做得比较好的一点就是它把一个东西横向切分,因为它很早之前就意识到很多部门或者很多人之间有共性?像现在国内有的公司也开始讲的,运维部门要输出能力,公司内部也要服务化,因为只有服务化才能让每个团队更加专业化。

所以回到Google这个平台上,我认为它实际上是不停的在切分,就是横向切分。首先最底下是所谓的资源供给层,就是相当于把数据中心这件事情真的当成了一个资源,可以服于用户。就是用户需要什么样的机器,配置架构怎么样,怎么设计数据中心,这些东西它都帮用户做好。有一个专门的团队去做这件事情,这个团队也有自己的研发,也有自己的运维,也有自己的operation、PM,什么都有。

往上是技术架构,技术架构是大家经常听说的Borg系统等,让一些比较通用的技术或者通用的架构都能形成平台式的东西。

再往上才是产品线,每一层实际上都有自己的SRE部门、运维部门,都是一个项目。所以把这个平台搭起来之后,上层的人可以越来越少关心底下的细节问题,一定程度的减少了他很多精力、减少了很多官僚主义上的问题。需要计算资源的时候就给资源,不是还要先去审批又买机器,什么样的机器,什么样的配置都不一样,所以整个公司是一个非常同质化的公司,很多业务底下共享的东西很多。工作在越底层的人如果能服务的人越多,就会产生一个所谓的放大效应。可能大公司都是这样的,它有平台化效应,底下的人可以搞出一个世界最好的数据中心,可以同时服务几十个产品线的业务;搞出一个更好的数据库,所有人都可以用,这是Google做得比较好的一点。

容量规划和容量管理

然后大家会发现在做一个业务层运维的时候,可以关注更高级的东西,不是关心买什么样机器,而是更多关心到底需要多少容量,这些容量应该在什么地方。在YouTube我们经常在办公室摆一个世界地图,大家经常会讨论这里有一个数据中心,那里有一个数据中心,然后讨论在这边放多少容量,在那边放多少容量,它们之间如何灾备,我们可以考虑这些更高级的、更抽象的东西。这样的好处是可以真正的做到容灾,就是所谓的N+M。就是如果平时需要的峰值流量是N,M是作为灾备流量或者是这个冗余流量。N和M到底是什么?很多公司连自己的N都不知道,从来没有说过我们到底要处理多少流量,有些领导说我们“双11”想来多大量的就来多大量,这怎么能搞好?

这个问题是运维部门独特的功能或者独特的角色,要负责将把这个东西确定下来,我们到底要承担多大的流量,要有多少冗余。接下来就是验证这件事情,到底有没有这样的能力,能不能处理这么大的流量或者这么大的需求? Google有一个内部指标就是130%,比如可以处理1秒交易量是一百万,实际上集群的峰都是按照一百万的130%来处理。130%是负载均衡或者是一些外界波动导致的,它实际上是不平均的。我们可以说它是一百万条交易的负荷,但实际上不可能说一百万零一条这个系统就崩溃了。可以留一下窗口,留一些冗余量来处理一些操作中的未知性,还有一些特殊意外情况,所以130%是一个我们常用的指标。

在Google里面已经很少提灾备这件事情,就是对我们来说我们没有灾备容量,都是平均负载均衡的。可能有一些冗余,比如一个系统只能一千台机器,这一千台机器并不是说我有十台是不接受业务处理的,而是我们所有机器都是接受业务处理,只不过他们处理能力可能没有把所有的资源都用完。这也是Google有很多经验教训,如果一个东西老是不用的话,它就是坏的,你平时再怎么演习、怎么用,一到关键时刻它就过不去、它就是有问题,所以更多的时候压根不讨论灾备的问题,所有东西永远都是在线的,这也是为什么说想把Google.com给弄坏是一件非常困难的事情,得全球几百个数据中心同时出问题,才可能会出现不可用的情况。所以Google全球业务是不可能中断的,不管出现多大的自然灾害,它这个业务都是不可能中断的。可能只有局部地区受损,只有基础设施受损的地方,它才会有一些问题,所以这就是灾备。

实战演习

另外一个更关键的一点是做实战演习。刚才也提到了,SRE以业务小组为单位,每周都会做实战演习,整个公司实际上每年也会做一次非常大的实战演习。我可以举几个例子,Google很多地方都有办公室,有一年某个办公室食堂的菜有问题,导致所有人都拉肚子进了医院。这是Google总部啊,一万人、两万人这样。于是我们就提出这样一个问题,说如果这个地方没有人来上班了,网站到底还能不能正常运行啊?我也曾经问过百度、腾讯,他们所有人都在一个大楼里,如果大楼突然断网了,公司还运转不运转?这是一个很大的问题,不管是地质灾害问题、自然灾害、人文灾害,这些虽然听起来好像比较极端,但确实能考验出一个组织的业务持续能力。实际上这是Google做得比较好的一点。刚才说的都是比较夸张的例子,是比较大范围的。一些比较小的例子,比如这个系统就是你这个小组负责,你们这个小组到底有没有单点故障,这个人是不是能休假,如果一旦出现问题是不是所有人都能去解决这个问题。我们经常互相出题去做这种测试,然后去分享一些知识。我想这更多是一种风气吧。首先你认同这个目标,目标当然就是把这个系统建设得更可靠。认同了这个目标,接下来就是不停地去考验还有哪些漏洞,并确保整个团队其他人也有同样的知识,同样的技能去解决这个问题。

其实说到Google在这一点上,也有所谓的运动式演练。每年1、2月份都会组织一次运动式演练,整个公司所有部门都要参与。在这一个星期的时间里实际上公司是不干什么正经事的,所有人都想出各种各样的方法去测试或者去提高系统的可靠性。

ONCALL的正确姿势

刚才说的这种比较大的所谓实战演习,具体到工作的时候也有几个,就是我们的轮值制度值班。国内小公司都是没有轮值制度的,所有人手机24小时开机,随时打电话,随时得解决问题,一个箭步从被窝里爬出来,赶紧上去解决问题。实际上这跟Google不一样。Google的值班方式更多的是八个人每人值一个星期,值一个星期,剩下的时间你就自己去写程序、做工程研发。但是在这一个星期里,你必须能处理生产上发生的一切问题,这才是真正值班。只有你值班,别人休假了,这才是值班,否则就不叫休假,也不叫值班。所以Google有一个非常明确的规定,Google认为一个事故的正确处理或从发生到解决到事后解决需要六个小时,它认为需要六个小时。运维人员每次值班一般都是值十二个小时的班,大概从早上五点到晚上五点或者是从早上十点到晚上十点。因为它所有的值班都是由两地互相倒的,在美国有一部分,在欧洲有一部分,我们上班的时候我们值班,他们上班的时候他们值班。Google认为其实一天最多只能发生两次事件。不管什么样的系统问题,首先要保证一定要有足够的时间去处理问题。因为如果问题发生太频繁了,就像有些互联网公司,每天一上班这手机就开始“嗡嗡”在桌子上不停的响。一旦有一会儿不响了,就开始担心说这个监控系统到底是是不是坏了。

如果处理太多了,实际上就变成什么呢?两个比较重要的因素,第一个因素是你没有办法好好处理,你处理相当于就是上去敲一个命令,没有时间去想到底这个东西为什么会出现这个问题,以后怎么避免这个问题。所以这个叫(狼来了)效应,你on call的时候已经没有时间去思考了。第二个会发生“狼来了”事件。本来可能是两次完全不一样的事故,但是你上一次处理的时候,你发现重启就行了,下一次你就条件反射,出现这个问题的之后你又去重启了,但它实际上可能是另外一个问题,可能是完全不相关的问题,你重启可能导致这问题更糟糕。所以如果你总是用这种模式处理问题的话必然会出问题,早晚这个灾难会升级。本来是一个很小的问题,结果可能变成一个很大的问题。

运维重要一点是解决线上问题。很多软件工程师做运维会钻牛角尖,这个线上系统出问题了,比如商城里不能购买了,这时候如果钻到这个程序里考虑要这么写还是那么写,实际上是不解决线上的问题。作为运维这个职业或者作为运营这个职业来说,它唯一的目标就是要保证系统的正常。有的时候需要用一些比较low的手段或者是方式。比如在项目初期机器有问题,我们就把它们都停了,然后使用一些新的服务器重新搭起来。事实上也不知道这个东西为什么坏了,就把它放在这儿,先去解决生产上的实际问题。实际上我认为这是运维最大的价值。运维部门目标就是保证业务的持续性。

事后总结

接着是做总结,写一些事后总结。Google的事后总结都是非常专业的,是非常对事不对人的,它会非常详细地列出来在什么时间出现了什么问题,谁去操作的,他执行了什么操作,这个操作到底是解决问题还是没有解决问题,如果没有解决问题的话该怎么去确保不会去执行这个操作。这是一个循环往复的过程,是一个不停锤炼的过程。把解决问题当成一个职业来对待的话,所有事情都很好办了。这回出现这个问题,解决了一遍,然后发现执行了某些地方可能是系统给出错误的信号,可能是文档有问题,把它都一一解决了。下回再执行的时候,可能换了一拨人来执行这个,也能保证不会出现问题。这就是事后总结带来的最大利益。

SLO预估

最后说说SLO。SLO是运维部门的一个关键工具。服务质量实际上是运维部门唯一负责的事情。公司要求员工达到某某指标,那员工怎么去达到这一点?第一,要先帮助制定SLO,要用事实、数据去说明白达到这个服务质量到底需要多少投入、需要多少流程改进、需要多少系统改进。第二,要确保达到这个服务质量不会影响创新速度。这要有一个平衡的取舍,要用数据去说话,一个每天只能down一分钟的系统和一个每天可以down四个小时的系统,它所能承受的更新频率是不一样的,部署的要求和方式肯定都是不一样的,所以要围绕着这个去做,要把这些理念推行到研发部门和产品部门。最后就是把可靠性当成产品的一个重要组成部分,研发也得关心可靠性,他在写代码的时候得知道这个东西一定是要可靠的。把可靠性一直推到产品设计或者是业务层次去,它才能贯彻到底层的研发、运维,才能把它做好。

SRE模型成功的标志

最后就是说到底SRE成功还是不成功,实际上就是看这两条曲线。上面这条线是部署规模,大家都知道互联网的业务都是爆发式增长,它是指数型的。如果说按照常规的那种招聘曲线,直线性的,那么永远赶不上这个规模,所以运维事务必须要把它压下来。Google经常做这种统计,到底我们业务规模扩大之后,扩大了多少工单数量,然后出现了多少事故,造成了多大问题。实际上只有统计这个事情,才能知道你到底做得好不好。当这个系统成熟到一定程度之后,SRE的运维速度是固定的,甚至是越来越少的。只有做到这一点,才相当于把运维这个事情做好,剩下的时间或者剩下的精力才能去接手更多的业务、做更多的技术研发。

我分享的东西也到此结束了,谢谢大家!

SRE系列教程 | 孙宇聪:来自Google的DevOps理念及实践(上)

http://blog.shurenyun.com/shurenyun-sre-189/