mongodb - 如何在不关闭数据库的情况下正确关闭Mongo(在副本集中)?

标签 mongodb node.js shutdown

我的服务器设置是这样的:

2 台服务器。 mongoDB 在两台服务器之间都有副本集。每个都是一个 Node 。

然后我将我的 Node.js 服务器连接到 MongoDB。

发生的事情是..当我杀死辅助服务器时。 (关闭服务器)。主要的 MongoDB 仍在运行,但 Node.js 服务器当时与 MongoDB 存在连接问题。即使我重新添加了服务器,它也不起作用。我使用 mongoose 和 connect-mongo 。

那么,发生了什么?如何正确关闭Mongo Node ?

最佳答案

如果您有一个包含 2 个 Node 的副本集,当一个 Node 出现故障时,另一个 Node 会将自身降级为辅助 Node 。如果您没有使用 slaveOk true 进行连接,那么您将无法读取(并且在任何一种情况下您都将无法写入)。

这是 MongoDB 实现的一项安全措施,它要求副本集的大多数(即一半加一)能够互相看到,以确保可以安全地选举主副本。如果看不到多数,少数的 Node 就无法知道“另一半”是否选举了主 Node 。同时进行两个初选会非常糟糕 (TM),因为这可能会导致更新冲突。

在您只想运行两个 Node 的情况下,您还可以运行仲裁器来打破平局,以防一个 Node 出现故障或对副本集不可见。仲裁器是一个普通的 mongod 进程,但不存储任何数据——本质上它只参与选举,否则闲置。在具有 2 个“正常” Node 和 1 个仲裁器的副本集中,两个数据保存 Node 中的任何一个都可以在不失去多数 Node 的情况下关闭。

有关更多信息,请参阅the MongoDB documentation on replica setsthe documentation on artibers .

关于mongodb - 如何在不关闭数据库的情况下正确关闭Mongo(在副本集中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523404/

相关文章:

node.js - 使用 Socket.io 的 Redis 存储

mysql - 将 Sql 查询转换为 Mongodb 查询

mongodb - MongoDB的mapreduce和Hadoop之间有什么异同?

javascript - Meteor 发布/订阅独特客户端集合的策略

javascript - 使用 Mongoose 和 Node/ express 保存新帖子时遇到问题

c# - Application.Current.Shutdown() 与 Application.Current.Dispatcher.BeginInvokeShutdown()

ffmpeg - 如何正确停止 ffmpeg 屏幕录制?

javascript - 如何使用 promises 正确处理 express.js 中的错误(字符串或对象)

node.js - 循环中的 Node Grunt 异步任务,闭包不起作用

java - shutdown.jar 工作但 shutdwon.exe 不工作