我尝试在MongoDB中测试分片。例如,我使用host1.com和host2.com代替真实的服务器名称。
所以我在host1.com上创建了配置服务器:
mongod --dbpath /path/to/configdb/ --configsvr
在同一台计算机上启动mongos
:
mongos --configdb host1.com --port 27020
在两台计算机(host1.com和host2.com)上启动mongod
:
mongod --dbpath /path/to/test_shard_db/ --shardsvr
我添加了分片,为数据库test
启用了分片,并使用分片键{'name':1}启用了分片test
(集合只有此字段,_id
用于测试)在教程中。但是在完成所有这些操作之后,我的所有数据都只写入一个分片,这是数据库的主要分片。
这是config:
分片状态:
mongos> db.printShardingStatus()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "host1.com:27018", "maxSize" : NumberLong(1) }
{ "_id" : "shard0001", "host" : "host2.com:27018", "maxSize" : NumberLong(10) }
databases:
...
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
test.test chunks:
shard0001 1
{ "name" : { $minKey : 1 } } -->> { "name" : { $maxKey : 1 } } on : shard0001 Timestamp(1000, 0)
收集统计数据:
mongos> db.printCollectionStats()
test
{
"sharded" : false,
"primary" : "shard0000",
"size" : 203535788,
...
}
平衡器状态:
mongos> sh.isBalancerRunning()
true
那么为什么集合中的所有数据只驻留在一个碎片中,虽然我添加了超过1兆字节的数据?为什么db.printCollectionStats()
向我显示test
数据库"sharded" : false
。我做错了什么?
答案 0 :(得分:3)
默认的块大小为64MB,因此在分割发生之前你有增长的空间。您可以事先自己拆分分片键范围,这样可以允许写入从一开始就转到多个分片。有关详细信息,请参阅MongoDB Split Chunks documentation。
关于块大小和maxSize之间的区别:
maxSize将限制给定分片上的数据量。到达平衡器时,将查看将块移动到尚未达到maxSize的分片。块是一组文档,它们都属于分片键范围的一部分。 MongoDB平衡器将在块级别的分片之间移动数据以平衡。当块接近maxSize值时,它将被拆分为2,这可能会导致移动。