我正在使用Percona XtraDB Cluster来负载平衡数据库。如何配置PHP PDO以连接到多主群集?
通常的方法连接到数据库是:
$db = new \PDO('mysql:dbname=foo;host=127.0.0.1');
但是,也有多个主,其中的每一个可能是死在任何时间点。
如何通过负载平衡和安全故障转移建立到数据库群集的连接?
我正在使用Percona XtraDB Cluster来负载平衡数据库。如何配置PHP PDO以连接到多主群集?
通常的方法连接到数据库是:
$db = new \PDO('mysql:dbname=foo;host=127.0.0.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年5月3日14:42。我被解释说这种方法很糟糕,因为用户需要等到连接超时。这项工作的正确工具是http://us1.php.net/manual/en/intro.mysqlnd-mux.php。
要小心的是,认为:
证明的概念不支持无缓冲查询,准备 语句和异步查询。
编辑2013年5月3日20:38。最终看着心跳和HAProxy。
对谁低估了这一点:解释为什么这种方法是错误的或者至少提供了一个你喜欢的方法的例子是有道理的。 – Gajus 2013-05-03 13:37:58
这不是一个完美的解决方案,但会工作,我也有兴趣采取更好的方法。 – LeonanCarvalho 2017-12-07 17:41:55
集群的关键点不是您选择要连接的主设备。这是负载平衡器的工作。 – 2013-05-03 16:58:44