什么是我的架构最好的Mongodb Sharding密钥?

时间:2015-06-26 11:16:32

标签: mongodb sharding

我设计的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 个答案:

答案 0 :(得分:1)

您有多种选择:

  1. {ts: 1}您的时间戳。某些范围的数据将位于一起,但关键是单调递增,我不确定TTL索引是否会清理碎片块。意味着:写入负载从分片切换到分片,并且您有一个具有高写入负载的分片,而其他分片将不会对数据进行写入。如果您查询连续的时间范围但是在写作方面存在缺点,则此模式可以很好地工作。
  2. {ts: "hashed"}基于哈希的分片。数据将在分片中或多或少地均匀分片。基于散列的分片会分配写入负载,但在查询数据时会涉及所有分片(或多或少)。
  3. 您需要测试什么最适合您的读写操作。分片键取决于数据结构和应用程序的读/写模式。