我应该如何为分片建模数据?

时间:2014-03-09 06:35:43

标签: database language-agnostic redis sharding

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

this article about using Redis as a primary datastore中,作者强调

  

您需要围绕分片设计数据

我对设计标准感到困惑:

  • 我对SQL的东西不是很熟悉,但是如果我使用的是一个只知道密钥和值/文件的noSQL数据库,我的数据已经“可以”了吗?
  • 或者值/文档是否也必须是统一模式?
  • 我还缺少其他标准吗?

作者还提到了

  

最困难的部分是明确定义如何将数据细分为[分片]。这是一个非常特定于应用程序的问题

  • “数据分割”是否与“数据设计”问题相关/相同?

1 个答案:

答案 0 :(得分:1)

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

与Redis(以及一般的NoSQL数据库)一样,您必须根据请求的方式设计数据模型。

有一篇关于redis website数据分区的详细文章。它比我能写的任何答案都要完整得多:)

为了它的价值,我使用Redis作为主数据存储区实现了一个完整的Web应用程序,首先作为实验。这是一个社交网络,有一个多标准的搜索引擎。我想我必须在某个时候切换到更传统的解决方案(比如添加关系数据库)。我很惊讶我没有这样做。我必须处理的每个用例(包括搜索引擎)都很容易使用Redis实现。 Redis让我获得了令人印象深刻的表现。但我不得不考虑很多关于数据建模,数据丢失是否可接受(并创建健壮的算法,能够透明地重新启动崩溃中断的进程),如何限制内存消耗......以及设计我的数据根据这个。

最后但并非最不重要的是,Redis Cluster正在进行中,可能会为您提供分片解决方案。但是它还没有生产就绪,与单个redis实例(每个实例只有一个数据库)相比,它将受到限制。