解决方案深入探讨:使用MongoDB和ElkStack构建具有Web处理和存储功能的高可用性Web应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

高可用性 Web 应用程序设置为希望消除单点故障并最大限度减少停机时间的开发人员提供了优势。 然而,在这个一般框架内,有许多可能的变化。 开发人员将根据其应用程序的特定需求和性能目标做出选择。

这种高可用性应用程序设置被设计为一种可能提供的假设解决方案:

  • 图像、文档和视频的处理解决方案,专注于存储、检索和连接。
  • 可以扩展、修改或与电子商务解决方案集成的记分、排行榜或采购解决方案。
  • 也可以与电子商务解决方案集成的博客解决方案。

在本文中,我们将介绍此设置的具体功能,并在更一般的层面讨论其组件。 在每个部分的末尾,我们将链接到有关该主题的其他资源,以在您考虑方法和最佳实践时为您提供支持。

第 1 步:使用专用网络创建前端服务器

典型的多层设置将表示层与我们的应用程序逻辑分开。 从长远来看,将应用程序功能分层使故障排除和扩展过程更容易。

在选择服务器和资源时,我们可以考虑以下因素:

  • 我们将对媒体和图像资产进行哪些类型的工作?
  • 我们的计算需求会是什么样子?
  • 我们预计的流量类型和流量是什么?
  • 我们有什么计划对其进行监控?

我们的监控工具将帮助我们扩展我们的应用程序并在此级别和其他级别构建资源。 我们可以采取的另一个节省成本和安全措施的步骤是将我们的应用程序资源(包括我们的前端服务器)分配给共享专用网络。 然后可以在服务器之间传输数据,而不会产生额外的带宽成本或离开单个数据中心。

步骤 2:为前端服务器创建负载均衡器

为了确保我们的应用程序的资源保持高可用性和高性能,我们可以创建负载均衡器来管理我们的前端工作负载。 这些负载平衡器将重定向传入流量,使用定期健康检查和故障转移机制来管理服务器故障或故障。 他们还将更广泛地平衡流量,确保单个服务器不会超载。

为了优化它们的配置,我们可以考虑以下因素:

  • 我们会存储有关请求和用户的状态信息吗?
  • 我们是否需要根据 CPU 负载重定向请求?

这些因素将使我们能够为我们的配置选择最佳算法。 负载均衡器的工作还有一个额外的安全组件:我们可以将它们配置为侦听特定端口并重定向端口之间的流量。 也可以使用它们为我们的后端服务器解密消息。

第 3 步:使用专用网络创建后端服务器

创建我们应用程序的后端涉及另一组资源计算。 同样,我们应用程序工作的性质将决定我们服务器的大小和资源。 需要考虑的因素包括我们的服务器将在此级别执行的处理工作的类型和数量。 这就是数据类型和处理任务之间的区别将发挥作用的地方。 例如,如果我们正在处理图像资产和消费者数据,我们可以考虑负载和延迟要求,因为它们适用于每一个。

在此级别上,监控对于解决以下问题也很重要:

  • 我们对图像和媒体资产进行了哪些处理?
  • 我们是从这些资产中提取信息,还是只是检索或重新组合它们?
  • 我们有什么数量和类型的消费者交易?

我们可以将这个级别的资源放在我们共享的专用网络中,以解决潜在的带宽费用。

第 4 步:安装 HAProxy

与我们的负载均衡器处理外部请求的方式类似,HAProxy 管理我们的前端和应用程序层之间的通信流。 作为负载均衡器,HAProxy 可以配置为监听和重定向来自特定端口的流量。 这可以为我们的应用程序的内部操作增加另一层安全性。 当我们需要扩展时,我们可以配置 HAProxy 自动添加和删除节点。

第 5 步:创建 SQL 数据库

对于我们应用程序数据的某个部分,我们将使用 SQL 数据库。 这适用于需要最新、准确和一致的数据。 诸如销售交易、登录/注销信息和密码更改等结构统一且需要安全的内容为使用 SQL 数据库提供了合理的理由。

同样,我们需要考虑我们的指标:我们正在处理多少事务或安全请求? 如果我们的负载很高,我们可能要考虑使用 ProxySQL 之类的工具来平衡传入的请求。 如果我们在 SQL 数据库之间设置复制,我们可以采取额外的步骤来提高性能并确保高可用性。 如果我们需要扩展我们的数据处理,这也将证明是有用的。

