Web App:高可用性/如何防止单点故障?

Posted

技术标签:

【中文标题】Web App:高可用性/如何防止单点故障?【英文标题】:Web App: High Availability / How to prevent a single point of failure? 【发布时间】:2011-12-18 02:19:44 【问题描述】:

有人可以向我解释一下高可用性(“HA”)如何用于 Web 应用程序...因为我认为 HA 意味着不存在单点故障。

但是,即使使用了负载平衡器,这难道不是单点故障吗?

【问题讨论】:

@Dave Newton,但是 2 个负载均衡器如何响应传入的单个请求?我试着想象,所以让我想访问example.com,我的浏览器解析IP地址然后向example.com的IP发送单个请求,多台服务器(负载均衡器)怎么可能“回答“来自我的浏览器的网络请求?在某些时候,是否有一个硬件是故障点? 啊。我感觉到你的沮丧,尼克。很明显,仅仅将您的 IP 地址更改为指向负载平衡器(或负载平衡器平衡器,或负载平衡器平衡器)并不能实现高可用性,因为 that 负载平衡器可能会失败。然而,整个网络对这个问题的答案似乎包括 “只需添加另一层负载平衡!”(这显然没有帮助)或 “这是一个非常复杂的话题你太菜鸟了,无法理解”。 @DaveNewton 已经设法在此处提供both 无用的解雇。 @DaveNewton 不,这显然不是解决方案。让您的 IP 解析为单个入口点负载均衡器与将其解析为单个 Web 服务器一样多是单点故障,无论该负载均衡器背后有一层还是 100 层以上的负载均衡器。这里到底有什么难以理解的?真正的解决方案显然不仅仅涉及扩展负载均衡器层。 (我认为这涉及到用 BGP 做一些聪明的事情,尽管这超出了我的专业领域。) @DaveNewton “这就是我说多个平衡器的原因?” - 协调如何,如果不是由它们前面的另一个负载平衡器?这里的整个问题是有什么机制,通过它可以让一个服务器(或负载平衡器)在另一个服务器(或负载平衡器)出现故障时接管,而不仅仅是将另一个 SPOF 放在它们前面。我不知道那个机制是什么,这就是我最终来到这里的原因;在问题上投入更多层显然并不能解决问题。也许它是您提到的“可切换结构”,虽然我不知道“面料”或“sK”或“sM”是什么,而且它们都没有屈服于谷歌搜索。 @MarkAmery 同意你的观点,这就是为什么我要通篇阅读聊天结束 【参考方案1】:

HA 架构是一个完整的领域,很多书都在上面写过,所以很难用短短的一段话来回答。

总结理想的情况,您将使用多个服务器,并与多个负载平衡器的层互连。节点和LB将位于几个不同的数据中心,并连接到不同的网络骨干网。理想情况下,数据中心将位于世界各地。

简而言之,所有组件都会有冗余,包括负载平衡器。

有关起点,请参阅 Wikipedia for High Availability Cluster

【讨论】:

但在某些时候,来自用户 Web 浏览器的单个请求将不得不拆分到多个负载均衡器。到了这个地步,岂不是单点故障?意思是,一个请求怎么可能进入多个负载均衡器? 是的,用户的请求最终会在一个在线的负载均衡器中结束,并且有可能LB恰好在它处理请求并丢失它的那一刻发生了故障。 HA地址重要的是,如果用户立即重试,他将在另一个在线并成功的LB中结束,系统的其他用户也将如此。 HA 关心的是整个系统是否可用(所有故障都是暂时的),而不是任何特定请求是否成功。 你是怎么做到的? DNS 循环?【参考方案2】:

它的工作方式如下,您设置了两个带心跳的 HA 代理服务器,因此当一个失败(停止响应查询)时,它会从集群中删除。 来自 HA 代理的请求可以以循环方式转发到 Web 服务器,如果一个 Web 服务器发生故障,HA 代理服务器不会尝试联系它,直到它还活着。 Web 服务器将所有动态信息存储在数据库中,该数据库在两个 mysql 实例中复制。 如您所见,HA Proxy 和 Cluster MySQL(或简称 MySQL 复制)以及这里的 IP Clustering 是关键。

【讨论】:

但是在你的图中,我不明白的是,HAPRoxy 是如何工作的?当客户端 DNS 解析时,它只能解析到单台机器。那么 HAProxy 是否以某种方式共享相同的 IP 地址? @nickb 正如 Dave Newton 上面的回应,DNS 可以配置为为一个外部主机名返回多个 IP 地址。然后,客户端可以多次尝试联系服务。有关 DNS 配置,请参阅“A RECORDS”和“CNAME RECORDS”。 @nickb 你是对的,HA 服务可以使 HA 代理共享客户端将连接到的单个虚拟 IP。 unix 的 HA 服务可以是 (u)carp 和 keepalived、RedHat Cluster Suite 或 Pacemaker 等。另见:serverfault.com/questions/686878/…【参考方案3】:

我找到了这篇关于这个主题的文章: http://www.tenereillo.com/GSLBPageOfShame.htm

基本上,如果您不需要持久的粘性会话,您可以将 DNS 服务器配置为为您的网站返回多个 A 记录(IP 地址)。

网络浏览器足够聪明,可以尝试所有地址,直到找到一个有效的地址。

【讨论】:

-1;这与我见过的多个来源相矛盾(例如:serverfault.com/a/328321/147556)声称返回多个 A 记录(又名“循环 DNS”)确实不会导致浏览器(这是 HTTP 的主要类型)我们在谈论网站时关心的客户)快速循环通过 IP 以找到在发生故障时可以工作的 IP,但会导致长时间超时,因此在 A 记录中拥有多个 IP 并不是解决“高-可用性”。也许其他人都错了,或者自 2010 年以来情况发生了变化,但我谨慎地假设不会。 我们甚至不能相信浏览器会始终运行同一行 javascript。不确定我是否愿意依靠它们循环 IP 列表。【参考方案4】:

简单来说,高可用性可以定义为即使出现硬件和软件故障,也可以 24*7 不间断地运行系统。换句话说,容错应用程序。这有助于确保目标用户不间断地使用应用程序。

阅读更多High Availability Deployment Architecture

【讨论】:

【参考方案5】:

当然是单独操作时。通常的高可用性设置包括在集群中以主动/主动或主动/被动配置运行的 2 个或更多负载平衡器。为了进一步提高可用性,您可以让 2 个不同的 Internet 服务提供商(或地理分布式数据中心)各自运行一对集群负载平衡器。然后,您将 DNS A 记录配置为解析为 2 个不同的公共 IP 地址,以保证循环处理均匀地拆分 DNS 请求(CloudFlare 在这方面非常快速且可靠)。还可以使用 PowerDNS dnsdist 之类的方法返回最接近您的原始地理位置的数据中心的 IP 地址 这就是大玩家为使他们的服务具有高可用性所做的工作。

请阅读https://docs.oracle.com/cd/E23824_01/html/821-1453/gkkky.html 了解更多信息。实际上两个负载均衡器都使用相同的vip(虚拟IP地址。https://techterms.com/definition/vip)。

【讨论】:

以上是关于Web App:高可用性/如何防止单点故障?的主要内容,如果未能解决你的问题,请参考以下文章

Haproxy+mycat+mysql集群搭建和高可用

RocketMQ源码 — RocketMQ高可用

分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡

nginx和keepalived实现nginx高可用

Nginx+keepalived双机热备

如何做到MySQL的高可用?