python操作mongodb实现读写分离
读写分离
默认情况下,MongoClient 实例将查询发送到副本集的主要成员。
要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项:
读取首选项在模块pymongo.ReadPreference
下:
- PRIMARY: 从主节点中读取(默认)
- PRIMARY_PREFERRED: 优先从主节点读取,如果不可用则从副节点读取、
- SECONDARY: 从副节点读取,如果副节点不可用,则抛出
AutoReconnect
异常。 - SECONDARY_PREFERRED: 表示优先在副节点读取,如果不可用则从主节点读取。
- NEAREST: 从任意可用节点中读。
实例:
import time
import pymongo
if __name__ == '__main__':
# 初始化客户端
# mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017, username="", password="")
mongo_client = pymongo.MongoClient(
host="127.0.0.1",
port=27017,
# 设置读取操作时的偏好,
# PRIMARY: 从主节点中读取(默认)
# PRIMARY_PREFERRED: 优先从主节点读取,如果不可用则从副节点读取、
# SECONDARY: 从副节点读取,如果副节点不可用,则抛出AutoReconnect异常。
# SECONDARY_PREFERRED: 表示优先在副节点读取,如果不可用则从主节点读取。
# NEAREST: 从任意可用节点中读。
read_preference=pymongo.ReadPreference.SECONDARY_PREFERRED
)
# 延迟一下,因为MongoClient 构造函数是非阻塞的:
# 当客户端使用后台线程连接到副本集时,构造函数立即返回。
# 请注意,如果您创建客户端并立即打印其 nodes 属性的字符串表示形式,则列表最初可能为空。
# 如果稍等一下,MongoClient 会发现整个副本集:
time.sleep(1)
# 打印所有节点
print(mongo_client.nodes)
# 打印客户端的读取操作首选项
print(f"{mongo_client.read_preference=}")
"""
默认情况下,
Database 的读取首选项是从其 MongoClient 继承的,
Collection 的读取首选项是从其数据库继承的。
要使用不同的读取首选项,请使用 get_database() 方法或 get_collection() 方法:
也就是说你可以单独给某个db、集合来指定读取首选项!
"""
db = mongo_client.get_database("spider", read_preference=pymongo.ReadPreference.PRIMARY_PREFERRED)
print(f"{db.read_preference=}")
# 还可以通过with_options()方法来实现动态修改现有的db或者collection的读取首选项
db2 = db.with_options(read_preference=pymongo.ReadPreference.PRIMARY)
print(f"{db2.read_preference=}")
print(f"{db2=}")
collection = db.get_collection("test02", read_preference=pymongo.ReadPreference.NEAREST)
print(f"{collection.read_preference=}")
collection2 = collection.with_options(read_preference=pymongo.ReadPreference.SECONDARY)
print(f"{collection2.read_preference=}")
print(f"{collection2=}")
mongo_client.close()
本文来自博客园,作者:蕝戀,转载请注明原文链接:https://www.cnblogs.com/juelian/p/17559714.html