首页 > 解决方案 > 如何告诉 mongodb 聚合框架在主节点上执行

问题描述

我有一个带有 3 个节点的 Mongodb 副本集和一个配置如下的 Spring 应用程序:

    <mongo:mongo id="mongo" replica-set="${mongo.replicaset}">
            <mongo:options auto-connect-retry="true" slave-ok="true" />
    </mongo:mongo>
    <mongo:db-factory dbname="${mongo.dbname}" username="${mongo.username}" password="${mongo.password}" mongo-ref="mongo" />
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
     </bean>
    <mongo:repositories base-package="com.nounou.repository" />

当我使用 mongoOperations 运行聚合操作时,它会转到辅助副本。而且因为我试图使用舞台将结果直接写入连接$out,所以我收到了这个错误:

"errmsg" : "failed to create temporary $out collection 'smn.tmp.agg_out.410': { ok: 0.0, errmsg: \"Not primary while creating collection smn.tmp.agg_out.410\", code: 10107, codeName: \"NotMaster\" }"

基本上,它说它不能将结果写入辅助节点。如果我设置 slave-ok="false",我不会再遇到问题了,因为它会将读取操作也切换到主节点。但我不能认为这是一个解决方案,因为它只会让 1 个节点管理读取和写入。

是否有任何配置或解决方法(在 spring 或 mongodb 级别)强制在主节点上处理聚合?

标签: mongodbspring-data-mongodb

解决方案


我认为这里需要一些概念:

  1. 如果您想要在一组机器上分配读写操作的容量,那么您需要实现分片而不是副本集。
  2. 不要使用 secondary 和 secondaryPreferred 为读取提供额外容量,因为副本的所有成员具有大致相等的写入流量;因此,辅助节点将以与主节点大致相同的速率提供读取服务。
  3. 您不能在副本集中的辅助节点上写入。

你可以在这里找到所有这些信息


推荐阅读