介绍
在决定为您的环境使用哪种服务器架构时,需要考虑许多因素,例如性能、可伸缩性、可用性、可靠性、成本和易于管理。
以下是常用服务器设置的列表,并对每种设置进行了简短描述,包括优缺点。 请记住,此处涵盖的所有概念都可以相互组合使用,并且每个环境都有不同的要求,因此没有单一的正确配置。
1. 一台服务器上的一切
整个环境驻留在单个服务器上。 对于典型的 Web 应用程序,这将包括 Web 服务器、应用程序服务器和数据库服务器。 此设置的一个常见变体是 LAMP 堆栈,它代表单个服务器上的 Linux、Apache、MySQL 和 PHP。
用例:适合快速设置应用程序,因为它是最简单的设置,但它提供的可伸缩性和组件隔离方式很少。
优点:
- 简单的
缺点:
- 应用程序和数据库争用相同的服务器资源(CPU、内存、I/O 等),除了可能的性能不佳之外,还很难确定性能不佳的来源(应用程序或数据库)
- 不容易水平扩展
相关教程:
2. 独立的数据库服务器
数据库管理系统 (DBMS) 可以与环境的其余部分分离,以消除应用程序和数据库之间的资源争用,并通过从 DMZ 或公共 Internet 中删除数据库来提高安全性。
用例:适用于快速设置应用程序,但可以防止应用程序和数据库争夺相同的系统资源。
优点:
- 应用程序层和数据库层不会争用相同的服务器资源(CPU、内存、I/O 等)
- 您可以通过向需要增加容量的任何服务器添加更多资源来单独垂直扩展每一层
- 根据您的设置,它可以通过从 DMZ 中删除您的数据库来提高安全性
缺点:
- 比单个服务器稍微复杂的设置
- 如果两台服务器之间的网络连接具有高延迟(即 服务器在地理位置上相距较远),或者带宽对于正在传输的数据量来说太低
相关教程:
3. 负载均衡器(反向代理)
负载平衡器可以添加到服务器环境中,通过将工作负载分布在多个服务器上来提高性能和可靠性。 如果负载平衡的服务器之一发生故障,其他服务器将处理传入流量,直到故障服务器再次恢复健康。 通过使用第 7 层(应用层)反向代理,它还可用于通过相同的域和端口为多个应用程序提供服务。
能够进行反向代理负载平衡的软件示例:HAProxy、Nginx 和 Varnish。
用例:在需要通过添加更多服务器进行扩展的环境中很有用,也称为水平扩展。
优点:
- 启用水平缩放,即 可以通过添加更多服务器来扩展环境容量
- 可以通过将客户端连接限制在合理的数量和频率来防止 DDOS 攻击
缺点:
- 如果负载均衡器没有足够的资源,或者配置不当,它可能会成为性能瓶颈
- 可能会引入需要额外考虑的复杂性,例如在何处执行 SSL 终止以及如何处理需要粘性会话的应用程序
- 负载均衡器是单点故障; 如果它出现故障,您的整个服务可能会下降。 高可用性 (HA) 设置是没有单点故障的基础架构。 要了解如何实现 HA 设置,您可以阅读 如何使用浮动 IP 的这一部分。
相关教程:
- HAProxy 和负载平衡概念简介
- 如何使用 HAProxy 作为 WordPress 应用程序服务器的第 4 层负载均衡器
- 如何使用 HAProxy 作为 WordPress 和 Nginx 的第 7 层负载均衡器
4. HTTP 加速器(缓存反向代理)
HTTP 加速器或缓存 HTTP 反向代理可用于通过各种技术减少向用户提供内容所需的时间。 HTTP 加速器采用的主要技术是将来自 Web 或应用程序服务器的响应缓存在内存中,因此可以快速处理未来对相同内容的请求,减少与 Web 或应用程序服务器的不必要交互。
能够进行 HTTP 加速的软件示例:Varnish、Squid、Nginx。
用例:在具有大量内容的动态 Web 应用程序或许多常用文件的环境中很有用。
优点:
- 通过缓存和压缩减少 Web 服务器上的 CPU 负载来提高站点性能,从而增加用户容量
- 可用作反向代理负载均衡器
- 一些缓存软件可以防止 DDOS 攻击
缺点:
- 需要调整以获得最佳性能
- 如果缓存命中率低,可能会降低性能
相关教程:
- 如何在 Ubuntu 12.04 上安装 Wordpress、Nginx、PHP 和 Varnish
- 如何使用 Varnish 和 Nginx 配置集群 Web 服务器
- 如何在 Debian 和 Ubuntu 上使用 Apache 为 Drupal 配置 Varnish
5. 主副本数据库复制
与执行多次写入相比,执行多次读取的数据库系统(例如 CMS)提高性能的一种方法是使用主副本数据库复制。 复制需要一个主节点和一个或多个副本节点。 在此设置中,所有更新都发送到主节点,读取可以分布在所有节点上。
用例:有利于提高应用程序数据库层的读取性能。
这是一个主副本复制设置的示例,具有单个副本节点:
优点:
- 通过跨副本分散读取来提高数据库读取性能
- 可以通过将主要用于更新来提高写入性能(它不会花时间服务读取请求)
缺点:
- 访问数据库的应用程序必须有一种机制来确定它应该向哪些数据库节点发送更新和读取请求
- 对副本的更新是异步的,因此它们的内容可能会过期
- 如果主数据库失败,则在问题得到纠正之前无法对数据库执行更新
- 主节点故障时没有内置故障转移
相关教程:
示例:结合概念
除了应用程序服务器之外,还可以对缓存服务器进行负载平衡,并在单个环境中使用数据库复制。 结合这些技术的目的是在不引入太多问题或复杂性的情况下获得每种技术的好处。 以下是服务器环境的示例图:
假设负载均衡器配置为识别静态请求(如图像、css、javascript 等)并将这些请求直接发送到缓存服务器,并将其他请求发送到应用程序服务器。
以下是用户发送请求动态内容时会发生的情况的描述:
- 用户从 http://example.com/(负载均衡器)请求动态内容
- 负载均衡器向应用后端发送请求
- app-backend 从数据库中读取并将请求的内容返回给负载均衡器
- 负载均衡器将请求的数据返回给用户
如果用户请求静态内容:
- 负载均衡器检查缓存后端以查看请求的内容是否已缓存(缓存命中)或未缓存(缓存未命中)
- If cache-hit:将请求的内容返回给负载均衡器,跳转到第7步。 If cache-miss:缓存服务器通过负载均衡器将请求转发到app-backend
- 负载均衡器将请求转发到应用后端
- app-backend 从数据库中读取,然后将请求的内容返回给负载均衡器
- 负载均衡器将响应转发到缓存后端
- cache-backend 缓存内容,然后将其返回给负载均衡器
- 负载均衡器将请求的数据返回给用户
这个环境仍然有两个单点故障(负载平衡器和主数据库服务器),但它提供了上面每个部分中描述的所有其他可靠性和性能优势。
结论
现在您已经熟悉了一些基本的服务器设置,您应该对自己的应用程序使用哪种设置有一个很好的了解。 如果您正在努力改善自己的环境,请记住迭代过程最好避免过快引入太多复杂性。
让我们知道您推荐的任何设置或想在下面的评论中了解更多信息!