Rust MongoDB 2.6.0客户端连接副本集如何忽略单主机故障?
解决方案
可以通过调整MongoDB Rust驱动的客户端选项,实现和Compass一样自动选择可用主机的行为,无需额外错误处理。
关键配置点
驱动默认会尝试从副本集节点列表中筛选可用服务器,只需调整以下选项确保它能跳过不可达节点:
server_selection_timeout:设置驱动尝试选择可用服务器的最长时间,超时前会遍历所有列出的节点,找到第一个可用节点就建立连接。connect_timeout:设置单个节点的连接超时时间,避免在不可达节点上浪费过多时间。
修正后的代码示例
先指出你代码里的两处错误:
- 不能直接给字符串
servers_list设置app_name,需修改client_options对象 - 赋值符号应为
=而非-
完整代码如下:
use mongodb::{Client, ClientOptions, Database, Collection, bson::Document}; use std::time::Duration; #[tokio::main] async fn main() -> mongodb::error::Result<()> { let servers_list = "mongodb://host1:port1,host2:port2,host3:port3"; let mut client_options = ClientOptions::parse(servers_list).await?; // 设置客户端应用名称 client_options.app_name = Some("name".to_string()); // 配置服务器选择超时(示例设为10秒) client_options.server_selection_timeout = Some(Duration::from_secs(10)); // 配置单个节点连接超时(示例设为2秒) client_options.connect_timeout = Some(Duration::from_secs(2)); let client = Client::with_options(client_options)?; let db = client.database("database_name"); let collection = db.collection::<Document>("collection_name"); // 示例读取操作 match collection.find_one(None, None).await { Ok(doc) => println!("找到文档: {:?}", doc), Err(e) => eprintln!("读取错误: {}", e), } Ok(()) }
原理说明
驱动初始化时会按节点列表依次尝试连接,一旦找到可用节点(比如host1:port1)就会使用它建立连接,自动跳过不可达节点。设置合理的超时时间,既能保证驱动有足够时间找到可用节点,又不会在无效节点上过度等待。
内容的提问来源于stack exchange,提问作者MR. D
相关产品推荐
相关产品推荐

