【发布时间】:2020-05-03 08:35:42
【问题描述】:
使用的技术栈 nodejs,mongoose,mongodb
我正在开发处理许多 DBrequest 的产品。在每个月初,由于读/写请求(批量数据处理)很高,数据库请求很高。每个集合中用于服务这些读/写请求的记录数量非常多。读高,但写没那么高。
因此,运行 mongodb 的实例上的 cpu 利用率在这些时间内达到了危险区(90% 以上)。唯一能让我度过这些时光的是HOPE(是的,希望该实例不会崩溃)。
我正在寻找水平扩展的解决方案,而不是垂直扩展(不是革命性的想法)。我看了replicaset 和sharding。这个问题只和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:12017 和167.99.21.9:12019 实例都可用于ReadPreference.SecondaryPreferred 或ReadPreference.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? 我的理解正确还是错误? (如果我的理解正确,这将引发另一组问题)
:|
我在阅读文档时可能会遗漏很多细节。这是我得到答案的最后希望。因此,如果您知道其中任何一个的答案,请分享。
【问题讨论】: