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 @ 2023-07-17 11:56  蕝戀  阅读(97)  评论(0编辑  收藏  举报