Как настроить PHP PDO для подключения к мультимастерному кластеру?

Я использую Percona XtraDB Cluster для балансировки нагрузки базы данных.

Обычный подход к подключению к базе данных:

$db = new \PDO('mysql:dbname=foo;host=127.0.0.1');

Тем не менее, существует несколько мастеров, каждый из которых может быть мертв в любой момент времени.

Как установить соединение с кластером базы данных с балансировкой нагрузки и безопасным переключением при сбое?

1 ответ

Мое интуитивное предположение так же просто, как:

<?php
$cluster = ['10.128.155.150', '10.128.155.151', '10.128.155.152'];

shuffle($cluster);

foreach ($cluster as $i => $ip) {
    try {
        $db = new \PDO('mysql:dbname=foo;host=' . $ip . ';charset=utf8');

        break;
    } catch (\PDOException $e) {
        if ($i === count($cluster)) {
            throw $e;
        }
    }
}

Тем не менее, я хотел бы знать, есть ли еще разработанные пуленепробиваемые решения.

Редактировать 2013 3 мая 14:42. Мне объяснили, что этот подход плох, просто потому, что пользователю нужно будет подождать до истечения времени ожидания соединения. Правильный инструмент для работы - http://us1.php.net/manual/en/intro.mysqlnd-mux.php.

Осторожно, хотя:

Доказательство концепции не поддерживает небуферизованные запросы, подготовленные операторы и асинхронные запросы.

Изменить 2013 3 мая, 20:38. В итоге посмотрел на сердцебиение и HAProxy.

Другие вопросы по тегам