架构设计(一):从单服务器模式到负载均衡设计
作者:Grey
原文地址:
博客园:架构设计(一):从单服务器模式到负载均衡设计
CSDN:架构设计(一):从单服务器模式到负载均衡设计
单服务器模型是最简单的一种架构,参考如下图
用户访问一个 URL,URL 会先到 DNS 服务器进行域名解析,然后返回给客户端一个 IP 地址,客户端会通过这个 IP 地址访问到真正的服务,服务接收到客户端请求以后,返回对应的 HTML 页面,就完成了整个过程。
当然,以上是静态页面,相对复杂的应用会配置数据库,架构如下
在选择数据库的时候,会涉及数据库选型问题,有两类比较主流的数据库可以选择,即关系型数据库和非关系型数据库。
关系型数据库也被称为关系型数据库管理系统(RDBMS),关系型数据库以表和行来表示和存储数据。其优势是你可以使用 SQL 语句在不同的数据库表中执行连接操作。
非关系型数据库也被称为 NoSQL 数据库。 一般被归纳为四类:键值存储、图形存储、列存储和文档存储。非关系型数据库一般不支持连接操作。
对于大多数开发者来说,关系型数据库是最好的选择,因为它们已经存在了40多年且一直运行良好;然而,如果关系型数据库不适合你的特定用例,
比如
-
应用需要超低的延迟。
-
数据是非结构化的,或者你没有任何关系型数据。
-
只需要对数据进行序列化和反序列化(JSON、XML、YAML等)。
-
需要存储大量的数据
则非关系型数据库可能是正确的选择。
关系型和非关系型数据库的选型可以参考这个网站:DB-Engines Ranking
随着用户数量增多,单服务架构的设计可能会导致一些问题,比如:
用户是直接连接到网络服务器的。如果网络服务器离线,用户将无法访问网站,在另一种情况下,如果许多用户同时访问网络服务器,并达到网络服务器的负载极限,用户一般会遇到较慢的响应或无法连接到服务器。
针对这些问题,有两种主要的思路,分别是:水平扩展和垂直扩展。
垂直扩展,简言之就是在你的服务器上增加更多的配置,比如 CPU、内存 等资源。
水平扩展,简言之就是增加更多的服务实例来扩展的服务能力。
当流量较低时,垂直扩展是一个很好的选择,简单直接。但是垂直扩展也有严重的局限性,因为
-
不可能在一台服务器上增加无限的 CPU 和内存。
-
垂直扩展不具备故障转移和冗余功能。如果一台服务器瘫痪了,整个网站/应用程序就会完全瘫痪。
由于垂直扩展的局限性,水平扩展对于大规模的应用来说是比较理想的。
水平扩展的一个技术就是负载均衡。可以比较好的解决这个问题。架构如下
如图所示,用户直接连接到负载均衡器的公共 IP。在这种设置下,网络服务器已经无法被客户直接访问。为了提高安全性,服务器之间的通信使用了私有 IP。私有 IP 是一个只能在同一网络中的服务器之间到达的 IP 地址;但是,它在互联网上是无法到达的。负载均衡器通过私有 IP 与网络服务器进行通信。
在图中,在添加了一个负载均衡服务器和第二个 Web 服务器后,我们成功地解决了没有故障转移的问题,并提高了Web层的可用性。
-
如果服务器1离线,所有的流量将被路由到服务器2。这可以防止网站脱机。我们还将在服务器池中添加一个新的健康的Web服务器,以平衡负载。
-
如果网站流量迅速增长,而两台服务器不足以处理这些流量,负载均衡器可以优雅地处理这个问题。你只需要向网络服务器池添加更多的服务器,负载平衡器就会自动开始向它们发送请求。
参考资料
System Design Interview