1

我正在为我的应用程序启动数据存储服务。MongoDB 作为存储机制运行,我创建了 2 个分片来启动。

应用程序将存储事件数据,所有数据的结构如下:

{ 
  _id: '4fa2f7e25626cd1374000002', 
  created_at: '2012-05-03T21:25:54 00:00', 
  name: 'client_session_connect', 
  session_remote_id: '74ACF9AA-9E09-11E1-8C9E-8462380DA5E6', 
  zone_id: '74ACF9AA-9E09-11E1-8C9E-1231380DA5E6',
  additional: {
    some_other_key: 'value'
  }
} 

事件将有多种名称,任何新事件都可以随时使用新事件名称创建。系统中会有很多同名的事件。_id、created_at 和 name 将成为每个事件的一部分,但不保证其他值。

根据我所阅读的内容(此处此处),似乎最好的分片键是 { name: 1, created_at: 1 }。我的解释是否正确?

4

1 回答 1

4

从您所说的来看,这似乎是一个很好的分片键,但有一些注意事项:

- 分片键是不可变的,因此如果您需要更改文档的“名称”字段,则需要删除并重新插入它(可能这对您来说不是问题,除非您打算经常更改名称) .

- 如果您连续快速编写大量具有相同“名称”的文档,所有这些写入将转到同一个块,因为“created_at”可能是一个增加的字段。最终,该块将被拆分为多个块并在接收机器上平衡,因此如果您希望接收大量具有相同“名称”的文档写入,这只是一个问题。

- 如果“名称”不是均匀分布的,您可以对名称进行哈希处理并将结果存储在文档的新字段中,然后制作分片键 {hashedName : 1, created_at : 1}。这可能会提供更均匀的负载分布,从而减少以后的平衡量。不过,它确实为您的文档增加了一点复杂性。

假设您知道这些事情,{name: 1, created_at: 1} 很可能是最适合您的分片键。

于 2012-06-07T20:58:07.007 回答