我应该如何为分片建模?

How should I model data for sharding?

提问人:kdbanman 提问时间:3/9/2014 更新时间:3/9/2014 访问量:78

问:

通过阅读高级文档,我对数据库分片有了概念性的理解,但我还没有读过很多代码,也没有自己做过任何这样的黑客攻击。

在这篇关于使用 Redis 作为主数据存储的文章中,作者强调

您需要围绕分片设计数据

我对设计标准感到困惑:

  • 我对 SQL 的东西不是很熟悉,但是如果我使用的是只知道键和值/文档的 noSQL 数据库,我的数据是否已经“可分片”?
  • 或者值/文档是否也需要具有统一的架构?
  • 我是否缺少其他标准?

作者还提到

其中最困难的部分是明确定义如何将数据分割成分片。这是一个非常特定于应用的问题

  • “数据分割”是否与“数据设计”问题相关/相同?
与数据库 语言无关的 Redis 分片

评论


答:

1赞 Pascal Le Merrer 3/9/2014 #1

从本质上讲,Redis 中的分片比关系数据库中的分片要容易得多,因为数据之间没有关系。您可以根据自己的算法在应用程序级别定义数据在 Redis 实例之间的分配方式。你可以说它与数据设计有关。举例来说,你可以说实体是根据其性质(一个数据库中的用户,另一个数据库中的产品)或根据它们的 ID(数据库中名称以 A 到 L 开头的用户,在另一个数据库中从 M 到 Z)进行分片的。

像往常一样,对于Redis(以及一般的NoSQL数据库),你必须根据你请求它们的方式来设计你的数据模型。

redis网站上有一篇关于数据分区的详细文章。这将比我能写的任何答案都完整得多:)

值得一提的是,我首先使用 Redis 作为主数据存储,为自己实现了一个完整的 Web 应用程序,作为实验。这是一个社交网络,有一个多条件搜索引擎。我以为在某个时候我必须切换到更传统的解决方案(例如添加关系数据库)。我很惊讶我没有这样做。我必须处理的每个用例(包括搜索引擎)都可以使用 Redis 轻松实现。Redis 让我取得了令人印象深刻的性能。但是我不得不考虑很多关于数据建模的问题,哪些数据丢失是可以接受的,哪些是不可接受的(并创建强大的算法,以便能够透明地重新启动被崩溃中断的进程),如何限制内存消耗......并据此设计我的数据。

最后但并非最不重要的一点是,Redis 集群即将推出,可能会为您提供分片解决方案。但它尚未准备好生产,并且与单个 redis 实例(例如,每个实例只有一个数据库)相比会受到限制。

评论

0赞 kdbanman 3/9/2014
有趣。我会密切关注 Redis 集群 - 它可能正是我未来正在寻找的东西。那篇 Redis 文章是一个很好的参考。