我正在为我的应用程序启动数据存储服务。 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将成为其中的一部分 每个事件,但没有其他价值保证。
基于我所阅读的内容(here和here),似乎最好的分片密钥会 是{name:1,created_at:1}。我会纠正这个吗? 解释
答案 0 :(得分:4)
从您所说的内容来看,这似乎是一个很好的分片密钥,但有几点需要注意:
-shard键是不可变的,所以如果你需要更改" name"文档的字段,您需要删除并重新插入它(可能这对您来说不是问题,除非您打算经常更改名称)。
- 如果你用相同的"名称"写了很多文件。在快速连续中,所有这些写入都将转到同一块,因为" created_at"可能是一个日益增长的领域。最终,块将被拆分为多个块并在接收机器之间进行平衡,因此如果您希望接收大量具有相同"名称的文档,这只是一个问题。"
- 如果" name" s不是均匀分布的,您可以散列名称并将结果存储在文档的新字段中,然后生成分片键{hashedName:1,created_at:1 }。这可能会提供更均匀的负载分布,从而减少以后的平衡量。但它确实为您的文档增加了一些复杂性。
假设您已经意识到这些事情,{name:1,created_at:1}可能是您最好的分片键。