2008-10-10 7 views

Antwort

8

Es ist üblich, Failover-Strategien auf Systemebene zu handhaben. Auf diese Weise können alle Anwendungen eine robuste Umgebung genießen.

Ich würde gerne auf MySQL failover strategy und MySQL proxy verweisen. Letzteres beschreibt ein MySQL-Dienstprogramm, das Load-Balancing und Failover durchführen kann, und scheint ziemlich einfach einzurichten.

Nicht die Antwort auf die Frage, aber es ist die häufigere Lösung, Failover zu behandeln.

2

Nein, es ist nicht eingebaut. Ich denke, ein einfacher Weg ist MySQL Proxy zu verwenden. Ansonsten, aber die Logik (if (fails) { connect to another }) in Ihrer Anwendung, aber das ist nicht so schön und groß in Bezug auf die Leistung.

+0

MySQLProxy sieht vielversprechend aus. – Kev

2

php hat keinen integrierten Failover-Mechanismus - wahrscheinlich aus einem guten Grund. Ein solches Failover-System sollte auf der Betriebssystem- oder Hardwareebene implementiert werden.

Anyways Ihre Probe bietet einen billigen und einfachen Failover-Mechanismus.

3

Es gibt nichts eingebaut in PHP zu handhaben. Sie müssen den Code selbst schreiben.

Der beste Ansatz wäre, den Datenbankzugriff zu abstrahieren und eine Klasse zu erstellen, die die Failover-Logik kapseln kann.

Hier ist ein Code, aus dem Stehgreif:

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: ich etwas ganz von hier verlassen haben, ist es nicht wörtlich verwendet werden.

PPS: Ich würde wahrscheinlich besser sein, eine bestehende Datenbank-Abstraktions Bibliothek zu verwenden (Zend_Db, MDB2, ect) und deren Schnittstelle zu implementieren, anstatt Ihre eigene Ad-hoc-Lösung zu schaffen

+0

Sie benötigen Transaktionen, die beide Server für alle Aktualisierungs-/Einfügevorgänge enthalten, oder Sie können mit zwei Datenbankservern mit unterschiedlichen Zuständen festhängen. Sie können nicht fehlschlagen, wenn Sie nichts zu ändern haben. :-) Die Transaktion, die zwei Datenbanken umfasst, ist wichtig für das ACID-Verhalten. –

+0

Ja, das ist sehr rudimentär. Zusätzlich zu den Transaktionsdaten ist es wahrscheinlich eine gute Idee, nur Ausnahmen zu erfassen, die anzeigen, dass der Server nicht verfügbar ist, anstatt eines SQL-Fehlers. – Toxygene