当与主要节点没有连接时,从mongodb辅助节点读取

时间:2017-03-03 08:51:17

标签: node.js mongodb mongoose database-replication mongodb-replica-set

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

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

我们正面临着这些问题:

1)是否可以制作" A"从特定的辅助节点读取,而不在连接配置中指定哪个是主mongoDB节点?

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

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

版本: mongodb 3.2.9,mongoose 4.5.9

1 个答案:

答案 0 :(得分:1)

  1. 是的,read preference with tags

  2. 对于具有D1和D2的网络分区,主要会自动转移到其中一个D2节点,即对主节点最“最新”的节点。使用"priority settings",您可以引导此选择。只要3个节点中有2个节点上升,其中一个节点就被选为主节点。

  3. 让我们假设您有三个节点:

    • 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. 如果您有副本集,则必须始终写入副本集,而不是直接写入单个节点!