设想:
10.000.000 条记录/天
记录:访客、访问日期、集群(我们在哪里看到)、元数据
我们想通过这些信息知道什么:
- 给定日期范围内一个或多个集群上的唯一访问者。
- 每日独立访客
- 对给定范围(平台、浏览器等)的元数据进行分组
为了轻松查询此信息,我坚持使用的模型是:
{
VisitorId:1,
ClusterVisit: [
{clusterId:1, dates:[date1, date2]},
{clusterId:2, dates:[date1, date3]}
]
}
指数:
- 按访客 ID(以确保唯一性)
- 通过 ClusterVisit.ClusterId-ClusterVisit.dates(用于搜索)
- 通过 IdUser-ClusterVisit.IdCluster(用于更新)
我还必须将集群组拆分为不同的集合,以便更有效地访问数据。
导入:首先我们搜索 VisitorId - ClusterId 的组合,然后我们 addToSet 日期。
第二:如果 first 不匹配,我们插入:
$addToSet: {VisitorId:1,
ClusterVisit: [{clusterId:1, dates:[date1]}]
}
如果 clusterId 不存在或 VisitorId 不存在,我会介绍第一次和第二次导入。
问题:当集合增长时,更新/插入/更新完全低效(几乎不可能),我猜是因为添加新日期时文档大小变大。难以维护(主要是未确定的日期)
我有一个超过 50.000.000 个的集合,我不能再增长了。它仅更新 100 ~ 记录/秒。
我认为我使用的模型对于这种信息量来说并不是最好的。在我搞乱分片之前,你认为最好获得更多 upsert/sec 并快速查询信息,这将花费更多时间,而我学习并对此充满信心。
我在 AWS RAID 10 上有一个带有 10 个磁盘的 x1.large 实例