MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了。
但是缩减集群(删除分片)这种一般很少用到。由于曙光的某服务器又挂了,所以我们送修之前必须把它上面的数据自动迁移到其他Shard上。
1、执行RemoveShard命令
1 |
db.runCommand( { removeshard: "your_shard_name" } )
|
3 |
{ msg : "draining started successfully" , state: "started" , shard : "mongodb0" , ok : 1 }
|
上面这句会立即返回,实际在后台执行。
2、查看迁移状态
我们可以反复执行上面语句,查看执行结果。
1 |
db.runCommand( { removeshard: "your_shard_name" } )
|
3 |
{ msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 }
|
从上面可以看到,正在迁移,还剩下42块没迁移完。
当remain为0之后,这一步就结束了。
3、移出非Shard数据
1 |
db.runCommand( { movePrimary: "myapp" , to: "mongodb1" })
|
这次就不是立即返回了,需要很久,然后会返回如下:
1 |
{ "primary" : "mongodb1" , "ok" : 1 }
|
4、最后的清理
上面步骤都完成后,还需要再执行一次RemoveShard,清理残余数据。
1 |
db.runCommand( { removeshard: "mongodb0" } )
|
执行成功后,会如下结果:
1 |
{ msg: "remove shard completed succesfully" , stage: "completed" , host: "mongodb0" , ok : 1 }
|
显示completed后,就可以安心的关闭mongod的进程了。
一些遇到的问题:
Popgo: In my MongoDB sharding cluster, i used db.runCommand( { removeshard: "shard3" } )
command to remove a shard "shard3", but it just puts the shard in
draining mode, which will never end and three days past. All chunks of
the shard "shard3" are moved into "shard1" or "shard2", but the APP read
request can use it to query data. So i want to know which process of
the sharding now or how to diagnose this problem?
MrKurt:You probably have a database using shard3
as its primary shard, check the output of db.printShardingStatus()
to see where each database resides.
Once you figure out which database it is, move it to a different shard with the movePrimary
command. Then run removeShard
again and you should be good to go.
Popgo:
Andre: You do need to run movePrimary to complete
draining in the case of a db being on the primary. If you look at the
results of the removeshard
and see "chunks" : NumberLong(0)
but "dbs": NumberLong(
some number other than 0 )
you probably have a DB whose primary is the shard you are removing and will probably have to run movePrimary even though removeshard
hasn't said "draining is complete". Check out this discussion on mongodb-user for more information:
相关的官方文档:http://docs.mongodb.org/manual/tutorial/remove-shards-from-cluster/
注意官方关于是否需要运行movePrimary的说明:
Databases with non-sharded collections store those collections on a
single shard known as the primary shard for that database. The
following step is necessary only when the shard to remove is
also the primary shard for one or more databases.
也就是说,如果在这个片上有非分片的collection,这样的话,分片的数据合到其他片上了,那么剩下的非分片数据,没法通过合并分片的方式合到其他服务器上,所以这时要运行一个movePrimary命令将这些非分片的数据移到另一个服务器上。db.runCommand( { movePrimary: "myapp", to: "mongodb1" })
This command migrates all remaining non-sharded data in the
database named myapp to the shard named mongodb1
还有一个官方说明需要注意的是:
Warning
Do not run the movePrimary until you have finished
draining the shard
也就是说,一定要等到分片数据迁移完了,再运行movePrimary命令!!!
而且这句命令不像removeshard是异步的,这个movePrimary命令会等到将所有非分片数据都移到其他服务器后,才响应,所以时间有可能会比较长,主要还是看这个服务器上,非分片数据有多少。
另外,movePrimary执行完后,还记得将db.runCommand({removeshard:"shardx"})再运行一遍,直到看到如下结果{ msg: "remove shard completed successfully" , stage: "completed", host: "mongodb0", ok : 1 }
到此为止,迁移才真正完成,可以放心地关闭mongod。
about how to identify the non-sharding databases int server2, to run:db.printShardingStatus();
references:
If you need to figure out which database the removeshard output refers
to, you can use the printShardingStatus command. It will tell you what
is the "primary" shard for each non-partitioned database.
If any of the DBs have the drained shard listed as the primary, you
will need to issue a move primary command (again listed on the page
linked).
最后一个疑问是:在迁移的过程中,mongos是打到哪个分片上?迁移的具体执行是copy还是move?比如从服务器B合到A,在这个过程中,流量是打到B,还是全打到A?已合到A的分块去A中取,还是从B中取?
还有一个问题:如果总共就两个分片,将一个分片合回到新分片后,相关collections的分片策略可以更改了吗?因为分片的策略一旦确定后是无法修改的,但对于这种情况又是如何的呢?
有了解的朋友麻烦介绍一下呗!!!
公司现在的用户数据的一个片需要迁移回去,等具体执行后再整理以上文字吧。
分享到:
相关推荐
MongoDB允许动态调整分片,如添加、移除分片,或者重新分片集合以优化数据分布。此外,根据业务需求,可以使用范围分片、哈希分片等不同策略。 总的来说,MongoDB的分片技术旨在提供可扩展性和高性能,通过合理配置...
为了保证数据分布的均衡性(Maintaining a Balanced Data Distribution),MongoDB提供了分片数据块(Chunk)的自动分割(Splitting)、平衡(Balancing)机制,以及在集群中增加或移除分片(Adding and Removing ...
- **添加和移除分片**:随着业务需求变化,可以动态添加或移除分片以调整集群规模。 - **平衡器(Balancer)**:MongoDB内置的平衡器负责在分片之间移动数据块,保持集群均衡。 - **监控与诊断**:使用`db....
在移除分片前,确保分片平衡器是开启的。通过`sh.getBalancerState()`命令检查状态,返回`true`表示开启。 2. **开始移除分片**: 使用`removeShard`命令来标记分片为待移除。在admin数据库下执行此命令,例如:`...
为了确保分片群集的健康运行,需要定期监控各个组件的状态,检查分片平衡,以及进行必要的维护操作,如添加或移除分片,调整分片策略等。 总的来说,MongoDB 4.0的分片群集是应对大数据量和高并发场景的重要工具。...
添加分片服务器可以通过指定新的服务器地址来完成,而移除分片服务器则涉及到从集群中删除指定服务器的所有数据。 在对分片集群进行操作时,必须考虑数据的完整性和系统的稳定性。比如在移除分片服务器时,需要确保...
3. 动态扩展:MongoDB的分布式架构允许在不中断服务的情况下添加或移除分片服务器,以应对日志数据量的增长或减少。配置服务器会自动传播这些变化,使系统保持高效运行。 三、日志系统的优点 1. 高可用性:通过...
4. **动态扩展**:随着数据的增长,可以动态添加或移除分片,以适应变化的数据量和工作负载。 总结来说,MongoDB的基础操作涵盖了数据库的基本管理、数据的增删改查,而副本集和分片则是其在高可用性和可扩展性方面...
每个分片可以独立管理一部分数据,当数据量增加时,可以动态添加或移除分片。 4. **高性能**:MongoDB使用内存映射技术,将数据存储在内存中,读写速度非常快。同时,其索引机制也大大提高了查询效率。 5. **灵活...
随着数据量的增长,可能需要动态添加或移除分片。MongoDB提供了灵活的扩展机制,可以在不影响服务的情况下进行扩容或缩容。 总结来说,“mongodb数据库分离和系统切换方案”涵盖了MongoDB集群的核心概念,包括数据...
- **动态分片**:在2.6版本中,用户可以在不停止服务的情况下进行分片配置更改,如添加或移除分片,增强了系统的可扩展性。 - **复制集增强**:复制集的选举过程得到了优化,减少了在主节点故障时的恢复时间。同时...
MongoDB性能优化和架构管理方面,开发者需要关注数据库的索引、复制、分片等技术。索引可以加速查询操作,而复制可以保证数据的高可用性。分片则是一种扩展数据库的方法,可以将数据分散存储在多个服务器上。 固定...
在“mongodbtest”中,可能还包含了如何设置和管理复制集、分片的步骤,以及如何备份和恢复MongoDB数据的相关教程。这些操作对于理解MongoDB在生产环境中的应用至关重要。 总的来说,这个“mongodb例子”将帮助初学...
3. 自动分片:MongoDB的分片功能允许数据自动分散到多个节点上,有助于处理海量数据并提高读写性能。 4. 弹性伸缩:在云计算环境中,MongoDB可以轻松地添加或移除硬件资源,适应业务量的变化。 5. 强大的查询语言...
当需要添加或移除分片时,可以通过`sh.removeShard()`命令操作。 在真实生产环境中,除了以上步骤,还需要考虑安全性、网络配置、备份恢复策略以及性能优化等更多细节。例如,设置认证以保护数据,规划网络架构以...
MongoDB的分片是基于区域的,所以一个集合的所有对象都放置在同一个块中,只有当存在多余一个块的时候,才会有多个分片。 获取数据的选项是什么? 可以通过db._adminCommand("connPoolStats");来查看Mongo正在使用...
5. 负载均衡:分片集群能自动将数据分布在各个节点,但需要手动添加或移除分片以适应数据增长。 6. 监控与维护:定期检查集群状态,监控资源使用情况,调整分片策略,确保数据一致性,并进行定期备份。 以上就是 ...