当Okcupid应188bet金宝搏官网用程序在手机上更新到新版本时,您必须关闭并重新启动应用程序以完成更新。这每隔几周就会发生一次,并且在更新时,您可以选择何时重新启动应用程序。但是,OkCupid的后端软件每天多次更新,更新不等待您准备就绪。188bet金宝搏官网

想象一下,如果世界上每个人都必须停止使用OKCupid应用程序5分钟,而后端软件更新为新版本。188bet金宝搏官网这是不可接受的。相反,我们需要后端软件“只是一直工作”。这就是所谓的高可用性

虽然完美100%的正常运行时间没有现实实现,但我们可以通过解决几个常见的停机原因而感到非常接近。由于硬件故障,计划停机两种原因是维护和计划计划的停机时间。对于这两种原因,解决方案最终主要是相同的:

对于高度可用的软件,需要有多个软件运行的冗余实例,如果您需要与其中一个通信,则需要有某种方式选择与之交谈的哪一个情况。如果您有这两件,那么您已经需要解决高可用性所需的工具。

示例服务架构

188bet金宝搏官网Okcupid的后端由多个服务组成,该服务提供传入请求,然后对其他服务进行请求。这是一个可能看起来像的ASCII-艺术图:

API |______ +  - >留言服务--------------> / \ |||||+  - >通知服务|DB ||| | +--> doubletake-service | | | | | | | +--> vote-service ------------> | | | | | +--> profile-edit-service ----------> \______/

当请求通过公开的API进入时,它将被路由到留言服务Doubletake服务, 要么配置文件编辑服务这些服务和每个服务都可能与另一个服务或数据库进行通信。

当然,我们的实际后端比这更复杂,大约100个不同的服务,而不是上面如图5所示的5。这些服务是在100左右的计算机上部署的长时间运行服务器进程,我们需要多达100个服务实例。

值得指出的是,后端不仅仅是一个叫做的大型软件backend.exe.;它被分解为多个过程,通过TCP套接字互相通信。当我们想要部署新版本的后端时,我们只需要对实际更改的服务进行维护,例如只是通知服务

天真的方法

让我们说明我们的目标,以便我们选择解决方案:

  • 我们需要能够在我们的软件上进行维护,没有任何服务的中断,例如部署新版本。
  • 我们需要能够忍受某些数量的硬件故障,而无需显着中断。让我们使用一个机器突然失去电力的一个例子。

简单有效的方法是运行多个服务的多个实例,这些服务在多台机器上传播。它可能看起来像这样:

Host001 ======================= 2x消息服务1x通知 - 服务4x Doubletake-service 3x投票 - 服务1x profile-edery service host002 ======================= 2x消息 - 服务1x通知 - 服务4x Doubletake-service 3x投票 - 服务1x Profile-edery-service host003 ======================= 2x消息 - 服务1x通知 - 服务4x DoubleTake-service 3x投票 - 服务1x profile-redio-service

在硬件故障的情况下,如果host002突然关闭我们仍然有足够的实例在其他机器上运行的所有服务。然后为我们的维护用例,我们只需要一次重新启动我们服务的一个实例,并且随时将始终存在其他一些实例来服务流量。

似乎足够简单,但是有一个很大的细节,我们还没有解决。当您想与服务交谈时,你如何选择与哪个例子交谈?您最好不要选择因任何原因而下降的实例,或者服务将出现不可用。我们需要一种方法可以在所有情况下都知道。

188bet金宝搏官网Okcupid具有一个称为成员资格的系统,该系统可以解决这个问题。它是运行的每个服务实例的注册表,其中包含有关实例运行的信息。当实例启动时,它注册本身,并且当实例关闭以进行维护时,它将其自身放松。如果发生意外关闭,则实例的注册超时在一分钟左右后出现。如果要联系服务的实例,则会获取完整的注册表并选择已知已知的一个实例。

这个系统几年来工作得很好。

有一种更多的实现细节,我们应该在此处包含,这是服务在机器上实际运行的方式。我们用daemontools.启动服务并在崩溃时重新启动它们。这也很好地工作了几年。

下一个目标

在多年的高度提供高度服务后,您可以获得更多要求:

  • 我们需要添加更多机器,我们需要扩展要能够处理更多吞吐量的服务数量。
  • 我们需要能够在机器上进行维护,例如升级操作系统,这意味着在机器上运行一小时左右。

