什么是现场可靠性工程(SRE)的分布式共识?

109 阅读7分钟

保持你的基础设施的健康需要时间和注意力,但正确地做,这是一个自动化的过程,使你的系统顺利运行。

drawings of people shapes on green background

图片由Opensource.com

在我之前的文章中,我讨论了如何在你的基础设施内执行最佳实践。网站可靠性工程师(SRE)首先要负责可靠性,执行有助于保持运行的政策是至关重要的。

分布式共识

随着微服务、容器和云原生架构的出现,今天几乎所有的应用程序都将成为一个分布式的应用程序。分布式共识是为分布式系统提供动力的一项核心技术。

分布式共识是一种建立可靠的分布式系统的协议。你不能依赖 "心跳"(来自你的硬件或软件的信号,表明它们运行正常),因为网络故障是不可避免的。

谈到分布式系统,有一些固有的问题需要强调。硬件会失败。分布式系统中的节点会随机发生故障。

这是你在设计分布式系统之前必须要做的重要假设之一。网络中断是不可避免的。你不能总是保证100%的网络连接。最后,你需要对分布式系统内的任何节点有一个一致的看法。

根据CAP定理,一个分布式系统不可能同时拥有这三个属性。

  1. 一致性。每个节点上的数据视图是一致的。这意味着你从分布式系统中的2个不同的节点查看时,有可能看不到相同的数据。
  2. 可用性。指的是每个节点上数据的可用性。
  3. 分区容忍度。指对网络故障(导致网络分区)的容忍度。

因此,一个节点需要具备这些品质才能正常运行。

多年来,在分布式共识领域已经开发了几个协议,包括Paxos、Raft和Zab。

例如,Paxos是解决分布式共识问题的原始方案之一。在Paxos算法中,分布式系统中的节点发送一系列具有唯一序列号的提议。当分布式系统中的大多数进程接受该提案时,该提案获胜,发送者就会产生一个提交消息。这里的关键是大多数进程都接受该提议。

提案的严格序列号是它避免数据重复的方法,也是它解决排序问题的方法。

开源的分布式共识

你不必通过编写自己的分布式共识代码来重新发明车轮。现在已经有很多开源的实现,比如最流行的Zookeeper。其他的实现方式有Consuletcd

设计自动缩放

自动缩放是一个过程,通过这个过程,服务器群中的服务器数量会根据负载自动增加或减少。这里使用的术语 "服务器场 "是指分布式系统中的任何服务器池。这些服务器通常位于负载平衡器的后面,如我之前的文章中所述。

自动缩放有许多好处,但以下是4个主要的好处。

  1. 通过只运行所需的服务器来减少成本。例如,当负载相对较低时,你可以自动从池中移除服务器。
  2. 在低流量期间灵活地运行时间敏感性较低的工作负载,这是自动减少服务器数量的另一种变化。
  3. 自动替换不健康的服务器(大多数云计算供应商提供这种功能)。
  4. 增加你的服务的可靠性和正常运行时间。

虽然有许多好处,但自动缩放也有一些固有的问题。

  1. 当你自动扩大你的服务器池时,一个依赖的后端服务器或服务可能会被淹没。你所依赖的服务,例如,你的应用程序所连接的远程服务,可能不知道你的服务的自动缩放活动。
  2. 软件错误可以触发自动缩放器突然扩大服务器群。这是一种危险的情况,可能发生在生产系统中。例如,一个配置错误会导致自动调节器不受控制地启动新实例。
  3. 负载平衡可能没有足够的智能来考虑新的服务器。例如,一个新添加到池中的服务器通常需要一个预热期,然后才能真正从负载均衡器接收流量。当负载均衡器没有完全意识到这种情况时,它可能在新服务器准备好之前就淹没了它。

自动缩放的最佳实践

缩小规模比扩大规模更加敏感和危险。你必须充分测试所有缩减方案。

确保后端系统,如你的数据库、远程网络服务等,或你的应用程序依赖的任何外部系统能够处理增加的负载。你可能会自动添加新的服务器到你的池中,以处理增加的负载,但你的应用程序所依赖的远程服务可能没有意识到这一点。

你必须为服务器的数量配置一个上限。这很重要。你不希望autoscaler不受控制地启动新的实例。

有一个 "死亡开关",你可以用它来轻松地停止自动缩放过程。如果你遇到一个错误或配置错误,导致自动缩放器的行为不正常,你需要一个方法来停止它。

3个系统协同行动,成功实现自动缩放

要成功实施自动缩放,有三个系统需要考虑。

  1. 负载平衡: 负载平衡的一个重要好处是能够通过将流量路由到离用户最近的地方来尽量减少延迟。
  2. 负载削减:为了接受所有传入的请求,你只处理那些你能处理的请求。丢弃多余的流量。负载削减系统的例子是Netflix ZuulEnvoy
  3. 自动缩放:基于负载,你的基础设施自动扩大或缩小规模。

当你设计你的分布式应用时,要考虑到你的应用可能遇到的所有情况。你应该清楚地记录负载平衡、负载削减和自动缩放如何共同处理所有情况。

实施有效的健康检查

负载均衡器的核心工作是将流量导向一组后端服务器。负载均衡器需要知道哪些服务器是活的、健康的,以便它能成功地将流量导向它们。你可以使用健康检查来确定哪些服务器是健康的,可以接收请求。

下面是你需要了解的有效健康检查的内容。

  • 简单。监测后端服务器的可用性。
  • 内容验证。向后端服务器发送一个小请求并检查响应。例如,你可以寻找一个特定的字符串或响应代码。
  • 失败。你的服务器可能是正常的,但监听某个特定pod的应用程序可能是停机的。或者pod可能正在监听,但它可能不接受新的连接。健康检查必须足够智能,以识别有问题的后端服务器。

具有复杂内容验证的健康检查会增加网络流量。在简单的健康检查(例如,简单的ping)和复杂的基于内容的健康检查之间找到平衡。

一般来说,对于一个网络应用,点击网络服务器的主页并寻找适当的HTML响应可以作为一个合理的健康检查。这类检查可以使用curl命令自动进行。

每当你对故障进行事后分析时,审查你的健康检查策略,并确定你的负载平衡器标记服务器上升或下降的速度。这对确定你的健康检查策略非常有用。

保持健康

保持你的基础设施健康需要时间和注意力,但正确的做法是一个自动化的过程,可以保持你的系统顺利运行。SRE的工作还有很多要讨论的,但这些是我下一篇文章的主题。