负载平衡两个不同的ISP的每个服务器?

我有两个ISP提供我通过Apache / PHP / MySQL托pipe。 我正在运行drupal。 偶尔mysql服务器将会消失(崩溃),所以我希望find一个合理的方法来进行故障切换,如果服务器A的SQLclosures,所有的stream量都被发送到服务器B.

我知道传统上这是在DNS中处理的,如果出现问题或类似情况,则会给出第二个备用IP。 但是我不能控制isp,除了我可以运行php,perl和通常的apache的东西。 此外,我有每个isp静态IP,我可以创buildDNS条目(A / CNAME / TXT)。

所以,我希望有一个方法可以让我有一个脚本来检查drupal是否有问题,如果是的话,以某种方式改变DNS,或?

或者,还有其他的想法? (除了花更多的钱在更好的isp上)

循环赛DNS不会解决您的问题 – 这是提供Web服务器负载平衡的好方法 – 但是当客户端尝试连接到端口并且没有收到回复时发生故障转移(然后继续尝试下一个DNS条目为主机)。 显然,如果MySQL数据库失败,那么这将不会对Web服务器产生直接的影响(即Web服务器将响应TCP请求)。

尽pipe原则上可以使PHP代码检测到数据库故障并closuresnetworking服务器或阻止传入的连接 – 这是一种相当危险的方法 – 即使您的主机允许它发生。

我能想到的处理这种情况的唯一可行的方法是在检测到故障的情况下将其redirect到特定的主机名,所以如果您现在已经将两台主机都设置为www.example.com,则为www1添加logging.example.com和www2.example.com,然后添加一个自动prepend包含文件做类似:

(on www1.example.com) check_db(); // if check_db returns, then continue with normal processing... function check_db() { if (request is for www.example.com) { // avoid loops when both sites fail if (last check more than 10 secs ago) { if (database status bad) { raise a database failed flag on the filesystem redirect to www2.example.com end } } else { if (database failed flag set) { redirect to www2.example.com end } return OK } } else { // request is for www1.example.com ie we are already in failover mode if (database failed flag set) && (last check more than 5 secs ago) { if (database status good) { remove database failed flag return OK } else { // oh no! both hosts down! print sorry message and exit } } else if (last check more than 5 secs ago) { if (database status bad) { raise a database failed flag on the filesystem print sorry message and exit } } } return OK } 

但是,如果数据库没有使用阻塞调用,您仍然需要一些testing方法。

HTH

C。

您正在要求故障转移,而不是负载平衡。

故障切换非常困难,特别是对于不在同一基础设施内的设备。 最好的例子是在你的ISP上获得一个冗余的地理负载均衡器,它可以testing你的站点并无缝地处理故障转移。 由于我的猜测是超出预算的,我们来看看棍棒和口香糖的方法。

由于你的问题显然是MySQL,而不是Web服务器,那么让我们来解决手头的问题。

鉴于:

  • 主机A:Web服务器和MySQL数据库
  • 主机B:Web服务器和冗余MySQL数据库

我会使用的方法是:

  1. 将数据库连接凭据存储在某处(显然不在Web根目录中),并将其加载到每个页面连接上。 你可以像这样编辑sites / default / settings.php:

    $ db_url = file_get_contents('/ some / private / dir / drupal-db.url');

  2. 编写一个后台守护进程,每5秒钟(或者之后)连接数据库,并以机器可读的方式在磁盘上logging失败。 连接失败30秒后(或大约30秒),然后“交换”存储在磁盘上的凭据与备份服务器。 这将导致您的Web服务器提供备用数据库服务器的内容。 如果它回来,扭转过程。 在这种情况下,logging对于debugging是非常重要的

  3. 如果您想要使用它,可以尝试将所有INSERT和UPDATElogging到Web服务器上的磁盘上,以便在故障切换后重新同步数据库。 如果它大部分是“只读的”,那么这可能不是必需的。

这里的主要观点是将故障切换与Web应用程序的操作分开。 它更模块化,并简化了对networking应用程序的更改。

最后,确保可以从主服务器连接到备份数据库。 您可以在命令行上执行此操作,并使用grant命令:

在主机B上:

 mysql> GRANT ALL PRIVILEGES ON drupaldb.* TO username@'12.34.56.78' IDENTIFIED BY 'mypassword'; 

IP是主机A的地方

别忘了冲洗!

 mysql> FLUSH PRIVILEGES: 

然后testing:

 bash> mysql -u username -pmypassword -h hostb drupaldb 

没办法,没有体面的技术 – 考虑到你的基础设施。

  • DNS不会工作,除非你保持你的DNS域超时SMALL(秒范围),这是从前。 如果你能做到这一点,你可以正确编写脚本(服务器2上的脚本无法到达服务器1,从而更改DNS条目)。 这几乎是唯一的方法来做到这一点。

  • 根据你的DNS设置,这可能在那里,或者 – 使用像dyndns.org注册一个主机条目,并用CNAMEreplace你的IN条目。 DynDNS.org有一个很好的API,你可以通过HTTP调用来改变条目,而CNAME永远不会改变。 他们也保持短TTL的域名。

这几乎是所有的select。 这是其他的,但他们需要很多你没有的基础设施。