数据库复制:PHP中的智能数据库选择?

时间:2011-11-22 20:36:01

标签: php mysql replication database-replication

我正在使用PHP和一个复制的MySQL数据库。

我想做一些数据库负载平衡。目前我有相当原始的:

$ran = rand(1,10);
if ($ran < 5) {
  $db = '10.0.0.2:3306';
} else {
  $db = '10.0.0.3:3306';
}
// connect to the database
$con = mysql_connect($db,'elastic1','oag4Chai')
    or die('Could not connect to the server!');

但很明显,如果其中一个数据库关闭,那么我们的网页会在一半的时间内显示错误消息。

是否有更强大的方法来执行此操作 - 即在连接之前检查数据库是否已启动?

我猜这可能只是一个try / catch语句,或者我可以做一些更复杂的负载平衡 - 感谢收到的建议。

4 个答案:

答案 0 :(得分:2)

它不是显示错误的网页,而是

die('Could not connect to the server!')

die()现在与“真实代码”无关。

$ran = rand(1,10);
if ($ran < 5) {
  $db = '10.0.0.2:3306';
} else {
  $db = '10.0.0.3:3306';
}
// connect to the database
$con = mysql_connect($db,'elastic1','oag4Chai');
if (!$con) { /* Connect to the other one */ }

答案 1 :(得分:1)

首先 - 我个人认为这对PHP脚本来说不是一个好主意。

如果你负担,我会查看以下内容:

  • 监控服务器的可用性(snmp,nagios?)
  • 为您的读取从属设备使用循环DNS(低TTL,一旦发生故障时易于更新)
  • 查看mysql-proxy并根据监控
  • 更新其配置

如果你想要一个PHP解决方案,我会实现一个断路器模式:

  1. 异步过程检查MySQL服务器的可用性(例如mysqli_connect())。这可以是通过cron运行的脚本(每分钟或更短的间隔)。
  2. 此进程的状态保存到缓存中(单服务器:APC,多个:memcached或redis)
  3. 您的PHP代码先检查缓存然后再连接。如果您愿意,可以在可用服务器上进一步随机化(或使用基于会话ID或用户ID的算法等)。
  4. 我个人最喜欢DNS的想法。

答案 2 :(得分:1)

您应该考虑使用mysqlnd_ms - PHP的复制和负载平衡插件。

我认为这是比mysql proxy更好的解决方案,特别是对于生产环境,因为它是PHP原生的,mysql proxy仍处于Alpha版本。

有用的链接:

答案 3 :(得分:0)

这是非常基本的......但如果您的数据库服务器联机并在某种自动化过程中脱机,我会在Web上创建/删除某种锁定文件服务器在某个位置。在决定将用户发送到哪个数据库服务器之前,只需让脚本检查锁文件是否存在。这对于向数据库服务器发出网络请求来检查是否每次都要发送请求时是否在线都会减少开销。

如果您的数据库服务器在您不知情的情况下实际崩溃并且您的锁定文件仍然表明服务器处于联机状态,那么您运气不佳并且可能会遇到一些问题。也许是每分钟测试DB服务器是否在线的cronjob,然后相应地操作锁文件。