分片数据应该相同 [MongoDB]
Sharding shoud data be same [MongoDB]
我正在尝试设置分片,所以我创建了:
- 1 个配置服务器,
- 2 个分片服务器
- 和主服务器
这是我的主服务器的 sh.status
输出:
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("57b86fb87925691e5a11e35f")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.1.3:27018" }
{ "_id" : "shard0001", "host" : "192.168.1.4:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "shardDB", "partitioned" : true, "primary" : "shard0000" }
shardDB.user
shard key: { "name" : 1 }
chunks:
shard0000 1
{ "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
所以我认为它可以工作,但我不确定它是否工作正常。
shard0000
主机上的块:192.168.1.3:27018
与主机 192.168.1.6:27020
上的用户数据具有相同的 user
数据,当我执行 db.users.find()
时,这样可以吗?
我认为重点是在不同的分片上有不同的数据,这样可以减少主服务器的负载?
弗拉德,
这是生产系统吗?如果是,你应该有 3 个配置服务器,每个分片应该是一个副本集,每个分片至少有 3 个 mongod 守护进程。您当前的设置适合开发人员,但不应部署在 PROD 中。
Look at this document to see the architecture.
mongos是路由器,不是主控。尽管您应该始终从 mongos 查询您的系统,但数据物理上驻留在您的分片服务器中。同样,mongos 只是一个路由器,当您的应用程序访问集群时,它会将您的查询发送到正确的位置。
您目前只能在一个分片中看到数据的原因是您还没有足够的数据将其分布到两个分片中。随着数据量的增长 MongoDB 将 "automagically" 创建新的 "data chunks" 并将它们移动到新的分片以保持集群平衡。
我还注意到您正在使用时间戳作为您的分片键。使用时间作为分片键通常是一个糟糕的选择,原因有两个:
- LOADING - 如果您要插入按时间排序的数据或数据
对于最后一个 (day/hour/minute) 所有插入都将转到相同的位置
数据块,因此到同一个分片。那会
意味着无论有多少,您的插入都不会缩放
您添加到集群的服务器。
- 正在阅读 - 如果您的分片键是时间戳,并且您经常查询
按天、按周或按月收集您的阅读查询
将随时广播到所有分片。这又会
即使您添加了更多服务器,也会导致您的系统无法扩展。
我上面描述的问题只会随着您的数据量 and/or 查询量的增加而变得明显。
我正在尝试设置分片,所以我创建了:
- 1 个配置服务器,
- 2 个分片服务器
- 和主服务器
这是我的主服务器的 sh.status
输出:
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("57b86fb87925691e5a11e35f")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.1.3:27018" }
{ "_id" : "shard0001", "host" : "192.168.1.4:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "shardDB", "partitioned" : true, "primary" : "shard0000" }
shardDB.user
shard key: { "name" : 1 }
chunks:
shard0000 1
{ "name" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
所以我认为它可以工作,但我不确定它是否工作正常。
shard0000
主机上的块:192.168.1.3:27018
与主机 192.168.1.6:27020
上的用户数据具有相同的 user
数据,当我执行 db.users.find()
时,这样可以吗?
我认为重点是在不同的分片上有不同的数据,这样可以减少主服务器的负载?
弗拉德,
这是生产系统吗?如果是,你应该有 3 个配置服务器,每个分片应该是一个副本集,每个分片至少有 3 个 mongod 守护进程。您当前的设置适合开发人员,但不应部署在 PROD 中。
Look at this document to see the architecture.
mongos是路由器,不是主控。尽管您应该始终从 mongos 查询您的系统,但数据物理上驻留在您的分片服务器中。同样,mongos 只是一个路由器,当您的应用程序访问集群时,它会将您的查询发送到正确的位置。
您目前只能在一个分片中看到数据的原因是您还没有足够的数据将其分布到两个分片中。随着数据量的增长 MongoDB 将 "automagically" 创建新的 "data chunks" 并将它们移动到新的分片以保持集群平衡。
我还注意到您正在使用时间戳作为您的分片键。使用时间作为分片键通常是一个糟糕的选择,原因有两个:
- LOADING - 如果您要插入按时间排序的数据或数据 对于最后一个 (day/hour/minute) 所有插入都将转到相同的位置 数据块,因此到同一个分片。那会 意味着无论有多少,您的插入都不会缩放 您添加到集群的服务器。
- 正在阅读 - 如果您的分片键是时间戳,并且您经常查询 按天、按周或按月收集您的阅读查询 将随时广播到所有分片。这又会 即使您添加了更多服务器,也会导致您的系统无法扩展。
我上面描述的问题只会随着您的数据量 and/or 查询量的增加而变得明显。