为什么不建议在生产中启动单独的 MongoDB 实例作为副本集?
Why starting a solo MongoDB instance as replica set is not recommended in production?
根据 this answer 评论中的讨论,@kevinadi 建议我打开一个与他的评论相关的新问题:
You can start a replica set with one node for development purposes. [...] Be advised that this is not a recommended setup for a production environment.
许多人开始为单独的 MongoDB 个实例创建副本集,明确回答为什么不推荐这样做很有趣,以供将来参考。
我希望@kevinadi 会回答它,提供有关内存、CPU、性能以及所有影响和不建议为 [=20= 启动副本集的原因的论据]实例。
副本集的主要功能是为您的 MongoDB 部署提供数据冗余和高可用性。也就是说,如果副本集中的主节点因任何原因宕机,辅助节点将立即接管成为新的主节点(平均在 10 秒内)。有关此主题的更多详细信息,请参阅 Replication。
官方 MongoDB 驱动程序知道这个副本集选举事件,并且会提供自动重新连接和操作重试到新的主节点。从应用程序的角度来看,数据库端没有发生任何事情。
使用具有多个辅助节点的副本集的另一个优点是以滚动方式实现零停机的可能性upgrade/maintenance。这可以通过使一个辅助节点脱机,对其进行维护,然后对其他辅助节点进行维护,最后停止主要节点并对其进行维护来完成。同样,由于官方 MongoDB 驱动程序知道这些事件,您可以在技术上对实时数据库进行维护,影响非常小,并且不会对应用程序造成停机。
与单一数据库服务器相比,这是一种不同的理念,后者只有一个真正的大型服务器。尽管整体部署有某些优点(这又是一个不同的讨论:)),MongoDB 被设计为一个容错的分布式数据库。单个服务器的一个直接缺点是服务器必须始终保持 100% 的运行状态,否则应用程序将中断。副本集旨在让您的应用程序可以拥有 100% 的正常运行时间,而不会对必须具有 100% 的正常运行时间的单个服务器施加压力。
作为奖励,副本集可能能够通过将驱动程序设置为从辅助节点读取(写入必须始终到主节点)来提供读取可伸缩性。请注意,如果您想进行二次读取,应该仔细设计,因为如果滥用,这可能会干扰高可用性方面。
综上所述,一个副本集可以提供:
- 高可用性和容错
- 无需停机维护
- 扩展读取的数据冗余
无需硬件 100% 可靠。这就是为什么在产品部署中强烈推荐副本集的原因。
有关更详细的副本集部署注意事项,请参阅 Replica Set Deployment Architectures。
根据 this answer 评论中的讨论,@kevinadi 建议我打开一个与他的评论相关的新问题:
You can start a replica set with one node for development purposes. [...] Be advised that this is not a recommended setup for a production environment.
许多人开始为单独的 MongoDB 个实例创建副本集,明确回答为什么不推荐这样做很有趣,以供将来参考。
我希望@kevinadi 会回答它,提供有关内存、CPU、性能以及所有影响和不建议为 [=20= 启动副本集的原因的论据]实例。
副本集的主要功能是为您的 MongoDB 部署提供数据冗余和高可用性。也就是说,如果副本集中的主节点因任何原因宕机,辅助节点将立即接管成为新的主节点(平均在 10 秒内)。有关此主题的更多详细信息,请参阅 Replication。
官方 MongoDB 驱动程序知道这个副本集选举事件,并且会提供自动重新连接和操作重试到新的主节点。从应用程序的角度来看,数据库端没有发生任何事情。
使用具有多个辅助节点的副本集的另一个优点是以滚动方式实现零停机的可能性upgrade/maintenance。这可以通过使一个辅助节点脱机,对其进行维护,然后对其他辅助节点进行维护,最后停止主要节点并对其进行维护来完成。同样,由于官方 MongoDB 驱动程序知道这些事件,您可以在技术上对实时数据库进行维护,影响非常小,并且不会对应用程序造成停机。
与单一数据库服务器相比,这是一种不同的理念,后者只有一个真正的大型服务器。尽管整体部署有某些优点(这又是一个不同的讨论:)),MongoDB 被设计为一个容错的分布式数据库。单个服务器的一个直接缺点是服务器必须始终保持 100% 的运行状态,否则应用程序将中断。副本集旨在让您的应用程序可以拥有 100% 的正常运行时间,而不会对必须具有 100% 的正常运行时间的单个服务器施加压力。
作为奖励,副本集可能能够通过将驱动程序设置为从辅助节点读取(写入必须始终到主节点)来提供读取可伸缩性。请注意,如果您想进行二次读取,应该仔细设计,因为如果滥用,这可能会干扰高可用性方面。
综上所述,一个副本集可以提供:
- 高可用性和容错
- 无需停机维护
- 扩展读取的数据冗余
无需硬件 100% 可靠。这就是为什么在产品部署中强烈推荐副本集的原因。
有关更详细的副本集部署注意事项,请参阅 Replica Set Deployment Architectures。