PHP是否具有内置的从一个数据库服务器故障转移到另一个数据库服务器的机制?

问题描述:

我发现这一点:PHP是否具有内置的从一个数据库服务器故障转移到另一个数据库服务器的机制?

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

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

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

在系统级别处理故障转移策略是传统的;这样所有的应用程序都可以享受强大的环境。我想参考MySQL failover strategyMySQL proxy。后者描述了一个可以进行负载均衡和故障转移的MySQL实用程序,并且似乎很容易设置。

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

不,它没有内置。我认为一个简单的方法是聘请MySQL Proxy。否则,应用程序中的逻辑if (fails) { connect to another }),但在性能方面并不那么漂亮和优秀。

+0

MySQLProxy看起来很有希望的。 – Kev 2008-10-10 14:41:08

php没有内置的故障转移机制 - 很可能有一个很好的理由。这种故障转移系统应该在操作系统或硬件层面上实施。

总而言之,您的示例提供了便宜且简单的故障转移机制。

没有什么内置来处理在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,ECT)和实施其接口,而不是创建自己的临时解决方案

+0

您需要包含所有更新/插入操作的两台服务器的事务,否则您可能会遇到两台具有不同状态的数据库服务器。如果你没有什么可以故障转移的话,你无法进行故障恢复。 :-)跨越两个数据库的事务对于ACID行为很重要。 – 2008-12-11 22:05:53