【问题标题】:how does mongodb replica set work with nodejs-mongoose?mongodb副本集如何与nodejs-mongoose一起工作?
【发布时间】:2020-05-03 08:35:42
【问题描述】:

使用的技术栈 nodejs,mongoose,mongodb

我正在开发处理许多 DBrequest 的产品。在每个月初,由于读/写请求(批量数据处理)很高,数据库请求很高。每个集合中用于服务这些读/写请求的记录数量非常多。读高,但写没那么高。

因此,运行 mongodb 的实例上的 cpu 利用率在这些时间内达到了危险区(90% 以上)。唯一能让我度过这些时光的是HOPE(是的,希望该实例不会崩溃)。

我正在寻找水平扩展的解决方案,而不是垂直扩展(不是革命性的想法)。我看了replicasetsharding。这个问题只和replicaSet有关。

我浏览了文件,我觉得我对replicaset 的理解并不是它可能真正起作用的方式。

我已经使用以下配置配置了我的副本集。我只是想再添加一个实例,因为根据我现在的理解,如果我再添加一个实例,那么我的数据库可以通过分配负载来处理更多读取请求,这可以将 primaryNode 上的 cpuUtilization 至少降低 30%。 这种理解是对还是错?请分享你的想法

var configuration = {
    _id : "testReplicaDB",
    members:[
        {_id:0,host:"localhost:12017"},
        {_id:1,host:"localhost:12018",arbiterOnly:true,buildIndexes:false},
        {_id:2,host:"localhost:12019"}
    ]
}

当我使用上述配置启动副本集并运行我的 nodejs-mongoose 代码时,我遇到了 this issue 。他们提出的解决方案是将上述配置更改为

var configuration = {
    _id : "testReplicaDB",
    members:[
        {_id:0,host:"validdomain.com:12017"},
        {_id:1,host:"validdomain.com:12018",arbiterOnly:true,buildIndexes:false},
        {_id:2,host:"validdomain.com:12019"}
    ]
}

问题1(与nodejsproject中编写的编码相关,mongoose library(用于处理db)连接到replicaSet)

const URI = mongodb://167.99.21.9:12017,167.99.21.9:12019/${DB};

我必须在 mongoose connection URI String 中指定我的 mongodb 实例的两个 uri。

当我查看将连接到副本集的nodejs-mongoose 代码时,我对它如何处理多节点有很多疑问。

mongoose如何知道哪个ip是primaryNode?

假设167.99.21.9:12019 是primaryNode,rs.slaveOk(false) 在secondaryReplica,所以secondaryNode 不能为readRequests 提供服务。

在这种情况下,mongoose 是否会触发到第一个 uri(167.99.21.9:12017) 并且此实例会重定向到主节点,或者请求会返回到 mongoose,然后 mongoose 会触发另一个对 167.99.21.9:12019 的请求?

问题 2

This docLink 提到数据冗余可以处理高读取请求。让我们假设,为secondaryNode启用了读取,并且

  • 让我们假设当 mongoose 触发对 primaryNode 的请求并且当时 primaryNode 被读/写请求轰炸但 secondaryNode 空闲(什么都不做),然后 mongodb 会自动将请求重定向到 secondaryNode 或此请求会失败并重定向回 mongoose,这样 mongoose 将负责触发对下一个可用节点的另一个请求?
  • mongoose能否自动知道replicaSet中哪个Node空闲?

问题 3

假设167.99.21.9:12017167.99.21.9:12019 实例都可用于ReadPreference.SecondaryPreferredReadPreference.nearest 的读取请求,那么当secondaryNode 被readRequests 轰炸并且primaryNode 的利用率接近20% 时,负载是否会被分配?是这样吗?还是我的理解错了?副本集可以充当负载均衡器吗?如果没有,如何使它平衡负载?

问题 4

var configuration = {
    _id : "testReplicaDB",
    members:[
        {_id:0,host:"validdomain.com:12017"},
        {_id:1,host:"validdomain.com:12018",arbiterOnly:true,buildIndexes:false},
        {_id:2,host:"validdomain.com:12019"}
    ]
}

在配置中可以看到DNS名称,这是否意味着primaryNode重定向请求到secondaryNode时,会发生DNS解析,然后使用secondaryNode对应的IP,请求会重定向到secondaryNode? 我的理解正确还是错误? (如果我的理解正确,这将引发另一组问题)

:|

我在阅读文档时可能会遗漏很多细节。这是我得到答案的最后希望。因此,如果您知道其中任何一个的答案,请分享。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果是这样,那么mongoose怎么知道哪个ip是primaryReplicaset呢?

    没有“主副本集”,但是可以有一个主副本一个副本集。

    每个 MongoDB 驱动程序查询连接字符串中指定的所有主机以发现副本集的成员(以防一个或多个主机由于某种原因不可用)。当副本集的任何成员响应时,它会使用副本集的当前成员的完整列表来响应。然后驱动程序知道副本集成员是什么,以及其中哪些是当前主要的(如果有的话)。

    secondaryReplica 无法提供 readRequests

    这根本不是真的。如果应用程序提供了合适的read preference,任何数据承载节点都可以完成读取请求。

    在这种情况下,mongoose 是否会触发到第一个 uri(167.99.21.9:12017),并且此实例将重定向到 primaryReplicaset,或者请求会返回到 mongoose,然后 mongoose 会触发对 167.99.21.9:12019 的另一个请求?

    猫鼬不直接与数据库对话。它使用驱动程序(MongoDB 的节点驱动程序)来执行此操作。 驱动程序连接到所有副本集成员,并将请求发送到适当的节点。

    例如,如果您指定了主读取首选项,则驱动程序会将该查询发送到主数据库(如果存在)。如果您指定了辅助读取首选项,则驱动程序会将该查询发送到辅助设备(如果存在)。

    我假设当 167.99.21.9:12017 和 167.99.21.9:12019 实例都可用于 ReadPreference.SecondaryPreferred 或 ReadPreference.nearest 的读取请求时

    正确,任何节点都可以实现。

    负载可以分散

    是的,不是的。一般来说,副本可能有陈旧的数据。如果您需要 当前 数据,则必须从主数据库读取。如果您不需要当前数据,则可以从辅助节点中读取。

    如何让它平衡负载?

    您可以您的应用程序通过使用辅助或最近读取来平衡负载,假设您的应用程序可以接收陈旧数据。

    如果mongoose触发了对primaryReplica的请求,primaryReplica被读/写请求轰炸,而secondaryReplica空闲(什么都不做),那么mongodb会自动将请求重定向到secondaryReplica吗?

    不,主要读取不会更改为辅助读取。

    尤其是在您描述的场景中,二级很可能是陈旧的,因此二级读取可能会产生错误的结果。

    mongoose 可以自动知道哪个副本是免费的吗?

    mongoose 不跟踪部署状态,驱动程序对此负责。驱动程序对选择“负载较少”的节点的支持有限,尽管这是基于网络延迟而不是 CPU/内存/磁盘负载来衡量的,并且仅适用于nearest read preference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多