MongoDB副本集通过维护多份数据副本来保证数据的高可用。相当于主备方式的数据冗余,其提供了自动故障转移的主从复制集群,其中复制集没有固定的主节点,当一个主机的故障后从节点会重新“选举”出一个新的主节点,从而提高的系统的可用性。MongoDB副本集只有Primary节点具有写数据的能力,当副本集中Primary节点宕机,或者副本集本身轮转升级时,副本集会触发选举,选出一个新的primary,原Primary节点则会降级成secondary。
MongoDB典型副本集架构
当客户端连接副本集时,如果以primary地址连接实例,当发生上述情况时,P节点降级为Secondary节点,客户端将无法继续执行写操作。为了解决这一问题,连接线上数据时,最好是使用副本集方式连接副本集。
正确连接副本集,可以参考官网的 https://docs.mongodb.com/manual/reference/connection-string/该文档描述了官方MongoDB drivers连接MongoDB实例的URI格式。
URI形如:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]]][/[database][?options]]
python客户端示例:
from pymongo import MongoClient
def get_mongo_conn_url_replicaset(ip_port_list, user=None, pwd=None, set_name=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' % set_name
return url
ip_port_list = ['10.218.131.34:3005', '10.125.51.287:3009', '10.185.2.131:3014']
conn_url = get_mongo_conn_url_replicaset(ip_port_list, "usrname", "password", "mgsetxxx")
cli = RdsMongoClient(conn_url)
status = cli.admin.command('replSetGetStatus')
options选项
options部分是某些连接参数的设置,形如:name=value的格式,如replicaset=xxx,其他重要的参数如:
保证数据写入到大多数节点后返回?
在options里添加w= majority
即可保证写请求成功写入大多数节点才向客户端确认。
设置连接数?
在options里添加maxPoolSize=xx
即可将客户端连接池限制在xx以内。
实现读写分离(即将读请求优先到secondary)?
在options里添加readPreference=secondaryPreferred
即可实现。