遇到的问题是MongoNotPrimaryException,这个异常通常发生在尝试执行写入操作时目标MongoDB实例不是主节点的情况。错误码10107(NotMaster)表示命令在非主节点上执行失败,因为该节点不是复制集中的主节点。

错误分析

MongoNotPrimaryException表明您的应用程序正在尝试在一个不是主节点的副本集成员上执行写入操作。在MongoDB的复制集中,只有主节点可以接受写入操作。其他节点(次节点或仲裁节点)只能用于读取操作。

解决方案

  1. 确认主节点状态:

    • 使用rs.status()命令检查MongoDB复制集的状态,确认哪个节点是当前的主节点。
    • 确认应用程序连接的是主节点。如果连接配置指向的是副本集的某个成员而不是特定的主节点,那么应用程序可能会连接到次节点。
  2. 检查应用程序配置:

    • 如果使用Spring Data MongoDB,请确认MongoTemplate或其他数据访问组件正确配置了连接到主节点的地址。
    • 如果使用的是MongoClient,请确认连接字符串或配置正确指定了主节点。
  3. 使用正确的写入关注:

    • 确保写入操作使用了适当的写入关注(WriteConcern),例如WriteConcern.MAJORITYWriteConcern.ACKNOWLEDGED。这取决于你的复制集配置和业务需求。
  4. 监控复制集状态:

    • 监控MongoDB复制集的状态,确保主节点没有意外地发生切换。如果主节点频繁切换,可能需要检查硬件故障、网络问题或配置问题。
  5. 优化应用程序逻辑:

    • 如果应用程序需要连接到复制集中的多个节点,请确保在检测到当前连接的节点不是主节点时能够重新路由请求到主节点。
    • 可以考虑使用驱动程序级别的自动发现和重路由功能,如Spring Data MongoDB的MongoClientFactory配置中的MongoClientSettings,以确保始终连接到主节点。
  6. 检查网络问题:

    • 确保应用程序和MongoDB实例之间的网络连接稳定且没有中断。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