您可以将可伸缩性技术应用于此池模型的一种方法是允许动态更改您的池分布。如果您有一个由于某种原因非常受欢迎的特定永久链接,您可以将奴隶从主池移动到评论池以帮助它。通过隔离负载,您已经设法给自己更多的灵活性。您可以将从属服务器添加到任何池中,在池之间移动它们,最后在当前流量级别下拨入所需的性能。
MySQL 数据库池还有一个额外的好处,那就是查询缓存的命中率要高得多。MySQL(和大多数数据库系统)内置了查询缓存。此缓存保存最近查询的结果。如果再次执行相同的查询,可以快速返回缓存的结果。
如果您有 20 个数据库从属服务器并连续两次执行相同的查询,那么您只有 1/20 的机会命中同一个从属服务器并获得缓存结果。但是通过将某些类别的查询发送到一组较小的服务器,您可以大大增加缓存命中的机会并获得更高的性能。
您将需要在代码中处理数据库池 - 第 1 部分中基本负载平衡代码的自然扩展。让我们看看如何扩展该代码以处理任意数据库池:
<?php
class DB {
// Configuration information:
private static $user = 'testUser';
private static $pass = 'testPass';
private static $config = array(
'write' =>
array('mysql:dbname=MyDB;host=10.1.2.3'),
'primary' =>
array('mysql:dbname=MyDB;host=10.1.2.7',
'mysql:dbname=MyDB;host=10.1.2.8',
'mysql:dbname=MyDB;host=10.1.2.9'),
'batch' =>
array('mysql:dbname=MyDB;host=10.1.2.12'),
'comments' =>
array('mysql:dbname=MyDB;host=10.1.2.27',
'mysql:dbname=MyDB;host=10.1.2.28'),
);
// Static method to return a database connection to a certain pool
public static function getConnection($pool) {
// Make a copy of the server array, to modify as we go:
$servers = self::$config[$pool];
$connection = false;
// Keep trying to make a connection:
while (!$connection && count($servers)) {
$key = array_rand($servers);
try {
$connection = new PDO($servers[$key],
self::$user, self::$pass);
} catch (PDOException $e) {}
if (!$connection) {
// Couldn’t connect to this server, so remove it:
unset($servers[$key]);
}
}
// If we never connected to any database, throw an exception:
if (!$connection) {
throw new Exception("Failed Pool: {$pool}");
}
return $connection;
}
}
// Do something Comment related
$comments = DB::getConnection('comments');
. . .
?>