CherryPy、负载平衡和远程故障转移

CherryPy、负载平衡和远程故障转移

我们公司当前面向客户的站点和内联网站点目前建立在运行于 IIS 6 上的 Classic ASP 上。当前站点仅包含大约 10 个面向客户的页面,以及一个管理人力资源记录、日程安排等的内部站点。

管理层已决定我们将使用这个重写项目来最终开发我们的在线零售店。他们希望我们使用一个地理位置上独立的设施(也位于完全不同的 ISP 上),以便在我们主要设施的 WAN 链路发生故障时提供故障转移。

我们选择使用 Python 进行重写,因为我们希望能够转移到基于 Linux 的平台,而且我们目前在其他内部开发项目中使用 Python。

我们研究了各种 Python Web 开发框架,CherryPy 似乎很适合我们的需求,即为 Python 生成的内容提供最小环境。但是,我很难找到有关使用 CherryPy 进行负载平衡和故障转移技术的信息。

看来我们将被迫在 Apache 上托管 CherryPy,以便利用支持粘性会话的故障转移/负载平衡集群。这是正确的吗?或者有没有办法使用 CherryPy 的内部服务器或完全不同的 HTTP 服务器来实现这一点?

此外,是否有服务可以提供一种方法来引导集群中的流量,以便我们不必自己托管它?我们需要能够在两个数据中心之间分配流量,但如果其中一个数据中心的 WAN 链接出现故障,它不会影响集群将流量引导到仍然可用的集群的能力。

答案1

这主要有两个部分:
- 跨多个数据中心的负载平衡和故障转移
- 跨数据中心内的多个服务器的负载平衡和故障转移

实现多数据中心主要有三种方式:BGP/“任播”、GSLB/DNS 或使用 CDN 内的来源故障转移机制。 没有任何简单、容易或便宜。

一旦用户的流量从那里到达特定数据中心,您就需要一个负载均衡器组件。这里有很多选项,可以大致分为设备与软件和第 4 层与第 7 层。从您提供的详细信息来看,我敢打赌您的需求非常简单,预算也很少,所以让我们直接跳到 nginx 来完成这一部分。在 nginx 中,您可以将其配置为提供静态内容,并在运行 python 应用程序的任意数量的后端服务器上对动态内容进行负载平衡。

祝你好运,这是一条漫长的路。

答案2

您的问题中有相当多的子问题实际上应该是它们自己的条目 - 但无论如何我们还是来解决它们吧......

CherryPy 的“服务器”根本不应该在生产中使用,它非常适合开发,但您确实应该在 CherryPy 应用程序前面使用 Nginx 和 Fastcgi 设置。这将使您更好地控制服务器的负载以及您需要运行多少个 CherryPy 应用程序实例来管理该负载。

您对跨 ISP 负载平衡的担忧使我认为您更担心冗余而不是负载平衡,因为您需要担心在不同的数据中心之间保持所涉及的数据同步,这比如何在它们之间进行负载平衡更令人担忧。

根据您能承受的预算压力,决定是使用硬件负载平衡器还是软件解决方案。如果您正在寻找冗余,您可以将服务器设置镜像到另一个站点,然后更改 DNS 记录以在发生故障时指向该站点。任何其他方法都需要硬件解决方案,这些解决方案涉及上面提到的一系列首字母缩略词。

答案3

我们使用 ZXTM 对同一 CherryPy 节点的多个实例进行负载平衡。效果很好。

CherryPy 的最新版本(例如 3.0.4 和 3.2)包含对 WSGI 服务器的修复,使其更加强大。以前的版本会接受新连接并挂起它们,即使传入请求队列已满(即,如果所有工作线程都很忙)。现在,如果您希望立即拒绝它们,您可以将 server.accepted_queue_timeout 设置为 0。立即关闭这些连接允许 ZXTM 尝试立即将连接传递给另一个节点。

答案4

您确定这就是您所需要的吗?向您的管理层询问可接受的停机时间数字,他们很可能会将标准降低到现实水平。两个完全独立的站点使您进入大公司类别,解决方案的定价相匹配。

也许您可以找到一个可靠的互联网合作伙伴来提供定制解决方案?寻找愿意为您提供不同机架(不同电源)、两个接入交换机、两个核心路由器和两个截然不同的上行链路的托管服务的人。

相关内容