MongoDB 分片管理详解(2)

{ "_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")

五,特大块

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a03a08da3bf84d01d4b7e429128849e1.html