pymongo4.x版本集群连接
时间: 2025-07-26 13:26:29 浏览: 7
<think>我们被要求使用PyMongo4.x版本连接MongoDB集群。根据引用,我们可以总结出几种连接方式,并注意PyMongo4.x的一些变化。在PyMongo4.x中,连接字符串的格式和认证方式可能有所调整。特别是,在连接字符串中可以直接指定多个节点(集群节点)以及认证信息。根据引用[4]中的代码,我们可以看到一个连接MongoDB集群的例子,它使用了多个节点地址。同时,在4.x版本中,我们仍然可以使用类似的方式。另外,引用[1]和[2]提到了使用连接字符串的方式,引用[3]则提到了使用参数直接传递的方式。在PyMongo4.x中,推荐使用MongoClient的URI字符串来连接,包括认证信息。同时,对于集群,我们可以在URI中列出多个节点。以下我们将提供两种常见的方式:1.使用URI字符串连接(包含认证信息)2.使用参数直接传递节点列表和认证信息注意:在PyMongo4.x中,默认的身份验证机制是SCRAM,通常不需要特别指定,除非你的MongoDB配置了其他机制(如MONGODB-CR)。同时,我们需要注意,在集群连接中,我们通常使用副本集(Replica Set)或分片(Sharded Cluster)。在连接字符串中,我们可以通过`replicaSet`参数指定副本集名称(如果是副本集的话)。如果没有指定副本集名称,那么驱动可能会以独立节点的方式连接每个节点,这可能导致无法正确识别副本集。因此,在连接集群时,如果知道副本集名称,最好在连接字符串中指定。下面我们分别给出两种方式的代码示例。方式一:使用URI字符串格式:`mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]`方式二:使用参数传递(在MongoClient构造函数中传递节点列表,以及其他认证参数)根据引用[4]的代码,它使用了节点列表,然后通过client.admin进行认证。但是,在4.x中,我们更推荐在连接字符串中直接包含认证信息,或者在MongoClient中传递`username`和`password`参数,并指定`authSource`(认证数据库,默认为admin)。另外,引用[4]中使用了`ReadPreference`,这是可选的,用于指定读偏好(如从副本集的从节点读取)。下面我们提供两个示例:示例1:使用URI字符串连接(推荐)
```pythonfrom pymongoimport MongoClient#替换以下信息为实际值username= "your_username"password ="your_password"#将节点列表用逗号分隔,每个节点为 host:port格式hosts ="host1:port1,host2:port2,host3:port3"
replica_set_name ="replicaSetName"#替换为实际的副本集名称database ="your_database"#可选,如果指定,则可以直接使用该数据库#构建URIuri =f"mongodb://{username}:{password}@{hosts}/{database}?replicaSet={replica_set_name}"
#创建客户端client =MongoClient(uri)
#测试连接try:#执行一个简单的命令,例如获取数据库列表print(client.list_database_names())except Exceptionas e:print(f"连接失败:{e}")
```示例2:使用参数传递节点和认证信息```pythonfrompymongo importMongoClient#节点列表hosts= ["host1:port1","host2:port2", "host3:port3"]#创建客户端,并传递认证信息client =MongoClient(hosts,username='your_username',password='your_password',replicaSet='replicaSetName',#副本集名称authSource='admin'#认证数据库,默认为admin,如果认证数据库不同,请修改)
#同样,可以测试连接try:print(client.list_database_names())
exceptException ase:print(f"连接失败: {e}")```注意:在4.x版本中,使用参数传递时,如果认证数据库不是admin,请务必指定`authSource`参数。另外,关于认证机制,如果MongoDB服务器配置了不同的认证机制(如SCRAM-SHA-256),PyMongo会自动协商。如果需要指定,可以在URI中使用`authMechanism`参数,例如`authMechanism=SCRAM-SHA-256`。以上两种方式都可以连接MongoDB集群。在集群中,驱动会自动发现所有节点,并处理故障转移。最后,我们也可以像引用[4]中那样,在连接后选择数据库和集合进行操作。但注意,引用[4]中的认证方式(先连接再认证)在4.x中仍然可用,但不如在连接时直接认证方便。另外,引用[4]中使用了`ReadPreference`,我们也可以在连接字符串中指定,例如在URI中添加`readPreference=secondaryPreferred`,或者在MongoClient参数中传递`read_preference`(如示例2中,可以添加参数`read_preference=ReadPreference.SECONDARY_PREFERRED`)。我们更推荐使用URI字符串的方式,因为这样更符合MongoDB的标准,且易于配置。请根据实际集群信息替换示例中的用户名、密码、节点地址和端口、副本集名称以及数据库名称。注意:在生产环境中,密码等敏感信息应避免直接写在代码中,建议使用环境变量或配置文件。以上就是在PyMongo4.x中连接MongoDB集群的方法。</think>### PyMongo 4.x 连接 MongoDB 集群的方法
在 PyMongo 4.x 中连接 MongoDB 集群主要有两种推荐方式,均支持副本集和分片集群:
#### 方法一:URI 连接字符串(推荐)
```python
from pymongo import MongoClient
# 集群节点列表(至少包含2个节点)
nodes = [
"mongo1.example.com:27017",
"mongo2.example.com:27017",
"mongo3.example.com:27017"
]
# 构建连接字符串
uri = "mongodb://{username}:{password}@{nodes}/?replicaSet={rs_name}&authSource=admin".format(
username="your_username",
password="your_password",
nodes=",".join(nodes),
rs_name="your_replica_set_name" # 副本集名称
)
client = MongoClient(uri, appname="YourAppName")
```
**关键参数说明:**
- `replicaSet`:必须指定副本集名称(集群配置时定义)
- `authSource`:认证数据库(通常为`admin`)
- `appname`:可选应用标识(便于服务器端监控)
- 支持自动节点发现:驱动会自动发现集群所有节点[^1][^4]
#### 方法二:参数化连接
```python
from pymongo import MongoClient, ReadPreference
client = MongoClient(
hosts=nodes, # 节点列表
username="your_username",
password="your_password",
replicaSet="your_replica_set_name",
authSource="admin",
read_preference=ReadPreference.SECONDARY_PREFERRED, # 读偏好设置
connectTimeoutMS=3000, # 连接超时3秒
serverSelectionTimeoutMS=5000 # 服务器选择超时5秒
)
```
#### 验证连接
```python
try:
# 执行简单的命令验证连接
db = client.admin
print("集群状态:", db.command("serverStatus")["ok"])
print("当前主节点:", db.command("isMaster")["primary"])
# 获取数据库和集合
mydb = client.get_database("mydb")
mycol = mydb.get_collection("mycollection")
# 查询示例
for doc in mycol.find().limit(5):
print(doc)
except Exception as e:
print("连接失败:", str(e))
finally:
client.close() # 关闭连接
```
#### 4.x 版本注意事项
1. **认证机制**:默认使用 `SCRAM-SHA-256`,兼容 MongoDB 4.0+ 的安全要求[^3]
2. **DNS 种子列表**:支持 `mongodb+srv://` 连接格式
```python
uri = "mongodb+srv://user:[email protected]/mydb?tls=true"
```
3. **读写偏好**:支持在连接或操作级别设置读取策略[^4]
4. **超时控制**:推荐显式设置超时参数(单位毫秒):
- `connectTimeoutMS`
- `serverSelectionTimeoutMS`
- `socketTimeoutMS`
#### 最佳实践
1. **环境变量管理凭证**:
```python
import os
uri = f"mongodb://{os.getenv('MONGO_USER')}:{os.getenv('MONGO_PWD')}@nodes..."
```
2. **TLS/SSL 连接**:
```python
MongoClient(uri, tls=True, tlsCAFile="/path/to/ca.pem")
```
3. **连接池优化**:
```python
MongoClient(uri, maxPoolSize=50, minPoolSize=10)
```
> **重要提示**:当集群节点变化时,PyMongo 4.x 会自动处理重新发现逻辑,无需重启应用[^1][^4]。
阅读全文
相关推荐














