关于高可用性集群如何工作的快速问题。如果我没有记错的话,如果我设置了 3 个高可用性服务器,那么所有流量将仅在单个服务器上处理,对吗?那么如果第一台服务器死机,它会转到第二台服务器吗?或者他们是否有负载平衡器将工作负载平均分配给所有服务器?
答案1
介绍
您可以按自己想要的方式进行设置。
这HAProxy软件可以用作负载平衡器。您还可以使用宁克斯。我建议你不要使用 Apache 进行负载平衡。它设计得不太好。你也可以从大多数云中获取预设的负载平衡器。
负载均衡器
负载平衡器有一个限制:如果该硬件出现故障,即使您背后有一套强大的系统,也将毫无用处。
因此,在大多数情况下,如果您想确保始终可用,则至少需要两个负载均衡器。
我正在创建一个名为Snap! 网站最终将自动平衡所有前端的负载(即将纳入负载平衡器)。它尚未实现,但其理念是,请求到达任何计算机,如果计算机已经超载,它将把请求转发给另一台前端计算机。这里的巨大优势是,在您失去所有服务之前,所有前端都必须死机。
后端
通过设置负载平衡器,其他计算机(实际运行您的服务的计算机)可以设置为后端。这样做的一个优点是您可以获得更好的安全性(即前端和后端之间只开放端口 80/443)。
没有任何负载平衡器,服务在前端运行,这意味着在前端打开的所有端口都会给黑客提供攻击您系统的机会。
3 台计算机,没有负载均衡器,这是如何工作的?
由于您的网站将有一个 URL,如果您的 URL 总是返回相同的 IP 地址,那么拥有 3 台计算机实际上并没有帮助。要实现这一点,您需要设置 DNS 以返回这三个地址。这很简单,只需输入相同的地址三次并更改 IP 即可。
以下是具有 6 个服务器的“www”的示例:
www 60 IN A 10.0.0.1
www 60 IN A 10.0.0.2
www 60 IN A 10.0.0.3
www 60 IN A 10.0.0.4
www 60 IN A 10.0.0.5
www 60 IN A 10.0.0.6
这将使用便宜的循环机制。这意味着它不会检查服务器是否非常繁忙。每当计算机请求 DNS 时,它只会发送下一个 IP。
关于这些 IP 的一个重要事实60
是缓存持续时间。这对 DNS 来说负担更大,但这意味着用户必须每分钟获取一个新 IP。这确保了计算机的轮换。尽管在大多数情况下,浏览器可能会将同一个 IP 地址保留超过 1 分钟(根据我的经验)。我认为这不是由浏览器决定的,或者它只是在您使用该网站时缓存 IP。如果您关闭窗口,他们可能会进行新的查找。无论如何,这很便宜并且效果很好,但如果您可以使用负载平衡器,那就更好了。
瓶颈
您还需要留意瓶颈。
如果你的应用程序使用MySQL或者PostgreSQL数据库,并且您放置了 10 台前端计算机,但只有一台数据库计算机,这将成为您的瓶颈。如果您在每 10 个前端上处理 1,000 个请求,那么查询数据库将会很慢……这意味着一台运行数据库的计算机会收到 10,000 次点击,这可能是整个应用程序中最慢的部分。
数据有两种主要解析方式:使用如下系统卡桑德拉或者让您的 MySQL/PostgreSQL 数据库在多台机器上运行(这是可行的,我还没有尝试过,但我与一家拥有分布式 PostgreSQL 的公司合作。)
对于 Cassandra 这样的系统,所有数据都分布在用于运行数据库的所有计算机中。对于 MySQL/PostgreSQL 这样的系统,它们通常会按表细分数据。因此,某些表可能仍然很慢。话虽如此,在较新的版本中,它们可能有更好的解决方案。我在 SQL 并行化方面有点落后。
集群中还有其他问题需要仔细考虑。例如,如果您尝试从多台计算机更改某些数据,则可能需要锁定。SQL 数据库有这样的锁,如果您使用 ++ ,BEGIN
那就没问题了。否则,您可能会弄乱数据。避免问题的解决方案是使用集群锁(INSERT/UPDATE
COMMIT
Zookeeper提供此类功能)。您的应用程序。锁定,然后执行事务,最后解锁。然后您将进入这样的世界:如果在应用 SQL 事务之前锁超时会怎样。有趣有趣有趣...