Mongo副本集client读写分离和故障迁移

原文地址

前言:

用pymongo连接mongo副本集(Replica Set) 从而读写分离以及主备切换进而解决主节点故障问题。

副本集实例 Connection String URI 连接示例

  1. 获取副本集实例的 Connection String URI 连接信息,详情请参考Connection String URI
    ConnectionString主要内容:

    mongodb://username:[email protected]:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/admin?replicaSet=myRepl&authSource=admin
    • replicaSet : 指定的名称副本集
    • authSource: 指定与用户凭据关联的数据库名称。authSource 默认为连接字符串中指定的数据库。
  2. 读写分离:
    要实现读写分离,需要在 Connection String URI 的options里添加readPreference=secondaryPreferred,设置读请求为Secondary节点优先。更多读选项请参考Read preferences。

示例
mongodb://username:password@dds-xxxxxxxxxxxx:3007,xxxxxxxxxxxx:3007/admin?replicaSet=mgset-xxxxxx&readPreference=secondaryPreferred

通过以上Connection String 来连接MongoDB副本集实例,读请求将优先发给Secondary节点实现读写分离。同时客户端会自动检测节点的主备关系,当主备关系发生变化时,自动将写操作切换到新的Primary节点上,以保证服务的高可用。

代码实现:

def get_mongo_conn_url_replicaset(ip_port_list, user=None, pwd=None, set_name=None,set_authSource=None):
    url = 'mongodb://'
    if user is not None:
        if pwd is None:
            pwd = user
        url += '%s:%s@' % (user, pwd)
    url += ','.join(ip_port_list)
    if set_name is not None:
        url += '/?replicaSet=%s&authSource=%s&readPreference=secondaryPreferred' % (set_name,set_authSource)
    return url

ip_port_list = ['m3007.test.mongodb.m.com:3777', 's3007.test1.mongodb.m.com:3777', 's3007.test2.mongodb.m.com:3777']
conn_url = get_mongo_conn_url_replicaset(ip_port_list, "username", "password", "rs_3777","admin")
cli = MongoClient(conn_url)

你可能感兴趣的:(故障恢复,读写分离,副本集,mongodb,pymongo)