PyMongo使用入门(六)

高可用和读写分离

import pymongo
from pprint import pprint

from pymongo import ReadPreference
from pymongo.errors import BulkWriteError
from pymongo import MongoClient


"""
Mongodb执行
mkdir -p /data/db0 /data/db1 /data/db2
$ mongod --port 27017 --dbpath /data/db0 --replSet foo
$ mongod --port 27018 --dbpath /data/db1 --replSet foo
$ mongod --port 27019 --dbpath /data/db2 --replSet foo

"""
c = MongoClient('localhost', 27017)

config = {'_id': 'foo', 'members': [
         {'_id': 0, 'host': 'localhost:27017'},
         {'_id': 1, 'host': 'localhost:27018'},
         {'_id': 2, 'host': 'localhost:27019'}]}

c.admin.command("replSetInitiate", config)

"""连接到副本集"""
MongoClient('localhost', replicaset='foo')
MongoClient('localhost:27018', replicaset='foo')
MongoClient('localhost', 27019, replicaset='foo')
MongoClient('mongodb://localhost:27017,localhost:27018/?replicaSet=foo')

"""------------------------------------------------------------------------------------"""

"""
处理故障切换

当发生故障转移时,PyMongo会自动试图找到新的主节点,该节点上执行后续操作。
这不能完全透明发生。然而,这里我们将执行故障切换的例子来说明一切的行为方式。
首先,我们将连接到副本集并执行几个基本操作:
"""
db = MongoClient("localhost", replicaSet='foo').test
db.test.insert_one({"x": 1}).inserted_id
db.test.find_one()
db.client.address #('localhost', 27017)

"""现在,让我们关闭这个节点,看看当我们再次运行我们的查询会发生什么:"""
db.test.find_one() #Traceback (most recent call last):pymongo.errors.AutoReconnect: ...

"""得到一个AutoReconnect的异常,但它会尝试在后续操作自动重新连接
随后尝试运行查询,我们可能会继续看到这个异常。但最终,副本集将进行故障转移,并选举新的主节点
"""
db.test.find_one()
db.client.address  #('localhost', 27018)
"""------------------------------------------------------------------------------------"""
"""MongoDB读写分离"""
"""
有5中模式:
primary
主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred
首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
secondary
从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
secondaryPreferred
首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
nearest
最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点
"""

"""
现在所有的查询将被发送到集群的从节点。如果没有从节点,主节点被用来作为备用。
"""
client = MongoClient(
      'localhost:27017',
      replicaSet='foo',
      readPreference='secondaryPreferred')
client.read_preference  #SecondaryPreferred(tag_sets=None)

"""
默认数据库的读出优先从其MongoClient继承,一个集合的读偏好从它的数据库继承。
要使用不同的读偏好,需使用get_database()方法,或get_collection()方法:
"""
db = client.get_database('test', read_preference=ReadPreference.SECONDARY)
db.read_preference  #Secondary(tag_sets=None)

coll = db.get_collection('test', read_preference=ReadPreference.PRIMARY)
coll.read_preference #Primary()

"""您还可以更改现有集合的读偏好用with_options()方法:"""
coll2 = coll.with_options(read_preference=ReadPreference.NEAREST)
coll.read_preference #Primary()
coll2.read_preference #Nearest(tag_sets=None)


"""mongos负载均衡"""
"""如果我们设置本地阈值,以30毫秒的所有服务器都在阈值范围内:"""
client = MongoClient('mongodb://host1,host2,host3/?localThresholdMS=30')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值