mongo的数据恢复和迁徙

mongo单实例部署

1.由一个mongo形成,对外提供服务。毛病:如果一个节点挂了,就没有方法对外提供服务。数据无备份,平安差。

mongo正本集部署

1.正本集部署。个别是有3个节点(为了投票,和超过半数。如果2个节点,挂了一个,另外一个不能对外。不能选举成主节点)。惯例的有 primary - secondary - secondary (P - S - S) . 然而如果为了节约资源,能够将一个seconday改成仲裁节点Arbiter(只负责投票,不同步数据) ,变成了 P- S -A。挂了一个,另一个数据承载节点能够被选为主节点。

2.部署抉择,最好抉择P - S -S .这样挂了一个齐全不会有问题。 然而如果抉择 P - S -A 部署。挂一个数据节点。变成 P - A 。能够一段时间保留失常。然而几个小时后,缓缓的主节点变慢。flowControl机制限度主节点写入,还有其余的问题。

参考:https://www.mongodb.com/docs/...

mongo分片集群部署

mongos: 次要是做拜访路由,

mongo_cs (config servers): 保留调配的元数据和分片的集群配置。从3.4版本后,改成了正本集的部署。

shard : 分片数据的承载节点。能够是正本集,也能够是单实例。个别为了平安都是正本集。

参考:https://www.mongodb.com/docs/...

分片集群的保护

分片集群的问题,根本都是因为shard调配的数据问题。演绎也就是某个调配的正本集的数据有问题。因为正本集的压力个别都大。导致oom等各种问题。

如果发现mongo有问题。能够先进入mongos,执行sh.status()。查看集群分片信息。

进入问题的分片的mongod中,执行rs.status() 。能够看到具体的正本集的信息。能够看到正本集节点的状态信息。

正本集数据恢复

  1. 正本集的主从同步是通过从节点去主节点查问oplog.而后在本人这个重放,达到数据的始终性。然而因为oplog的大小是受限的rs.printReplicationInfo()

。所以如果一个节点down机太久。会导致主节点没有他须要的oplog.这是节点变成了stale状态。这种状况只能进行全量的数据同步。

计划一:先将故障节点平安关mongo,db.shutdownServer() ,间接将故障节点的数据目录备份。清空数据目录。而后重启。这样从节点会从主节点copy数据。能够在故障的节点查问日志。 INITSYNC 的关键字。能够看到执行的copy的信息。有点主节点能够持续服务。毛病:同时的工夫长。

计划二:将主节点平安关mongo。将数据的目录全量拷贝到故障节点。将故障节点的数据备份。而后将copy来的数据放到数据目录。而后主节点mongo启动,从节点启动。数据就统一了。

参考: https://www.mongodb.com/docs/...

危险操作

有时候发现mongo长时间无奈优雅关机,导致最初kill -9 . 这种状况会呈现mongo的数据查看。而后mongo日志发现 REPL 的操作日志。查问操作日志的工夫。如果操作日志间隔以后工夫比拟近,最好期待。如果预计很长时间不能复原。且焦急复原服务的可用。在关机mongo。删掉数据目录中的mongd.lock文件,清空journal目录。这种办法会导致数据的失落。会回到上一个checkpoint的工夫点的数据。不是没有方法。不要应用该办法。

数据迁徙

计划一: 分片集群的数据迁徙。通过mongodump将所有的数据导出,而后将数据倒入新的集群。长处:简略,毛病:工夫长。

计划二:mongod , mongo_cs都是正本集的部署。能够将原始的集群的正本集将新的机器退出。而后本成了6节点的正本集。而后将老机器从正本集中剔除。

操作步骤: 老集群的正本集的数据copy到新集群的对应机器。而后将新机器退出集群。数据同步实现就剔除老机器。更加具体的迁徙见官网文档。

参考: https://www.mongodb.com/docs/...