{ "_id" : { "ns" : "records.users", "min" : { "zipcode" : "10001" } }, "ns" : "records.users", "min" : { "zipcode" : "10001" }, "max" : { "zipcode" : "10281" }, "tag" : "NYC" }
7,settings 集合记录均衡器状态和chunk的大小,默认的chunk size是64MB。
{ "_id" : "chunksize", "value" : 64 } { "_id" : "balancer", "stopped" : false }
8,locks 集合记录分布锁(distributed lock),保证只有一个mongos 实例能够在分片集群中执行管理任务。
mongos在担任balancer时,会获取一个分布锁,并向config.locks中插入一条doc。
The locks collection stores a distributed lock. This ensures that only one mongos instance can perform administrative tasks on the cluster at once. The mongos acting as balancer takes a lock by inserting a document resembling the following into the locks collection.
{ "_id" : "balancer", "process" : "example.net:40000:1350402818:16807", "state" : 2, "ts" : ObjectId("507daeedf40e1879df62e5f3"), "when" : ISODate("2012-10-16T19:01:01.593Z"), "who" : "example.net:40000:1350402818:16807:Balancer:282475249", "why" : "doing balance round" }
三,删除分片
删除分片时,必须确保该分片上的数据被移动到其他分片中,对于以分片的集合,使用均衡器来迁移数据块,对于非分片的集合,必须修改集合的主分片。
1,删除已分片的集合数据
step1,保证均衡器是开启的
sh.setBalancerState(true);
step2,将已分片的集合全部迁移到其他分片
use admin
db.adminCommand({"removeShard":"shard_name"})
removeShard命令会将数据块从当前分片上迁移到其他分片上去,如果分片上的数据块比较多,迁移过程可能耗时很长。
step3,检查数据块迁移的状态
use admin db.runCommand( { removeShard: "shard_name" } )
使用removeShard命令能够查看数据块迁移的状态,remaining 字段表示剩余数据块的数量
{ "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : 42, "dbs" : 1 }, "ok" : 1 }
step4,数据块完成迁移
use admin db.runCommand( { removeShard: "shard_name" } ) { "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "shard_name", "ok" : 1 }
2,删除未分片的数据库
step1,查看未分片的数据库
未分片的数据库,包括两部分:
数据库未被分片,该数据没有使用sh.enableSharding("db_name"),在数据库config中,该数据库的partitioned字段是false
数据库中存在collection未被分片,即当前的分片是该集合的主分片
use config
db.databases.find({$or:[{"partitioned":false},{"primary":"shard_name"}]})
对于partitioned=false的数据库,其数据全部保存在当前shard中;对于partitioned=true,primary=”shard_name“的数据库,表示存在未分片(un-sharded collection)存储在该数据库中,必须变更这些集合的主分片。
step2,修改数据库的主分片
db.runCommand( { movePrimary: "db_name", to: "new_shard" })
四,增加分片
由于分片存储的是数据集的一部分,为了保证数据的高可用性,推荐使用Replica Set作为shard,即使Replica Set中只包含一个成员。连接到mongos,使用sh辅助函数增加分片。
sh.addShard("replica_set_name/host:port")
不推荐将standalone mongod作为shard
sh.addShard("host:port")
五,特大块