You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB Atlas能否仅从secondary节点读数据?如何配置连接?

关于读并发扩容方案的可行性判断

你设想的靠2个Secondary节点叠加承载1000读并发的方案在M0免费层集群上完全不可行,核心限制如下:

  • M0属于Atlas共享-tier集群,标称的单节点500连接数是单节点的连接配额上限,但整个M0集群有全局硬限制:全集群所有节点(含Primary、两个Secondary)的总并发连接数不能超过500,所有连接(不管连哪个节点)共享这个配额,根本不存在两个Secondary各跑500连接的可能
  • 其次M0集群的CPU、内存、磁盘IO都是和其他租户共享的,500是连接数配额,不是实际业务并发承载能力,实际能稳定支撑的业务读并发远低于500,不要按连接数上限换算业务承载量
  • 补充:只有M10及以上的专用集群,才是按单节点规格计算独立连接配额,这种场景下两个Secondary的读连接能力才可以叠加。
PHP驱动配置只读Secondary节点的方法

你当前使用的mongodb+srv格式连接串,只需要追加读偏好参数即可实现所有读请求自动路由到Secondary节点,修改后的连接串如下:

mongodb+srv://username:password@cluster0.***.mongodb.net/?retryWrites=true&w=majority&readPreference=secondary

如果需要更灵活的配置,也可以在PHP代码层面指定读偏好,两种常用写法:

  1. 初始化客户端时全局指定读偏好,所有读操作默认走Secondary:
$client = new MongoDB\Client(
    'mongodb+srv://username:password@cluster0.***.mongodb.net/?retryWrites=true&w=majority',
    [
        'readPreference' => new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY)
    ]
);
  1. 单次查询单独指定读偏好,优先级高于全局配置,适合部分查询需要走Primary、部分走Secondary的场景:
$collection = $client->your_db->your_collection;
// 该查询只会路由到Secondary节点
$res = $collection->find(
    ['is_active' => 1],
    [
        'readPreference' => new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY)
    ]
);

配置生效后,MongoDB PHP驱动会自动在两个可用Secondary节点之间做负载均衡,不会把读请求转发到Primary。但要注意M0集群总连接数只有500,管理面板的写连接、客户端的读连接总和不能超过这个值,否则会直接触发连接拒绝报错。

内容的提问来源于stack exchange,提问作者Yunus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:18:48