0

我们有3个实例的mongodb副本集,其中主节点位于数据中心D1,数据中心D2上的辅助节点。在我们的设置中,我们不需要任何故障转移选项,并按照https://docs.mongodb.com/manual/tutorial/configure-secondary-only-replica-set-member/中所述进行配置。当与主节点没有连接时,从mongodb辅助节点读取

在同一数据中心D2内的辅助节点上运行的应用程序“A”正在使用猫鼬,我们指定(使用“最接近”或“次要”选项)从辅助节点读取数据。

我们面临这些问题:

1)是否有可能使“A”从特定的辅助节点阅读,而不会在连接配置中是主节点的MongoDB指定?

2)如果数据中心D1和D2之间的连接丢失,我们如何才能使辅助节点仍然读取“A”应用程序,所以mongoDB主节点不再可用?据我了解,它不起作用,因为即使“A”被配置为从辅助读取,mongoDB仍然需要在执行实际读取操作之前在主要和辅助之间执行一种ping /仲裁。

3)是否有可能/建议在数据中心D2中有一个应用程序,它将直接作为独立实例执行对mongodb副本集主实例的写操作,而不是作为副本集的一部分?

版本: mongodb的3.2.9,猫鼬4.5.9

回答

1
  1. 是,read preference with tags

  2. 与D1和D2网络分区,主自动传送到那些D2节点中的一个,那一个是最“最新的”反对小学的。用"priority settings"你可以引导这个选择。只要3个节点中有2个节点处于启动状态,则其中的2个节点将被选为主节点。

让我们想象一下,你有三个节点:

  • D1.N0
  • D2.N1
  • D2.N2

你应该prioritise节点:

  • D1.N0.priority = 3
  • D2.N1.priority = 2
  • D2.N2.priority = 1

现在,只要D1可达然后D1.N0是主。当我们在D1和D2之间进行网络分区时,D2.N1将成为主要的,并且将使D2.N2保持为次要状态。当网络分区结束时,D1.N0将通过读取D2.N1 opLog“追上”缺失的数据,并且将再次成为主要的,并且D2.N1将是次要的。

  1. 如果您有副本集,则必须始终写入副本集,而不要直接写入单个节点!