我的架构最好的 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有什么建议吗?
您有多种选择:
{ts: 1}
您的时间戳。一定范围的数据会放在一起,但是key是单调递增的,不知道TTL索引会不会清理shard chunks。意思是:写负载从一个分片切换到另一个分片,你有一个写负载高的分片,而其他分片将没有数据写入。如果您查询连续的时间范围,但这种模式在写作上有缺点。
{ts: "hashed"}
基于哈希的分片。数据将或多或少均匀地分布在各个分片中。基于哈希的分片分配写入负载,但在查询数据时涉及 所有 个分片(或多或少)。
您将需要测试最适合您的读写的内容。分片键取决于数据结构和应用程序的 read/write 模式。
我正在设计一个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有什么建议吗?
您有多种选择:
{ts: 1}
您的时间戳。一定范围的数据会放在一起,但是key是单调递增的,不知道TTL索引会不会清理shard chunks。意思是:写负载从一个分片切换到另一个分片,你有一个写负载高的分片,而其他分片将没有数据写入。如果您查询连续的时间范围,但这种模式在写作上有缺点。{ts: "hashed"}
基于哈希的分片。数据将或多或少均匀地分布在各个分片中。基于哈希的分片分配写入负载,但在查询数据时涉及 所有 个分片(或多或少)。
您将需要测试最适合您的读写的内容。分片键取决于数据结构和应用程序的 read/write 模式。