我正在重建一个网站,目前该网站每月有大约 400 多万访问者(最近访问量直线上升)。该网站目前由一家外部公司运营和托管,但我们正在放弃他们,所以我需要设计托管服务。
我正在考虑构建一个小型集群(可能在 Linode 上):
一个Linode NodeBalancer平衡应用服务器之间的负载。它可以将特定客户端的所有流量都发送到一个应用服务器,但 WP 通过 cookie 处理会话,因此这并不那么重要。
二(或者更多)应用服务器- Linode(512?)VPS 运行 Debian6/Apache2/PHP5/Wordpress,但是nginx 用于缓存。
一个 MySQL(或 MariaDB?)数据库服务器(同样,一个 VPS),也许还有一个从服务器超级数据库。
开发是在普通的 FBSD/Apache2/MySQL/PHP5 上内部完成的,部署只会将新代码一次推送到所有应用服务器,并将任何数据库更改推送到数据库服务器。
备份将存储在本地。我们可以在流量较少的时候备份一个应用服务器(它们应该是相同的?)以降低负载。
电子邮件通过 MailChimp 处理。简单。
WP 本身正在运行带有 Xcache 的 W3 Total Cache,我正在考虑为图像和其他静态文件提供 CDN,缓存头已经用于这些静态文件……
计划是,随着我们的扩展,我可以根据需要添加更多的应用程序和/或数据库服务器。
简而言之:这种设置能行得通吗?它会高效吗?我以前从未构建过这样的东西,所以我想确保我没有遗漏任何东西。
仅供参考:这是一个新闻网站。我们在几个版块和一些媒体上刊登文章,访问者可以对文章发表评论、注册我们的电子邮件列表等。
答案1
我正在与另一家公司建立类似的服务。我无法评论 Linode 的工作原理,但我想强调一下我在研究 VPS 时遇到的一些问题:
我不知道 linode 的负载均衡器的成本,但我发现我喜欢控制运行 HAProxy 或 NGINX 的通用 VPS 的配置以实现负载平衡(我选择了 HAproxy)。
确保你有足够的 RAM。遗憾的是,到目前为止我发现的公开产品不允许您调整 RAM 和 HDD 的数量(我需要更多 RAM,但不需要那么多 HDD。算了)。
确保您的 VPS 具有持久性。如果 VPS 关闭或出现硬件故障,您肯定不希望丢失 VPS 上运行的数据(尤其是 MySQL)。这是 MySQL 的 EC2 文档,但其中的一些概念也适用)。
一定要确保将 MySQl 复制到不同的服务器,甚至多个从属服务器。不想丢失数据。
一定要确保将备份检索到异地服务器。
如果您要部署到多个负载平衡服务器(2 个或更多应用服务器),请拥有一个“主”服务器,备份服务器会从该服务器 rsync 来更新代码。这简化了您的开发推送过程(将主服务器从负载平衡方案中移除,确保从服务器不会从旧主服务器 rsync,将代码推送到主服务器,确保一切按预期运行,重新打开从主服务器到从服务器的 rsync,然后将主服务器重新添加到负载平衡方案中)。
我确信还有更多,但问题中概述的设置看起来不错。
答案2
此设置与我们使用的 Web 服务器集群非常相似。我们在“平衡”服务器上使用 Nginx 上游将请求传递到 Web 服务器。我不明白为什么您的上述配置不起作用,并且它允许您根据需要进行水平扩展。
- 我还建议在负载均衡器上使用 Heartbeat 实现高可用性。这是一个很好的参考
您目前是否有任何备份/存储,或者您是否使用 RAID 来实现冗余?您可以考虑使用 NAS 进行快照/备份。只是一个想法。
答案3
请务必意识到,当您决定采用 keepalived 路由时,在 2 个 linode 集群上构建自己的 haproxy 将会失败。我确信不支持多播。有一个 haproxy 修复程序可以使用单播,据说可以在这些网络上工作。
但要意识到,像 rackspace/linode 这样的提供商知道,否则,这会搞乱他们的负载均衡器产品。
话虽如此,你可以通过 openvpn 链接进行多播(提示)
haproxy 的单播支持限制为 2 个节点控制 1 个 VIP 地址。
答案4
你让我对此进行更深入的思考,我控制着几台 Linode 机器(还有 Rackspace)。
我的个人网站按照你的计划运行:
- W3TC 插件(具有良好的 CDN 集成,我知道这个想法是从哪里来的)
- PHP/fpm
- NGINX(1.2)
- MariaDB 5.2
我在其上有更多不相关的服务,tracd(edgewall)作为上游位于 nginx 后面,还有一个 couchdb 开发实例。
所有这些都在 768Mb linode 上完成(第二低)。它每秒最多处理 50 个连接,同时启用 memcached 和磁盘缓存(因此没有 APC 或 CDN)。缓存插件使其从 5/s 增加到 50/s(最大的块是 MariaDB)。
至于 HAPROXY,我也在 Linode 上运行了其中的一个。顺便说一句,In 发现 rackspace 不如 Linode,因为您无法从同一个帐户中选择您的地理位置(您可以在美国和国外拥有 2 个帐户)。而且它们的界面看起来和感觉起来不如 Linode 流畅。
至于 MariaDB 的扩展,我发现这并不容易,运行 2 个主服务器并保持它们同步是一件令人头疼的事。我采用的传统方法是设置一个主服务器和几个从服务器(可能每个节点一个)。然后在 haproxy 中以 TCP 模式将它们集群在一起,但在您的数据库和 HAPROXY 之间,我会将 mysql-proxy 放在两者之间,以确保写入被发送到正确的主节点,您可以在 LUA 中对其进行编程。额外的好处是大大减少了与 mysql 的连接创建。一个大的性能消耗消失了,从我在这里的体验来看,每个 mysql 连接至少占用 5Mb。
这仍然会给你带来一个单点故障,即 mysql 主服务器。
为此,您可以采用主主方法,除非第一个主服务器发生故障,否则第二个主服务器不会直接用于任何地方。我发现 Mysql DB 是设置大型冗余集群的最大限制因素。couchDB 在这方面要容易得多,但它是一种 NOSQL 解决方案...
我要做的最大不同点是,我会放弃 Apache,因为 PHP/fpm + nginx 已经存在,所以你实际上并不需要它。所以我不会将 nginx 用作缓存,而是将其用作前端服务器。与 nginx 在 Linode 上所能提供的相比,Apache 会把你的 Linode 吞噬殆尽……
希望这对您的计划有所帮助。一如既往,先下定决心并先测试这些东西。在您的解决方案中要灵活,在开始在生产中使用之前放弃一些不起作用的东西,以后再纠正问题需要做更多的工作。