2008-10-10 8 views

Respuesta

8

Tradicionalmente, se manejan las estrategias de failover a nivel del sistema; De esa forma, todas las aplicaciones pueden disfrutar de un entorno robusto.

Me gustaría referirme a MySQL failover strategy y MySQL proxy. Este último describe una utilidad MySQL que puede hacer equilibrio de carga y failover, y parece bastante fácil de configurar.

No

la respuesta a la pregunta, pero es la solución más común para manejar la conmutación por error.

2

No, no tiene que construir. Creo que es una manera fácil de emplear MySQL Proxy. De lo contrario, pero la lógica (if (fails) { connect to another }) en su aplicación, pero eso no es tan bonito y excelente en términos de rendimiento.

+0

MySQLProxy parece prometedor. – Kev

2

php no ha construido en el mecanismo de conmutación por error - probablemente por una buena razón. Dicho sistema de conmutación por error debe implementarse en el sistema operativo o nivel de hardware.

De todas formas su muestra proporciona un mecanismo de conmutación por error barato y sencillo.

3

No hay nada incorporado para manejar eso en PHP. Tienes que escribir el código tú mismo.

El mejor enfoque sería la de acceder a su base de datos abstracta y crear una clase que puede encapsular la lógica de conmutación por error.

Aquí hay algo de código, fruto de la casualidad:

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: He dejado un poco de aquí, no es para ser utilizado pie de la letra.

PPS: Probablemente sería mejor usar una biblioteca de abstracción de base de datos existente (Zend_Db, MDB2, etc.) e implementar su interfaz en lugar de crear su propia solución ad-hoc

+0

Necesita transacciones que incluyan ambos servidores para todas las operaciones de actualización/inserción, o puede quedar atrapado con dos servidores de bases de datos con estados diferentes. No puedes fallar si no tienes nada a lo que fallar. :-) La transacción que abarca dos bases de datos es importante para el comportamiento de ACID. –

+0

Sí, esto es muy rudimentario. Además de las transacciones, probablemente sea una buena idea capturar solo excepciones que indiquen que el servidor no está disponible, en lugar de cualquier error de SQL. – Toxygene

Cuestiones relacionadas