【问题标题】:Does PHP have a built in mechanism to failover from one database server to another?PHP 是否具有从一个数据库服务器故障转移到另一个数据库服务器的内置机制?
【发布时间】:2008-10-11 03:42:46
【问题描述】:

我发现了这个:

http://www.evolt.org/failover-database-connection-with-php-mysql

和类似的例子。但是有没有更好的方法?

我正在考虑 MS SQL Native Client 中的 Automatic Failover Client

【问题讨论】:

    标签: php mysql database failover


    【解决方案1】:

    传统上在系统级别处理故障转移策略;这样所有应用程序都可以享受稳健的环境。

    我想参考MySQL failover strategyMySQL proxy。后者描述了一个 MySQL 实用程序,它可以进行负载平衡和故障转移,并且似乎很容易设置。

    不是问题的答案,但它是处理故障转移的更常见的解决方案。

    【讨论】:

      【解决方案2】:

      在 PHP 中没有内置任何东西来处理这个问题。您必须自己编写代码。

      最好的方法是抽象您的数据库访问并创建一个可以封装故障转移逻辑的类。

      这里有一些代码,即兴发挥:

      interface MySQL_Interface {
          public function query($sql);
      }
      
      class MySQL_Concrete implements MySQL_Interface {
          public function __construct($host, $user, $pass, $dbname) {
              $this->_mysql = mysql_connect($host, $user, $pass) or throw Exception("Could not connect to server");
              mysql_select_db($db, $this->_mysql) or throw Exception("Could not connect to database");
          }
          public function query($sql) {
              return mysql_query($sql) or throw new Exception("Query failed");
          }
      }
      
      class MySQL_Failover implements MySQL_Interface {
          public function __construct(MySQL_Interface $one, MySQL_Interface $two) {
              $this->_one = $one;
              $this->_two = $two;
          }
          public function query($sql) {
              try {
                  return $this->_one->query($sql);
              } catch (Exception $e) {
                  return $this->_two->query($sql);
              }
          }
      }
      
      $db = new MySQL_Failover(
          new MySQL_Concrete('host1', 'user', 'pass', 'db'),
          new MySQL_Concrete('host2', 'user', 'pass', 'db')
      );
      
      $db->query('SELECT * FROM Users');
      

      PS:我已经离开这里很多了,不要逐字使用。

      PPS:我可能会更好地使用现有的数据库抽象库(Zend_Db、MDB2 等)并实现它们的接口,而不是创建自己的临时解决方案

      【讨论】:

      • 对于所有更新/插入操作,您需要包括两个服务器的事务,否则您可能会遇到两个具有不同状态的数据库服务器。如果您没有可故障转移的内容,则无法进行故障转移。 :-) 跨越两个数据库的事务对于 ACID 行为很重要。
      • 是的,这是非常初级的。除了事务之外,最好只捕获表明服务器不可用的异常,而不是任何 SQL 错误。
      【解决方案3】:

      不,它没有内置。我认为一个简单的方法是使用MySQL Proxy。否则,您的应用程序中的逻辑 (if (fails) { connect to another }) 就性能而言不是那么漂亮和出色。

      【讨论】:

        【解决方案4】:

        php 没有内置的故障转移机制——这可能是有充分理由的。这种故障转移系统应该在操作系统或硬件层面实现。

        无论如何,您的示例提供了一种廉价且简单的故障转移机制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2018-09-14
          • 2023-03-14
          • 1970-01-01
          相关资源
          最近更新 更多