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()

posted @   运维爱背锅  阅读(144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.