什么是更好的体系结构来扩展系统?

What would be better architecture out of these, to scale a system?

让我们假设,我运行正在一台机器上安装 nodejs、websocket 服务和 redis 服务运行。我想从规模的角度来分发系统,这两种方法中哪种更好:

  1. 运行 每个服务在不同的机器上。所以两台机器用于负载均衡器后面的Websocket服务,一台机器用于nodejs,三台机器用于Redis。

  2. 将所有服务 运行 保持在同一台机器上,现在将这台机器克隆到其他五台机器上,运行 它们都在负载均衡器后面。

我一直致力于/看到第一个架构。但是一位经验丰富的开发运营人员建议我采用第二种方法,他说这种方法易于管理并且扩展性更好。

此外,这不是特定于 nodejs、redis 等。我提到它们是为了更好地解释。我想知道总体上哪种架构更好。

第二种方法通常更好,特别是如果您可以配置负载平衡器将流量路由到具有处理请求所需的所有数据的节点。这种类型的架构称为 Shared Nothing Architecture,因为不同的节点是完全隔离的,一个节点的故障不会影响另一个节点。这种类型的架构几乎是线性扩展的(不是线性的,因为您仍然需要复制数据以实现高可用性,但如果可能的话也可以异步完成)。

或者,您可以在所有节点中拥有所有数据...但这可能很昂贵,而且复制可能成为一个问题,特别是如果您需要同步复制。

查看此问题的一种方法是通过本书 The Art of Scalability 中提出的 AKF Scalability Cube。它是一个使用立方体来查看可伸缩性的框架,其中 3 个轴中的每一个都代表不同的缩放方式。

x 轴:克隆服务和数据,以便可以轻松地跨实例分配工作。 y 轴:按数据或工作划分工作责任。或者数据和工作的结合。提供故障隔离。 z 轴:基于 requests/customers 的工作分离。能够按地理位置拆分服务

理想的是结合 1 个或多个秤 - 取决于您的需要。随着您的需求增加,您可以开始沿所有 3 个维度进行缩放。这将为您提供几乎无限的规模。