Есть ли в PHP встроенный механизм восстановления после сбоя с одного сервера базы данных на другой? - PullRequest
5 голосов
/ 10 октября 2008

Я нашел это:

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

и аналогичные примеры. Но есть ли лучший способ?

Я имею в виду клиента автоматического переключения при сбое в собственном клиенте MS SQL.

Ответы [ 4 ]

8 голосов
/ 10 октября 2008

Традиционно обрабатывать стратегии отработки отказа на системном уровне; Таким образом, все приложения могут использовать надежную среду.

Я хотел бы сослаться на Стратегия отработки отказа MySQL и MySQL proxy . Последний описывает утилиту MySQL, которая может выполнять балансировку нагрузки и аварийное переключение, и кажется довольно простой в настройке.

Не ответ на вопрос, но это более распространенное решение для обработки отказа.

3 голосов
/ 10 октября 2008

Нет ничего встроенного, чтобы справиться с этим в 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) и реализовал их интерфейс вместо создания собственного специального решения

2 голосов
/ 10 октября 2008

php не имеет встроенного механизма восстановления после отказа - вероятно, по уважительной причине. Такая система отработки отказа должна быть реализована на уровне операционной системы или оборудования.

В любом случае ваш образец предоставляет дешевый и простой механизм восстановления после отказа.

2 голосов
/ 10 октября 2008

Нет, у него нет этой встроенной функции. Я думаю, что простой способ - использовать MySQL Proxy . Иначе, но логика (if (fails) { connect to another }) в вашем приложении, но это не так красиво и здорово с точки зрения производительности.

...