Mongodb localhost:27017 replica set切换到备localhost:27027



我对mongodb相当陌生,只是几个月。我刚刚转换了我的mongodb数据库,以支持二级复制集,以便我可以观看集合。我只添加了一个辅助服务器,我猜现在可能不是最好的,因为阅读后,您应该创建一个奇数,但它是一台机器上的本地主机。我看了说明书,复制工作正常运行了半天。但由于某种原因,它最近将端口27017的数据库从主数据库切换为辅助数据库。主服务器先前在localhost:27017上,从服务器在localhost:27027上。现在我的正常程序无法连接到localhost:27017而不出现错误,我认为这是因为它以前是主副本,现在是辅助副本集,假设您只能连接到主副本集。下面是错误信息

Exception in thread "main" com.mongodb.MongoNotPrimaryException: Command failed with error 10107 (NotWritablePrimary): 'not master' on server localhost:27017.
  1. 我很困惑为什么mongodb首先切换了复制集primary。我怀疑发生了错误,但肯定是可能的,但我没有一个"本地主机"。开发几个月的错误。

  2. 现在,理想情况下我如何将27017切换回主要。我怎么做,使我现有的程序可以再次运行?

  3. 最终在生产环境中,假设对ip地址的DNS条目进行查找,并且由于故障转移而突然更改了主节点,那么处理此问题的最佳方法是什么?

  4. 给定问题3有点复杂,我可以在我的开发环境中做些什么来更好地模拟生产环境吗?

我广泛使用StackOverflow,但这是我的第一篇文章,所以感谢任何可以提供建议的人。

  1. 在不了解更多关于副本配置和切换情况的情况下,我不确定是否有人可以自信地回答问题1,但与问题3相比,它可能并不重要。

  2. 当您想手动切换主服务器时,您可以操作优先级设置:

https://docs.mongodb.com/manual/tutorial/force-member-to-be-primary/

或者运行手动命令冻结或关闭当前主节点:https://docs.mongodb.com/manual/tutorial/force-member-to-be-primary/force-a-member-to-be-primary-using-database-commands

  1. 最安全的选择是确保应用程序知道副本集中的所有副本。然后,当发生意外情况时,应用程序将故障转移到可写数据库,没有任何问题。

https://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/connect-to-mongodb/connect-to-a-replica-set

  1. 我只能建议设置一些虚拟机或容器作为副本集成员,以更好地代表生产环境。

https://hub.docker.com/_/mongo

我能够通过使用包含两个副本集的连接字符串来解决这个问题,我没有意识到我需要这样做。例如对于java:

mongoClient = MongoClients.create("mongodb://localhost:27017,localhost:27027");

这也适用于Mongo Compass,所以我能够连接到辅助数据库。我不知道在尝试连接时需要提供所有副本集的路径,但回想起来,如果出现故障,这是有意义的。

如果您需要一个副本集进行测试,您可以创建一个单节点RS。按照创建RS的说明,但是只添加一个节点。

相关内容

最新更新