背景
读写分离还需程序访问时进行对应设置,保证读取操作优先子节点
开启操作日志记录,便于观察操作是否分散
database_repl:PRIMARY> use test
switched to db test
database_repl:PRIMARY> db.getProfilingStatus()
{
"was" : 0,
"slowms" : 100,
"sampleRate" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1571726954, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1571726954, 1)
}
database_repl:PRIMARY> db.setProfilingLevel(2)
{
"was" : 0,
"slowms" : 100,
"sampleRate" : 1,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1571726974, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1571726974, 1)
}
database_repl:PRIMARY>
ProfilingLevel 级别描述
level 0 关闭
level 1 记录慢命令
level 2 记录全部
读取副本集设置
默认情况下,复制集的所有读请求都发到Primary,Driver可通过设置Read Preference来将读请求路由到其他的节点。
primary: 默认规则,所有读请求发到Primary
primaryPreferred: Primary优先,如果Primary不可达,请求Secondary
secondary: 所有的读请求都发到Secondary
secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary
nearest:读请求发送到最近的可达节点上(通过ping探测得出最近的节点)
Python读操作优先子节点
#! /usr/bin/env python
#coding=utf-8
import time, os
import datetime
from pymongo import MongoClient
from pymongo import ReadPreference
# pip install pymongo
#MongoDB 数据库链接
conn = MongoClient(['192.168.153.128:27017', '192.168.153.129:27017', '192.168.153.130:27017'])
#读操作优先子节点
db = conn.get_database('test', read_preference=ReadPreference.SECONDARY_PREFERRED)
db.products.insert({"name": "py_insert", "age": 123})
print(db.products.find())
C#读操作优先子节点
using MongoDB.Driver;
using MongoDB.Driver.Linq;
private MongoUnitily()
{
dataBase = new MongoClient(new MongoClientSettings
{
Credentials = new List<MongoCredential>() {
MongoCredential.CreateCredential("avatar","*******","*********") // 数据库名称,用户名,用户密码
},
Servers = new string[] { "192.168.153.128:27017", "192.168.153.129:27017", "192.168.153.130:27017"}.Select(x=> { return new MongoServerAddress(x); }), // 集群IP地址
ConnectionMode = ConnectionMode.ReplicaSet, // Replica 模式
ReplicaSetName = "RS01", // Replica名称
ReadPreference = new ReadPreference(ReadPreferenceMode.SecondaryPreferred), // 读操作优先子节点
ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0),
MaxConnectionIdleTime = new TimeSpan(0, 0, 0, 3, 0),
MaxConnectionLifeTime = new TimeSpan(0, 0, 0, 3, 0),
ServerSelectionTimeout = new TimeSpan(0, 0, 0, 3, 0)
}).GetDatabase(database); // 通过数据库名称获取 DbBase
}
网友评论