面试题答案
一键面试- 配置步骤:
- 搭建副本集:
- 首先确保有多个MongoDB实例作为副本集成员。假设已经有三个节点,分别为
node1
、node2
、node3
。 - 启动每个节点时,使用
--replSet
选项指定副本集名称,例如:mongod --replSet myReplSet --bind_ip_all --port 27017
(--bind_ip_all
允许远程连接,生产环境需谨慎使用)。
- 首先确保有多个MongoDB实例作为副本集成员。假设已经有三个节点,分别为
- 初始化副本集:
- 连接到其中一个节点,例如
node1
,进入MongoDB shell。 - 使用
rs.initiate()
命令初始化副本集,对于三节点副本集,示例配置如下:
- 连接到其中一个节点,例如
- 搭建副本集:
var config = {
_id: "myReplSet",
members: [
{ _id: 0, host: "node1:27017" },
{ _id: 1, host: "node2:27017" },
{ _id: 2, host: "node3:27017" }
]
};
rs.initiate(config);
- 参数设置:
- 读偏好(Read Preference):
- 在应用程序连接MongoDB时设置读偏好为
secondaryPreferred
或nearest
。 - 以Node.js的
mongodb
驱动为例,代码示例如下:
- 在应用程序连接MongoDB时设置读偏好为
- 读偏好(Read Preference):
const { MongoClient } = require('mongodb');
const uri = "mongodb://node1:27017,node2:27017,node3:27017/?replicaSet=myReplSet";
const client = new MongoClient(uri, {
readPreference: 'secondaryPreferred'
});
async function run() {
try {
await client.connect();
const database = client.db("test");
const collection = database.collection("documents");
const result = await collection.find({}).toArray();
console.log(result);
} finally {
await client.close();
}
}
run().catch(console.dir);
-
secondaryPreferred
:优先从副本节点读取数据,如果副本节点不可用,则从主节点读取。 -
nearest
:从最近的节点读取数据,不区分主节点和副本节点,可实现更均匀的读操作分配。 -
权重设置(Weight):
- 可以通过设置副本集成员的权重来影响数据分发。权重高的节点更有可能被选为读取数据的节点。
- 在副本集配置中,通过
members[n].priority
参数设置权重,例如:
var config = rs.conf();
config.members[0].priority = 2;
config.members[1].priority = 1;
config.members[2].priority = 1;
rs.reconfig(config);
这里node1
的权重为2,node2
和node3
的权重为1,意味着node1
相对更可能被选为读取节点。但结合读偏好设置,可进一步精准控制读操作分配。