avatar

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

前言:

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

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

  1. 获取副本集实例的 Connection String URI 连接信息,详情请参考[Connection String URI]

ConnectionString 主要内容:

1
mongodb://username:password@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/admin?replicaSet=myRepl&authSource=admin
  • replicaSet : 指定的名称副本集
  • authSource:  指定与用户凭据关联的数据库名称。authSource  默认为连接字符串中指定的数据库。
  1. 读写分离:

要实现读写分离,需要在 Connection String URI 的options里添加readPreference=secondaryPreferred,设置读请求为 Secondary 节点优先。
更多读选项请参考Read preferences

示例

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

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

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
文章作者: luochenxi
文章链接: https://luochenxi.github.io/2019/10/12/yuque/Mongo%E5%89%AF%E6%9C%AC%E9%9B%86client%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E5%92%8C%E6%95%85%E9%9A%9C%E8%BF%81%E7%A7%BB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kirio

评论