当您的手机更新到新188bet金宝搏官网版本的OkCupid的应用程序,你必须关闭并重新启动应用程序以完成更新。出现这种情况每隔几个星期,当它的时间来更新,你可以选择何时重新启动应用程序。然而,OkCupid后端软件更新每天多次,并将更新不等待你们做好准备188bet金宝搏官网。

试想一下,如果每个人都在世界上不得不停止使用OkCupid应用5分钟,而后端软件更新到新版本。188bet金宝搏官网这将是不可接受的。相反,我们需要后台软件“只是工作所有的时间”。这就是所谓的高可用性

虽然完美的100%的正常运行时间是不现实的实现,我们可以通过解决宕机的几种常见的原因获得相当接近。两个原因计划用于维修和计划外停机的停机时间由于硬件故障。对于这两个原因,解决方案最终被大致相同:

对于高度可用的软件,需要有软件运行的多个冗余实例,如果你需要与他们的一个沟通,需要有采摘的某种方式的情况下,谈的是哪一个。如果你有这些两片,那么你已经得到了你需要解决高可用性的工具。

例如服务架构

188bet金宝搏官网OkCupid的后端是由服务于传入请求,然后发出请求到其他服务的多个服务。下面是什么,这可能看起来像一个ASCII艺术图:

API |______ +  - >消息的服务---------------> / \ |||||+  - >通知服务|DB ||| | +--> doubletake-service | | | | | | | +--> vote-service ------------> | | | | | +--> profile-edit-service ----------> \______/

当收到请求时通过面向公众的API,它的路由到了消息服务doubletake服务, 要么个人资料编辑服务和那些服务中的可能会与其他服务或数据库等进行通信。

当然,我们实际的后端比这要复杂得多,100级多种不同的服务,而不仅仅是5上图中的顺序。这些服务是长期运行的部署在100台左右的机器服务器进程,我们需要达到的一些服务100个实例。

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

天真的方法

让我们的国家我们的目标,所以我们可以选择的解决方案:

  • 我们需要能够做我们的软件维护不中断服务,例如部署一个新的版本。
  • 我们需要能够忍受硬件故障的一定量没有显著中断。让我们用一台机器失去动力突然的一个例子。

简单而有效的方法是运行我们的每一个服务的多台机器上流传的多个实例。它可能是这个样子:

host001 ======================= 2X消息服务1X通知服务4X doubletake服务3X票服务1X轮廓编辑服务host002 ======================= 2X消息服务1X通知服务4X doubletake服务3X票服务1X轮廓编辑服务host003 ======================= 2X消息服务1X通知服务4X doubletake服务3X票服务1X轮廓编辑服务

在硬件故障的情况下,如果host002关闭突然我们还有很多都在其他机器上运行我们的服务的实例。然后,我们的维修使用的情况下,我们只需要一次重新启动我们的服务的一个实例,总是会有一些其他的情况下,在全时间都能服务于交通。

看起来很简单,但是有一个很大的细节,我们没有解决呢。当你想要交谈的服务,你怎么挑哪个实例谈谈?你最好不要挑一个实例是下以任何理由,或服务会出现无法使用。我们需要一种方法来知道在任何时候哪些实例均达到。

188bet金宝搏官网OkCupid有一个名为会员制,做一个体面的工作,解决了这个问题。它的运行,包括有关实例运行的位置信息,每个服务的实例的注册表。当一个实例启动时自行注册,并在停机维护的实例关闭,将注销本身。在意外关闭的情况下,经过实例的注册超时一分钟左右。当你想联系一个服务的一个实例,您将获取完整的注册表,并选择最已知了其中一个实例。

这个制度一直运作得很好了好几年。

还有一个更详细的实施,我们应该包括在这里,这是怎样的服务实际上是在机器上运行。我们用daemontools的启动服务,如果他们崩溃重新启动它们。这也是一直工作得很好了好几年。

目标一个新的水平

供应高有效地几年交通之后,你会得到更多的要求:

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

其中一个成员的不便实现的细节是,每个服务的实例的数量必须预先配置和更改配置是棘手的,所以它的具有挑战性的规模。

