Mongodb 删除添加分片与非分片表维护
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
一、如何移除分片
1、确认balancer已经开启
mongos>sh.getBalancerState()
true
2、移除分片
注:在admindb下执行命令。
mongos>useadmin switchedtodbadmin mongos>db.runCommand({removeShard:"shard3"}) { "msg":"drainingstartedsuccessfully", "state":"started", "shard":"shard3", "ok":1 }
3、检查迁移的状态
同样执行
mongos>useadmin switchedtodbadmin mongos>db.runCommand({removeShard:"shard3"}) { "msg":"drainingongoing", "state":"ongoing", "remaining":{ "chunks":NumberLong(3), "dbs":NumberLong(0) }, "ok":1 }
remaining中的chunks表示还有多少数据块未迁移。
4、移除未分片数据
Inacluster,adatabasewithunshardedcollectionsstoresthosecollectionsonlyonasingleshard.
Thatshardbecomestheprimaryshardforthatdatabase.(Differentdatabasesinaclustercanhavedifferentprimaryshards.)
WARNING
Donotperformthisprocedureuntilyouhavefinisheddrainingtheshard.
1)Todetermineiftheshardyouareremovingistheprimaryshardforanyofthecluster'sdatabases,issueoneofthefollowingmethods:
sh.status()
db.printShardingStatus()
Intheresultingdocument,thedatabasesfieldlistseachdatabaseanditsprimaryshard.
Forexample,thefollowingdatabasefieldshowsthattheproductsdatabaseusesmongodb0astheprimaryshard:
{"_id":"products","partitioned":true,"primary":"mongodb0"}
2)Tomoveadatabasetoanothershard,usethemovePrimarycommand.Forexample,tomigrateallremainingunshardeddatafrommongodb0tomongodb1,
issuethefollowingcommand:
useadmin
db.runCommand({movePrimary:"products",to:"mongodb1"})--products为dbname
ThiscommanddoesnotreturnuntilMongoDBcompletesmovingalldata,whichmaytakealongtime.
Theresponsefromthiscommandwillresemblethefollowing:
{"primary":"mongodb1","ok":1}
IfyouusethemovePrimarycommandtomoveun-shardedcollections,youmusteitherrestartallmongosinstances,
orusetheflushRouterConfigcommandonallmongosinstancesbeforewritinganydatatothecluster.
Thisactionnotifiesthemongosofthenewshardforthedatabase.
Ifyoudonotupdatethemongosinstances'metadatacacheafterusingmovePrimary,themongosmaynotwritedatatothecorrectshard.
Torecover,youmustmanuallyintervene.
根据上面所说,迁移非分片表时最好停机,在运行db.runCommand({movePrimary:"products",to:"mongodb1"})命令完成之后,刷新所有mongos后(所有mongos上运行db.runCommand("flushRouterConfig")),再对外提供服务。当然也可以重新启动所有mongos实例。
5、完成迁移
mongos>useadmin switchedtodbadmin mongos>db.runCommand({removeShard:"shard3"}) { "msg":"removeshardcompletedsuccessfully", "state":"completed", "shard":"shard3", "ok":1 }
如果state为completed,表示已完成迁移。
二、添加分片
1、首先确认balancer已经开启
mongos>sh.getBalancerState()
true
2、执行添加分片的命令
如果出现以下错误,删除目标shard3上的test1数据库,再次执行命令
mongos>sh.addShard("shard3/192.168.137.138:27019") { "ok":0, "errmsg":"can'taddshardshard3/192.168.137.138:27019becausealocaldatabase'test1'existsinanothershard1:shard1/192.168.137.111:27017,192.168.137.75:27017" } mongos>sh.addShard("shard3/192.168.137.138:27019") {"shardAdded":"shard3","ok":1}
最后运行sh.status()命令确认迁移是否成功,可能会花比较长的时间。
以上内容是给大家介绍了Mongodb删除添加分片与非分片表维护的全部叙述,希望对大家有所帮助。