【问题标题】:How do I prevent MongoDB replica set from querying the primary?如何防止 MongoDB 副本集查询主副本?
【发布时间】:2016-10-03 20:25:21
【问题描述】:

只读操作:

有没有办法拥有一个 MongoDB 副本集,但要在连接的盒子上创建 MongoDB 实例,成为被查询的 MongoDB?

我在 AWS 负载均衡器后面有三个 EC2 实例。

在每个 EC2 实例上运行 MongoDB,这是副本集的一部分。

我在 nodeJS 上有 express 端点,并按如下方式连接到副本集

 mongodb.MongoClient.connect('mongodb://1.1.1.1,2.2.2.2,3.3.3.3.',
    function (err, db)
    {
        if (err)
        {
            complete('{}');
        }
        else
        {

我想在我的 MongoDB 副本集的所有三个实例之间平均分配查询负载,而不是默认将所有查询路由到定义我的主要 MongoDB 的 EC2 实例,因为这会破坏我的负载均衡器的点(这是为了均匀地平衡所有三个实例的查询负载)。

我的理解是,当连接到 MongoDB 副本集时,除非主实例关闭,否则始终选择主实例,因此每个辅助实例的目的只是作为备份。

在我的示例中,有些人会将此称为 HOT、COLD、COLD。因为有两个实例永远不会被使用。

我想让查询负载均匀分布的原因是我的设置可以是 WARM、WARM、WARM。

未来当用户数量增加时,为了保持最佳查询性能,我可以在负载均衡器后面添加更多 EC2 实例,以提高查询性能。

当数据增长时,单个实例太慢而无法按时返回数据,这时我会将每个实例分片到其他 EC2 实例中。

注意:我希望每个 EC2 实例的源代码都相同。我正在使用 git,我想轻松地将源代码推送和拉取到我的副本集中的每个实例。

【问题讨论】:

    标签: node.js mongodb amazon-ec2 load-balancing replicaset


    【解决方案1】:

    您想使用ReadPreference,这将允许您将读取请求定向到辅助节点。 MongoDB node.js 驱动的示例代码可见here。

    mongodb.MongoClient.connect('mongodb://1.1.1.1,2.2.2.2,3.3.3.3./?readPreference=secondary', ...
    

    【讨论】:

    • 如果我使用 readpreference=secondary,并且有两个辅助节点(一个在 2.2.2.2 上,一个在 3.3.3.3 上)。我们是否知道将要使用的 mongoDB 辅助节点是否位于负载均衡器路由到的机器上?例如,如果 AWS 负载均衡器路由到框 3.3.3.3,其中端点连接到 mongoDB 副本集并将读取首选项设置为辅助节点,那么选择的辅助节点也会在 3.3.3.3 上吗?
    • 听起来 NEAREST 应该从同一个盒子上的集合中选择副本 mongoDB - 但我不清楚这是否属实或如何检查跨度>
    • 驱动程序在计算 NEAREST 时不会知道任何有关 AWS 拓扑或 ELB 或任何内容的信息。它仅根据网络延迟计算。如果您的客户端与副本集成员在同一个实例上运行,它通常会查询它,无论它是主要的还是次要的。但请记住,可以随时选举新的主节点,并且如果您使用 NEAREST 运行,则不会阻止从主节点读取。不过,在与 MongoDB 副本集成员相同的实例上运行您的应用程序通常不是最佳实践。
    • 我不确定你所说的“在同一个实例上运行你的应用程序”是什么意思,但这里有一张图片motionreboot.com/wp-content/uploads/2016/06/…
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多