我们公司目前面向客户的站点&内网站点目前是基于运行在IIS 6上的Classic ASP构建的。当前站点仅包含大约10个面向客户的页面,以及一个管理HR记录、调度等的内部站点。
管理层决定我们将使用这个重写项目来最终开发我们的在线零售店。他们希望我们使用地理上独立的设施(也在完全不同的 ISP 上)提供故障转移,以防我们主要设施的 WAN 链路出现故障。
我们选择 Python 进行重写是因为我们希望能够迁移到基于 Linux 的平台,并且我们目前在其他内部开发项目中使用 Python。
我们已经查看了各种 Python Web 开发框架,CherryPy 似乎很适合我们的需求,它是提供 Python 生成内容的最小环境。但是,我无法找到有关将 CherryPy 与负载平衡和故障转移技术结合使用的信息。
看来我们将被迫在 Apache 上托管 CherryPy,以利用支持粘性会话的故障转移/负载平衡集群。这是正确的,还是有办法使用 CherryPy 的内部服务器或完全不同的 HTTP 服务器来做到这一点?
此外,是否有服务提供一种方法来引导集群中的流量,以便我们不必自己托管它?我们需要能够在 2 个数据中心之间分配流量,但如果 WAN 链接在其中任何一个发生故障,它不会影响集群将流量引导到仍然可用的集群的能力。
这有两个主要部分,
- 跨多个数据中心
的负载平衡和故障转移 - 跨数据中心内的多个服务器的负载平衡和故障转移
实现多数据中心主要有三种方式:BGP/“任播”、GSLB/DNS,或在 CDN 中使用源故障转移机制。 没有一个是简单、容易或便宜的。
一旦用户的流量从那里到达特定的数据中心,您就需要一个负载均衡器组件。这里有很多选项可以大致分为设备与软件和 layer4-vs-layer7。从你提供的细节来看,我敢打赌你的需求很简单,你的预算也很小,所以让我们直接跳到 nginx 这一部分。在 nginx 中,您可以将其配置为提供静态内容,并在您喜欢运行 python 应用程序时在尽可能多的后端服务器上对动态内容进行负载平衡。
祝你好运,你已经开始了一条漫长的道路。
您的问题中有很多子问题确实应该是他们自己的条目 - 但无论如何让我们解决它们......
CherryPy 的“服务器”根本不应该在生产中使用,它非常适合开发,但您确实应该在 CherryPy 应用程序前使用 Nginx 和 Fastcgi 设置。这将使您更好地控制服务器的负载以及您需要运行多少个 CherryPy 应用程序来管理该负载。
您对跨 ISP 的负载平衡的担忧让我认为您更担心冗余而不是负载平衡,因为您需要担心在不同数据中心之间保持所涉及的数据同步,这比如何在它们之间进行负载平衡更担心.
根据您可以处理多少预算问题,决定使用硬件负载平衡器还是软件解决方案。如果您正在寻找冗余,您可以将服务器设置镜像到另一个站点,然后将您的 DNS 记录更改为指向该站点以防万一发生故障。其他任何事情都需要硬件解决方案,这些解决方案涉及上面提到的cagenut等首字母缩略词。
我们使用 ZXTM 对相同 CherryPy 节点的多个实例进行负载均衡。效果很好。
最近的 CherryPy 版本(例如 3.0.4 和 3.2)包括对 WSGI 服务器的修复,以使其更加健壮。即使传入的请求队列已满(也就是说,如果所有工作线程都忙),以前的版本也会接受新连接并继续使用它们。现在,如果您希望立即拒绝它们,可以将 server.accepted_queue_timeout 设置为 0。立即关闭这些连接允许 ZXTM 尝试立即将连接传递到另一个节点。
你确定这是你需要的吗?向您的管理层询问可接受的停机时间,他们很可能会将标准降低到现实水平。两个完全独立的网站将您置于大男孩类别中,并提供相应的解决方案定价。
也许您可以通过可靠的互联网合作伙伴找到定制解决方案?找人愿意在不同的机架(在不同的电源上)为您提供 colo,在两个接入交换机到两个核心路由器到两个非常不同的上行链路。