原文地址
前言:
用 pymongo 连接 mongo 副本集(Replica Set) 从而读写分离以及主备切换进而解决主节点故障问题。
副本集实例 Connection String URI 连接示例
-
获取副本集实例的 Connection String URI 连接信息,详情请参考 Connection String URI
ConnectionString 主要内容:mongodb://username:password@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/admin?replicaSet=myRepl&authSource=admin
- replicaSet : 指定的名称副本集
- authSource: 指定与用户凭据关联的数据库名称。
authSource
默认为连接字符串中指定的数据库。
- 读写分离:
要实现读写分离,需要在 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)