【问题标题】:Database replication: intelligent database selection within PHP?数据库复制:PHP 中的智能数据库选择?
【发布时间】:2011-11-22 20:36:00
【问题描述】:

我将 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 语句,或者我可以做一些更复杂的负载平衡 - 非常感谢您的建议。

【问题讨论】:

标签: php mysql replication database-replication


【解决方案1】:

显示错误的不是网页,是你自己

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

【讨论】:

    【解决方案2】:

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

    如果您可以负担,我会考虑以下内容:

    • 监控服务器的可用性(snmp、nagios?)
    • 为您的读取从站使用循环 DNS(低 TTL,当一个节点出现故障时易于更新)
    • 查看mysql-proxy 并根据监控更新其配置

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

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

    我个人最喜欢 DNS 的想法。

    【讨论】:

      【解决方案3】:

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

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

      有用的链接:

      【讨论】:

        【解决方案4】:

        这是相当初级的...但是如果您的数据库服务器在某种自动化过程中上线和下线,我会让该过程在网络上创建/删除某种锁定文件服务器在某个位置。在决定将用户发送到哪个数据库服务器之前,只需让脚本检查锁定文件是否存在。与每次向数据库服务器发出网络请求以检查它是否在线相比,这将减少您每次想要发出请求时的开销。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-08
          • 2016-09-11
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 2015-05-31
          相关资源
          最近更新 更多