2011-11-22 73 views
0

我正在使用PHP与复制的MySQL数据库。数据库复制:PHP中的智能数据库选择?

我想做一些数据库负载平衡。目前我有比较简陋:

$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语句,我猜,或者我可以做一些更复杂的负载平衡 - 感激地收到建议。

+0

可能相关:http://stackoverflow.com/questions/7278163/how-to-code-php-mysql-class-换主和从站 - 设置 – simshaun

回答

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 */ } 
0

这是非常简陋......但如果你的数据库服务器联机,并在某种自动化过程的下线,我想有一个过程创建/删除某种锁定文件的Web服务器上在某个地点。只需要脚本检查是否存在锁定文件,然后再决定将哪个数据库服务器发送给用户。这会减少向DB服务器发出网络请求的开销,以便在每次发出请求时检查它是否在线。

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

1

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

如果你能买得起,我会考虑以下几点:服务器

  • 监控可用性(SNMP,Nagios的?)
  • 使用DNS轮循你读的奴隶(低TTL,便于根据监测

更新时,一个向下)

  • 直视mysql-proxy并更新其配置如果你想有一个PHP-搜索解决方案n,我会实现断路器模式:

    1. 异步进程检查MySQL服务器的可用性(例如,它是mysqli_connect()'s)。这可以是通过cron运行的脚本(每分钟或更短的时间间隔)。
    2. 此进程的状态保存到缓存中(单服务器:APC,多个:memcached或redis)
    3. 您的PHP代码首先检查缓存,然后连接。如果您愿意,您可以随机选择(或使用基于会话ID或用户ID等的算法)跨越可用服务器。

    我个人很喜欢DNS的想法。