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代码层面指定读偏好,两种常用写法:
- 初始化客户端时全局指定读偏好,所有读操作默认走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) ] );
- 单次查询单独指定读偏好,优先级高于全局配置,适合部分查询需要走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
相关产品推荐
相关产品推荐

