我的架构最好的 Mongodb 分片键是什么?

What is the best Mongodb Sharding key for my schema?

我正在设计一个Mongodb集合,可以保存每日交易量的统计数据

这是我的数据库架构

mongos> db.arq.findOne()
{
    "_id" : ObjectId("553b78637e6962c36d67c728"),
    "ip" : NumberLong(635860665),
    "ts" : ISODate("2015-04-25T00:00:00Z"),
    "values" : {
        "07" : 2,
        "12" : 1
    },
    "daily_ct" : 5
}
mongos>

这是我的索引

mongos> db.arq.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "Query_Volume.test"
    },
    {
        "v" : 1,
        "key" : {
            "ip" : 1
        },
        "name" : "ip_1",
        "ns" : "Query_Volume.test"
    },
    {
        "v" : 1,
        "key" : {
            "ts" : 1
        },
        "name" : "ts_1",
        "expireAfterSeconds" : 15552000,
        "ns" : "Query_Volume.test"
    }
]
mongos>

注意:我有一个时间戳索引,因为我需要使用TTL机制。

但是Sharding Key有什么建议吗?

您有多种选择:

  1. {ts: 1} 您的时间戳。一定范围的数据会放在一起,但是key是单调递增的,不知道TTL索引会不会清理shard chunks。意思是:写负载从一个分片切换到另一个分片,你有一个写负载高的分片,而其他分片将没有数据写入。如果您查询连续的时间范围,但这种模式在写作上有缺点。
  2. {ts: "hashed"} 基于哈希的分片。数据将或多或少均匀地分布在各个分片中。基于哈希的分片分配写入负载,但在查询数据时涉及 所有 个分片(或多或少)。

您将需要测试最适合您的读写的内容。分片键取决于数据结构和应用程序的 read/write 模式。