设置 MySql 分片或规避它
Setting up MySql Sharding or circumventing it
我正在使用预先存在的 bash 文件为开源数据服务器 (Zotero) 设置一系列数据库,我 运行 进入 mysql我不熟悉的结构:
MASTER="mysql -h localhost -P 3307 -u root -pSomePassword"
SHARD="mysql -h localhost -P 3308 -u root -pSomePassword"
ID1="mysql -h localhost -P 3309 -u root -pSomePassword"
ID2="mysql -h localhost -P 3310 -u root -pSomePassword"
WWW="mysql -h localhost -P 3311 -u root -pSomePassword"
CACHE="mysql -h localhost -P 3312 -u root -pSomePassword"
echo "CREATE DATABASE zoterotest_master" | $MASTER
echo "CREATE DATABASE zoterotest_master" | $SHARD
echo "CREATE DATABASE zoterotest1" | $SHARD
echo "CREATE DATABASE zoterotest2" | $SHARD
echo "CREATE DATABASE zoterotest_ids" | $ID1
echo "CREATE DATABASE zoterotest_ids" | $ID2
对于某种 Shard/cluster 设计,似乎有多个 MySql 实例,但是当我查看 php 代码中的数据库配置时,我发现它连接到同一个端口...现在我很困惑。
function DBConnectAuth($db) {
if ($db == 'master') {
$host = 'localhost';
$port = 3306;
$db = 'master';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'shard') {
$host = false;
$port = false;
$db = false;
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'id1') {
$host = 'localhost';
$port = 3306;
$db = 'ids';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'id2') {
$host = 'localhost';
$port = 3306;
$db = 'ids';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'www1') {
$host = 'localhost';
$port = 3306;
$db = 'www';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'www2') {
$host = 'localhost';
$port = 3306;
$db = 'www';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'cache') {
$host = 'localhost';
$port = 3306;
$db = 'cache';
$user = 'root';
$pass = 'SomePassword';
}
else {
throw new Exception("Invalid db '$db'");
}
return array('host'=>$host, 'port'=>$port, 'db'=>$db, 'user'=>$user, 'pass'=>$pass);
}
我的问题是,这看起来像典型的碎片设计吗?以及我如何在 MySql 中设置它 - 我只是在 Bash 中指定的端口上启动多个实例还是我必须做一些特殊的事情?
我很想将 Bash 文件中的所有内容都指向 3306,并将数据库分片表也更新为指向 3306,但我感觉这并不容易。
在单个服务器上进行分片毫无意义。分片通常是通过在 相似 服务器上设置 相同 数据库来完成的,其中包含数据的 子集 。分片提供的扩展超出了复制、集群等所能提供的范围。
以拥有数百万用户和数十亿张照片的照片共享网站为例。这不适用于单个服务器,而是通过将用户连同他们的照片分开。小型辅助表将在某些非分片 server/database.
上被复制或访问
也许我们对“分片”的定义有分歧?在这种情况下,请解释你的意思。
我正在使用预先存在的 bash 文件为开源数据服务器 (Zotero) 设置一系列数据库,我 运行 进入 mysql我不熟悉的结构:
MASTER="mysql -h localhost -P 3307 -u root -pSomePassword"
SHARD="mysql -h localhost -P 3308 -u root -pSomePassword"
ID1="mysql -h localhost -P 3309 -u root -pSomePassword"
ID2="mysql -h localhost -P 3310 -u root -pSomePassword"
WWW="mysql -h localhost -P 3311 -u root -pSomePassword"
CACHE="mysql -h localhost -P 3312 -u root -pSomePassword"
echo "CREATE DATABASE zoterotest_master" | $MASTER
echo "CREATE DATABASE zoterotest_master" | $SHARD
echo "CREATE DATABASE zoterotest1" | $SHARD
echo "CREATE DATABASE zoterotest2" | $SHARD
echo "CREATE DATABASE zoterotest_ids" | $ID1
echo "CREATE DATABASE zoterotest_ids" | $ID2
对于某种 Shard/cluster 设计,似乎有多个 MySql 实例,但是当我查看 php 代码中的数据库配置时,我发现它连接到同一个端口...现在我很困惑。
function DBConnectAuth($db) {
if ($db == 'master') {
$host = 'localhost';
$port = 3306;
$db = 'master';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'shard') {
$host = false;
$port = false;
$db = false;
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'id1') {
$host = 'localhost';
$port = 3306;
$db = 'ids';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'id2') {
$host = 'localhost';
$port = 3306;
$db = 'ids';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'www1') {
$host = 'localhost';
$port = 3306;
$db = 'www';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'www2') {
$host = 'localhost';
$port = 3306;
$db = 'www';
$user = 'root';
$pass = 'SomePassword';
}
else if ($db == 'cache') {
$host = 'localhost';
$port = 3306;
$db = 'cache';
$user = 'root';
$pass = 'SomePassword';
}
else {
throw new Exception("Invalid db '$db'");
}
return array('host'=>$host, 'port'=>$port, 'db'=>$db, 'user'=>$user, 'pass'=>$pass);
}
我的问题是,这看起来像典型的碎片设计吗?以及我如何在 MySql 中设置它 - 我只是在 Bash 中指定的端口上启动多个实例还是我必须做一些特殊的事情?
我很想将 Bash 文件中的所有内容都指向 3306,并将数据库分片表也更新为指向 3306,但我感觉这并不容易。
在单个服务器上进行分片毫无意义。分片通常是通过在 相似 服务器上设置 相同 数据库来完成的,其中包含数据的 子集 。分片提供的扩展超出了复制、集群等所能提供的范围。
以拥有数百万用户和数十亿张照片的照片共享网站为例。这不适用于单个服务器,而是通过将用户连同他们的照片分开。小型辅助表将在某些非分片 server/database.
上被复制或访问也许我们对“分片”的定义有分歧?在这种情况下,请解释你的意思。