0

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

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

我们面临着这些问题:

1)是否可以使“A”从特定的辅助节点读取,而无需在连接配置中指定主 mongoDB 节点在哪里?

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

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

版本:mongodb 3.2.9、mongoose 4.5.9

4

1 回答 1

1
  1. 是的,使用标签阅读偏好

  2. 使用具有 D1 和 D2 的网络分区,主节点会自动转移到其中一个 D2 节点,即与主节点相比最“最新”的节点。使用“优先级设置”,您可以控制此选择。只要 3 个节点中的 2 个节点启动,这 2 个节点中的一个就会被选为主节点。

假设您有三个节点:

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

您应该优先考虑节点:

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

现在,只要 D1 可达,那么 D1.N0 就是主要的。当我们在 D1 和 D2 之间进行网络分区时,D2.N1 成为主要的,而 D2.N2 将保持为次要的。当网络分区结束后,D1.N0 将通过读取 D2.N1 opLog 来“补上”丢失的数据,并再次成为主要,而 D2.N1 将成为次要。

  1. 如果您有副本集,则必须始终写入副本集,并且永远不要直接写入单个节点!
于 2017-03-04T07:51:03.393 回答