设置MySql Sharding或绕过它

时间:2017-07-20 20:49:23

标签: php mysql database-design sharding

我正在使用预先存在的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

似乎有多个MySql实例用于某种Shard /集群设计但是当我看到php代码中的db配置时,我看到它连接到同一个端口......现在我很困惑。

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,并将DB分片表更新为指向3306,但我觉得这并不容易。

1 个答案:

答案 0 :(得分:1)

在单个服务器上进行分片几乎没有意义。通常通过在类似的服务器上创建相同的数据库来完成分片,其中包含数据的子集。分片提供的扩展超出了复制,聚类等的范围。

以一个拥有数百万用户和数十亿张照片的照片共享网站为例。这不适合单个服务器,而是将用户和照片分开。可以在某些非分片服务器/数据库上复制或访问小型辅助表。

也许我们不同意“碎片”的定义?在这种情况下,请解释一下你的意思。