当我们增加机器和扩大服务,我们会遇到不同的机器上运行实例的不均匀平衡。也许我们需要增加20个新的实例doubletake服务并添加两款新机。最明显的一点是添加的10个实例doubletake服务到每个两款新机。然后,我们添加更多的新机器和扩大消息服务在同一时间,等等。你最终结束了与服务的分布极不均衡。

当你想要做一台机器上的维护,你会需要停止运行那里的所有实例,但这些实例可能对性能是必要的。有可能是在其他机器上未使用的计算资源,所以你可以将所有的服务实例关闭设备到其它可用的机器。否则,需要重新配置的daemontools运行文件,然后小心地把换下来的旧实例,然后造就了新的问题。请记住,实例的数量是会员预先配置,所以你不能有新的,并在同一时间运行旧的。

这戏法是可行的,但它的错误倾向。的Daemontools没有被设计为在不同的机器重新平衡情况。至于O188bet金宝搏官网kCupid的持续增长,我们需要做这些重新平衡越来越频繁。它的时间去寻找更好的处理这种使用情况。

如何Kubernetes达到我们的目标

而不是着眼于解决具体的问题,比如如何自动移动的daemontools机之间运行的文件,让我们退后一步,并列举了实际的目标。它们不包括的daemontools的任何提及,因为这是一个实现细节,而不是目标。

我们需要做到以下几点不中断服务:

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

我们真的不在乎我们的服务上运行的机器;我们只是需要一个地方让他们运行。无论是最终被其他软件需要知道如何与他们联系。

Kubernetes在设计时就考虑到这些目标。

Kubernetes需要在容器中,通常Docker容器,这使得系统的依赖性问题消失将要部署的软件。我可以写更新glibc的版本,为什么容器这么多更好对付整篇文章,但是,让我们回过头来谈论一下Kubernetes。

像服务doubletake服务被部署到Kubernetes一个配置文件看起来像这样:

类型:服务元数据:名称:doubletake服务规范:端口: - 端口:80类型:负载平衡器---一种:部署元数据:名称:doubletake服务规范:副本:10模板:规格:容器: - 图像:doubletake-服务:V123名称:doubletake服务端口: -  containerPort:80

我已经大大简化这个例子,所以不要在家里尝试这个配置,孩子。

图片:doubletake服务:V123是你如何指定为您服务的可执行代码。在这个例子中doubletake服务:V123将确定一个码头工人形象版本123。我们还宣布,该服务端口上侦听80,而且我们希望这是10实例,或副本,服务运行。

Kubernetes借此规范,使之成为现实。集群中的主机被用于在一个合理的平衡方式来运行的实例。如果有更多的主机添加到集群Kubernetes,它们可用于处理实例没有的作者doubletake服务配置甚至无需成为意识到这一点。如果主机从用于维护集群中移除,则该主机上运行的任何情况下被自动传送到其他主机。如果一台机器的模具,Kubernetes,即不断地监测主机,将检测故障并自动任何实例转移至其他主机。

如果我们想扩展服务向上或向下,只是更改号码副本:10副本:50还是别的,和Kubernetes将启动实例为您服务。

如果我们想部署该服务的新版本,只是改变图片:doubletake服务:V123:V124相反,和Kubernetes将启动新版本的实例,并关闭旧版本的实例。这种操作比缩放情况下向上或向下更复杂,并存在控制它更多的配置选项。

最后一个要求是连接到我们的服务的工作实例的能力等的软件。这是上述的结构的第一个块进入时,服务类型负载平衡器

我们的服务然而,许多副本,我们有,Kubernetes知道他们在哪里,因为Kubernetes把它们放在那里。Kubernetes保持作为名称访问的DNS项doubletake服务解析为工作服务实例之一。客户端不需要获取和管理实例位置的登记;相反,他们只是连接到doubletake服务

下一步是什么

虽然我们远没有放弃我们的老系统,它看起来很有希望的是Kubernetes,虽然不是完美的,需要很多的辛劳和风险,从比例远和提升我们的后端软件。