php - 设置或规避 MySql Sharding

标签 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 实例用于某种分片/集群设计,但是当我查看 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);
}

我的问题是,这看起来像典型的 Shard 设计吗?我如何在 MySql 中设置它 - 我只是在 Bash 中指定的端口上启动多个实例还是我必须做一些特殊的事情?

我很想将 Bash 文件中的所有内容都指向 3306,并将数据库分片表也更新为指向 3306,但我感觉这并不那么容易。

最佳答案

在单个服务器上进行分片没有什么意义。分片通常是通过在相似服务器上拥有相同数据库来完成的,其中包含数据子集。分片提供的扩展能力超出了复制、集群等所能提供的范围。

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

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

关于php - 设置或规避 MySql Sharding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224905/

相关文章:

database - 许多 fk 表的一个表列?

php - sql - 按其他关系计数排序查询

database-design - 复合主键的使用

php - 如何创建 php 数组并将其从 CSV 插入到数据库

mysql - 如何一次插入和更新多个值

PHP 在 HTML 表格中的相同行上回显

mysql - 我是否需要使用约束来制作 sql 表才能与 hibernate 一起使用

python - 拥有一个可以属于其他两个模型中的任何一个的 django 模型(外键关系)

PHP header 位置重定向到当前文件夹的根目录

php - 在 MySQL PDO 中使用带有 % 的 LIKE 时,不返回带有大写字母的行