mysql - 如何使用 Django 实现 MYSQL 数据库的数据库分片

标签 mysql django database-design nosql distributed-system

我正在尝试理解系统设计的概念并尝试实际实现它。让我印象深刻的一件事是我到底如何在 Django 中实现数据库分片。

这就是我的意思:

假设我的分布式系统中有多台机器,所有这些机器之前都使用集中式数据库来读取/写入数据,这很好。我只需在 django 的setting.py 文件中指定它即可。

现在假设,我想为 MYSQL 数据库实现数据库分片,并根据用户名键对服务器进行分片。现在假设当一个请求到来时,Django 将如何准确地进行搜索,我的意思是如何指定它存储我的数据的位置。有什么办法告诉 django 我的数据库是分片的。此外,假设一个请求想要查看多个数据库中可用的内容,它将如何从所有数据库服务器收集数据。由于我所有的数据库服务器现在都有不同的地址,所以我如何在 django 中指定它如何配置这些东西。

或者 dango-python 中是否已经有一个包可以让我实现这一目标。基本上我想从一开始就知道如何使用 Django 为我的分布式系统实现分片。

最佳答案

情况 1:来自一个“用户”的查询仅针对他的数据。 某处有一个映射,表明该用户位于分片 N 上。在哪里?--稍后会详细介绍。

情况 2:查询的目的是对所有用户的信息进行平均。因此,它必须访问所有分片。碎片列表位于某处。哪里?...

无论哪种方式,映射都必须是动态的,因为有一天您会增加分片的数量。

哪里?

案例1:

方案A:每个客户端维护用户和分片之间的映射(多对一)。这可能是本地文件。

B 计划:每个数据库都有一个映射副本。这是如何先进行查找,然后进行“连接”。

C 计划:在访问 API 之前,会拦截请求并从请求中解析出 userID。然后 API 请求发送到特定客户端。 (将其视为客户端级别的分片,而不仅仅是数据库。)

D 计划:在客户端和数据库之间使用代理(HAProxy、MySQL 路由器等)。它负责路由(至少对于单数据库请求)。这可能最接近您的设想。

E 计划:使用 MariaDB 及其“Connectors”或“FederatedX”。这将允许一个数据库连接到达其他数据库连接。注意:某些查询会慢得多。

回到案例 2。您实际上需要一个愿意并且能够同时或顺序连接到所有分片的程序。如果查询需要执行 SUM、COUNT 等操作,则需要您自己完成。

另请参阅“Spider”,最好通过 MariaDB(而不是 MySQL)。

至于“.py”。把你的注意力从对 Django 拥有的狭隘关注上移开。您需要考虑更大,甚至可能不使用 Django。 (抱歉,更具体地说,我对 Django 一无所知。)

关于mysql - 如何使用 Django 实现 MYSQL 数据库的数据库分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377439/

相关文章:

mysql - 如何更正已删除行的自动增量字段(1,2,3,4,5 - 现在是 1,3,5),但我希望它是 1,2,3

php - 在mysql数据库中动态插入非英语(印地语)

django - 注册的模型不显示在管理员中

mysql - 你如何在 MySQL 中存储未定义数量的东西?

php - htmlentities 正在破坏超链接

mysql - 如何在 Laravel 中将 mysql 转换为查询构建器

python - Django prefetch_与FK相关到 View 中

python - 如何在表单完成期间设置外键(python/django)

mysql - Multi-Tenancy 共享数据并按租户排除特定的默认数据

database-design - 我应该如何在数据库中存储列表