可扩展 Web 应用程序的服务器架构
Posted
技术标签:
【中文标题】可扩展 Web 应用程序的服务器架构【英文标题】:Server architecture for a scalable web application 【发布时间】:2013-06-26 01:58:18 【问题描述】:我们正计划使用 Amazon OpsWork 部署一个 Web 应用程序,我只是想与您确认一下我们的架构是否存在任何设计缺陷。
我们有 4 个组件:
-
负载均衡器(最好是亚马逊)
基于Node.js的表达
MongoDB
弹性搜索
这是我们组件的通信图:
前面是一个负载均衡器,它将 http 请求分发到多个 Web 服务器。
Web 服务器是无状态的,因此可以在每次负载需要时进行克隆。所有 Web 服务器实例都是平等的。会话信息保存在 MongoDB 中。
在“后端”中,我们计划使用 MongoDB 和 ElasticSearch 的内置集群功能。因此,每个 Web 服务器实例只连接到一个 MongoDB 和 ElasticSearch 主实例。 MongoDB 和 ElasticSearch 会相应地进行扩展。此外,ElasticSearch master 与 MongoDB master 对话以检索用于构建索引的数据。
我们认为,设置这样一个系统最具挑战性的任务是使用 MongoDB 和 ElasticSearch 集群配置 OpsWorks。
非常感谢!
【问题讨论】:
是否也考虑多区域部署?很好地考虑一下,因为如果您的受众遍布世界各地,那么将复制品扩展到各个地区可能会更好。但是,您需要确保 Web Worker 将访问最近的 MongoDB 副本,而不是物理上可能非常远的主副本。与 ElasticSearch 相同。您的架构的优势在于高负载性能,但来自不同区域的延迟并不是很好。 如果数据允许,可以在每个区域进行设置。因此,您会在不同地区失去性能! 目前我们的客户来自德国,也可能来自欧洲。所以我们现在不考虑多区域部署。 如果您要存储会话数据,我认为将其存储在缓存服务器中可能是一种选择(仍然可以有备用选项从持久存储访问它)。你的设计看起来与我所做的和现在生产的相似:masonzhang.com/2013/07/…。我也有相同的目标来轻松扩展 Web 服务器,并且每个请求都是无状态的。顺便说一句:我也使用 node.js 【参考方案1】:如果我们的架构可能存在任何设计缺陷。
好吧,请记住,我们无法从通用图表中看出太多。但这里有一些注意事项:
1) MongoDB 不像 DynamoDB、Riak 或 Cassandra 等其他数据库那样易于扩展。例如,如果您超过了单个 master 的容量(无论您有多少 slave,所有写入都转到单个 master),您将不得不分片。但是切换到分片非常具有破坏性并且设置起来非常繁琐。
如果您不希望超过一个节点的写入容量,那么您在 MongoDB 上就可以了。
2) 您将如何处理异步任务,例如发送电子邮件、创建长报告等?
可以在请求循环中执行这些操作,这可能是一个很好的入门方法。但是当你有更多的盒子时,失败的机会就会增加。当一个盒子死了,所有的异步任务都会消失,没有人会知道它们是什么。您也可能会遇到一个问题,即一个盒子加载了大量异步任务(使用过多的 CPU 或内存),并且随着它获得更多任务并更慢地完成它们,问题会变得越来越严重。
此外,像 ELB 这样的前端会有 60 秒的限制,如果您的某些请求可能需要更长时间,这可能会导致问题。 (通过轮询或其他方式将它们拆分为异步作业。)
3) ELB 不支持网络套接字。如果您认为将来可能需要 websocket,请考虑一下。
【讨论】:
1) 应用程序中几乎 100% 的数据是由内部进程(它是一种货运跟踪服务)生成的,因此我们预计不会很快超过一个节点的写入容量。 2) 异步任务将由独立于 Web 界面的基于队列的系统处理。我们不应该遇到 ELB 的超时。 3) 这是一个非常好的信息。目前我们取消了 Web 套接字,因为我们遇到了其他问题。感谢您的反馈!【参考方案2】:弹性搜索中没有大师之类的东西。您拥有分片的主副本和分片的副本,但它们基本上是通过弹性搜索在您的集群中移动的。节点可能是一个分片的主节点,而另一个分片的副本。因此,您可以简单地在其前面放置一个负载均衡器。
但是,您可以将节点专门化为数据节点或路由节点,如下所述:http://www.elasticsearch.org/guide/reference/modules/node/
路由节点有效地成为负载平衡器。您可以拥有其中一些(冗余)并在它们之间分配负载。或者,您可以在每个 Web 服务器上运行一个专用的路由器节点。基本上,路由节点非常轻巧,并且您节省了一些带宽/延迟,因为您的 Web 服务器与 localhost 通信,并且从那里它都是弹性搜索内部集群流量。
【讨论】:
【参考方案3】:我建议将 MongoDB 替换为 Amazon Dynamo DB(它有 node.js SDK)。
【讨论】:
在亚马逊上切换到 DynamoDB 的原因是什么?我们也需要 mongo,因为我们必须在不依赖云计算解决方案的情况下支持本地安装。 您能解释一下为什么要替换 mongo 吗?以上是关于可扩展 Web 应用程序的服务器架构的主要内容,如果未能解决你的问题,请参考以下文章