第 6 步:创建 NoSQL 数据库

对于不太统一或示意性的数据,我们可以使用 NoSQL 数据库。 例如,对于图片、视频或博客文章,NoSQL 数据库提供了以非图解方式存储项目元数据的能力。 当使用这种类型的解决方案时,我们的数据将是高度可用的,并且其一致性将是最终的。 在考虑性能时,我们要考虑我们预期对这些数据库的请求的类型和数量。

可以根据请求负载和类型优化性能的因素包括:使用负载平衡解决方案来管理数据库之间的流量,跨数据库和存储解决方案分发数据,以及添加或销毁数据库(而不是复制它们)。

第 7 步:添加块存储

我们的设置将数据库存储功能与应用程序的其他操作分开。 目标是增强数据的安全性和应用程序的整体性能。 作为此隔离过程的另一部分,我们可以为我们的 SQL 数据库文件创建备份解决方案。 块存储解决方案(例如 DigitalOcean 的块存储卷)可以很好地完成这项工作,这要归功于它们的低延迟 I/O 和示意图文件系统结构。 它们还提供了缩放选项,因为它们可以很容易地被破坏、调整大小或成倍增加。

第 8 步:创建 Elastic/ELK 堆栈

监控应用程序的性能将为我们在扩展和优化设置时做出的决策提供信息。 为此,我们可以使用集中式日志记录解决方案,例如 Elastic/ELK 堆栈。 我们的堆栈包括收集和可视化日志的组件: Logstash,处理日志; Elasticsearch,存储它们; 和 Kibana,它允许对它们进行搜索和可视化组织。 如果我们将此堆栈置于浮动 IP 之后,我们将能够使用静态 IP 远程访问它。 此外,如果我们将堆栈包含在我们的共享专用网络中,我们将拥有另一个安全优势:我们的报告代理将不需要通过 Internet 将信息传输到堆栈。

第 9 步:创建对象存储

在存储应用程序的静态资产时,我们希望确保它们的可用性,同时保持高性能。 DigitalOcean Spaces 等对象存储解决方案可以满足这一需求。 具体来说,如果我们决定在数据库中存储大型对象,它们可能会因数据涌入而遇到性能问题,从而使我们的备份非常大。 在这种情况下,我们可以将数据移动到对象存储中。 通过在我们的数据库中存储一个 URL,我们可以从数据库中指向我们的资源,而不会影响其存储容量。 这是我们预计将保持静态的数据的最佳解决方案,并提供了额外的扩展选项。

第 10 步:配置 DNS 记录

一旦我们的高可用性设置到位,我们就可以使用 DNS 将应用程序的域名指向我们的负载均衡器。 使用循环算法,我们可以平衡应用程序分布式资源之间的查询响应。 这将最大限度地提高这些资源的可用性,同时跨资源集群分配工作负载。 此外,我们可以使用地理路由将请求匹配到邻近资源。

第 11 步:规划恢复策略

我们的恢复策略将包括在管理或其他故障的情况下备份和恢复我们的数据的工具和功能。 对于我们的每个 Droplet,我们可以利用和自动化 DigitalOcean 快照,在 DigitalOcean 服务器上复制和存储 Droplet 的图像。 此外,我们可以使用 Percona、Restic 或 Bacula 等专用工具和服务,以及 DigitalOcean Backups 和 Spaces 等存储设备来复制我们的数据。 当我们评估这些工具并制定我们的策略时,我们将考虑应用程序每一层的数据,以及需要多久备份一次,以便我们有一个合理的点来恢复应用程序的功能。

结论

在本文中,我们讨论了高可用性 Web 应用程序的潜在设置,该应用程序依赖于 Droplet、负载均衡器、空间和块存储等基础设施组件来提供高水平的操作性能。 这种设置可以支持图像和其他媒体的处理解决方案,重点是存储和检索,以及可以与电子商务解决方案集成的购买、记分或博客功能。

最终,开发人员可以采取许多方向来满足特定需求和用例,同时保持高可用性,并且每个应用程序设置都会在其架构的特殊性上反映这些差异。