高可用和读写分离
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
"""现在,让我们关闭这个节点,看看当我们再次运行我们的查询会发生什么:"""
db.test.find_one()
"""得到一个AutoReconnect的异常,但它会尝试在后续操作自动重新连接
随后尝试运行查询,我们可能会继续看到这个异常。但最终,副本集将进行故障转移,并选举新的主节点
"""
db.test.find_one()
db.client.address
"""------------------------------------------------------------------------------------"""
"""MongoDB读写分离"""
"""
有5中模式:
primary
主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred
首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
secondary
从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
secondaryPreferred
首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
nearest
最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点
"""
"""
现在所有的查询将被发送到集群的从节点。如果没有从节点,主节点被用来作为备用。
"""
client = MongoClient(
'localhost:27017',
replicaSet='foo',
readPreference='secondaryPreferred')
client.read_preference
"""
默认数据库的读出优先从其MongoClient继承,一个集合的读偏好从它的数据库继承。
要使用不同的读偏好,需使用get_database()方法,或get_collection()方法:
"""
db = client.get_database('test', read_preference=ReadPreference.SECONDARY)
db.read_preference
coll = db.get_collection('test', read_preference=ReadPreference.PRIMARY)
coll.read_preference
"""您还可以更改现有集合的读偏好用with_options()方法:"""
coll2 = coll.with_options(read_preference=ReadPreference.NEAREST)
coll.read_preference
coll2.read_preference
"""mongos负载均衡"""
"""如果我们设置本地阈值,以30毫秒的所有服务器都在阈值范围内:"""
client = MongoClient('mongodb://host1,host2,host3/?localThresholdMS=30')