Как настроить 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.