成员资格的一个不方便的实现细节是必须预先配置每个服务的实例数,并且更改配置是棘手的,因此规模挑战。

当我们添加机器和扩展服务时,我们可以陷入不同机器上运行的实例的不均匀平衡。也许我们需要增加20个新实例Doubletake服务并添加两台新机器。显而易见的是加入10个实例Doubletake服务在两台新机器中的每一个上。然后我们添加更多新机器并缩放留言服务同时,等等。您最终最终得到了一个非常不均匀的服务分配。

当您想在机器上进行维护时,您将需要停止在那里运行的所有实例,但这些实例可能是性能所必需的。在其他计算机上可能有未使用的计算资源,因此您可以将机器的所有服务实例从其他可用的机器移动到其他可用机器上。这样做需要重新配置daemontools运行文件,然后仔细地带下旧实例,然后培养新实例。请记住,实例数量是在成员身份中预先配置的,因此您不能拥有新的旧版本和旧的。

这个杂耍的行为是可行的,但易于出错。Daemontools不是为不同机器重新平衡的实例而设计的。随着O188bet金宝搏官网kcupid继续增长,我们需要越来越经常进行这些重新平衡。现在是时候寻找更好地处理这种用例。

Kubernetes如何实现我们的目标

而不是专注于解决特定问题,如如何在机器之间自动移动Daemontools运行文件,而让我们退后一步并枚举我们的实际目标。它们不包括任何提及延展伞,因为这是一个实施细节,而不是目标。

我们需要在不扰乱服务的情况下进行以下操作:

  • 部署新版本的软件服务,
  • 重新归类软件服务的实例数量,
  • 添加和删​​除机器,
  • 容忍单机故障,
  • 并为软件提供与给定服务的工作实例连接的方法。

我们真的不在乎我们的服务运行的机器;我们只需要在某个地方运行。无论哪到最终存在,其他软件都需要知道如何联系它们。

Kubernetes思想着设计了这些目标。

Kubernetes要求您的软件部署在容器中,通常是Docker容器,使系统依赖性问题消失。我可以写一篇关于更新Glibc版本的整篇文章,为什么容器是如此更好地处理,但让我们回到谈论Kubernetes。

服务像这样的服务Doubletake服务使用如下所示的配置文件部署到Kubernetes:

类服务:V123名称:DoubLetake-Service端口: -  ContainerPort:80

我很大简化了这个例子,所以不要在家尝试这个配置,孩子们。

图片:DoubLetake-Service:V123是如何为您的服务指定可执行代码。在这个例子中Doubletake-Service:V123会识别Docker图像版本123.。我们还宣布这项服务在港口侦听80,我们希望在那里10.实例或复制品,服务运行。

Kubernetes采用此规范并使其成为现实。群集中的主机以合理的平衡方式使用来运行该实例。如果将更多主机添加到Kubernetes集群中,则可以在没有作者的情况下处理实例Doubletake服务配置甚至需要意识到它。如果从群集中删除主机以进行维护,则任何在该主机上运行的实例都会自动传输到其他主机。如果机器DIES,Kubernetes,即不断监视主机,将检测到失败并自动将任何实例传输到其他主机。

如果我们想要向上或向下缩放服务,只需更改该号码复制品:10复制品:50或其他任何东西,Kubernetes将为您启动实例。

如果我们想部署新版本的服务,只需更改即可图片:DoubLetake-Service:V123:V124相反,Kubernetes将启动新版本的实例并关闭旧版本的实例。此操作比上下或向下扩展实例更复杂,并且有许多可配置的选项用于控制它。

最终要求是对其他软件连接到我们服务的工作实例的能力。这是上面第一块配置块的位置,服务类型LoadBalancer.

然而,我们的服务的许多副本,Kubernetes知道他们在哪里,因为Kubernetes将它们放在那里。Kubernetes维护一个DNS条目,可访问名称Doubletake服务这解决了一个工作服务实例之一。客户端不需要获取和管理实例位置的注册表;相反,他们只是连接到Doubletake服务

下一步是什么

虽然我们远非放弃我们的旧系统,但它看起来很有希望,虽然不完美,但远离缩放和升级我们的后端软件的劳动和风险很大。