MongoDB - 存储电子邮件像素跟踪数据的最佳分片键是什么

MongoDB - What would the best Shard Key be for storing Email Pixel Tracking data

目前我们向邮件列表中的订阅者发送电子邮件。它具有一个映射到 PHP 文件的跟踪像素,然后将数据插入我们的 SQL 服务器数据库。

电子邮件跟踪像素插入的当前平均值约为每天 80,000 次插入。大约 800,000 次插入相当于大约 1GB 的硬盘 space,因此 10 天 1GB 的数据。

除此之外,我们还有其他插入和跟踪数据被插入到 SQL 服务器数据库中,该数据库恰好与网站使用的数据库相同。因此,出于 space、性能、许可成本和水平缩放等原因,我想将此分析跟踪数据从 SQL 服务器数据库中移走 + 网站不需要此分析跟踪数据的事实所以我想把这些写繁重的插入移走,这样网站数据库就可以了。

Table 目前结构

TrackingPixelId |用户名 |代码 |介质 |来源 |查看日期 | SessionId

9109616 |第 1234 章'BULLETIN120115' | 'email' | 'BULLETIN120115' | {日期时间} | bf7e2f801...

列信息

TrackingPixelId : PK 整数自增

UserId: 整数

代码、媒介和来源:Strings/varchars

查看日期:日期时间,例如 2015-01-13 06:18:24.920

SessionId : 例如 fa5cac87896e1c7b423051fffdb836a6

Code 和 Source 本质上是同一件事,是打开的 Email Mail Out 的唯一 ID。

因此,就如何报告数据而言,我们将查看打开的电子邮件数量。所以每日、每周、每月和每年的报告,我们不需要立即生成报告,可能每天需要大量写入,而只需要大量读取,但可能首先需要最新数据。

那么考虑到所有这些因素,最好的分片键是什么?

首先,我要提醒你不要马上跳入分片。根据您的数据量,您应该能够让一个副本集处理您的流量。分片的真正触发点是当工作集变得大于单台机器上 RAM 的合理范围时。

也就是说,鉴于您最关心的是写入性能并且可以容忍较慢的报告读取速度,我认为散列分片键最有效。您可以散列一些唯一 ID 或散列一个 MongoDB 生成的 ObjectId 值。这将保证写入在集群中均匀分布。读取将分散-聚集,但听起来可以容忍以获得非常好的写入缩放。

此外,由于您有兴趣生成每日、每周...报告,我认为您可以采用 hierarchical aggregation 策略来最小化和分摊读取负载,这对于由于分片键的选择,集群比写负载。这将使您可以根据新数据递增地生成报告,然后查询完成的报告,而无需在查询时生成它。我还建议尽可能使用聚合管道而不是 map/reduce 来生成报告数据,即使手册页使用 map/reduce.