设置 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.

上被复制或访问

也许我们对“分片”的定义有分歧?在这种情况下,请解释你的意思。