MST

星途 面试题库

面试题:MongoDB 数据分发技巧之副本集应用

在MongoDB副本集中,如何通过配置来精准控制数据分发,确保读操作均匀分配到各个副本节点上?请描述相关的配置步骤和参数设置。
40.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 配置步骤
    • 搭建副本集
      • 首先确保有多个MongoDB实例作为副本集成员。假设已经有三个节点,分别为node1node2node3
      • 启动每个节点时,使用--replSet选项指定副本集名称,例如:mongod --replSet myReplSet --bind_ip_all --port 27017--bind_ip_all允许远程连接,生产环境需谨慎使用)。
    • 初始化副本集
      • 连接到其中一个节点,例如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);
  1. 参数设置
    • 读偏好(Read Preference)
      • 在应用程序连接MongoDB时设置读偏好为secondaryPreferrednearest
      • 以Node.js的mongodb驱动为例,代码示例如下:
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,node2node3的权重为1,意味着node1相对更可能被选为读取节点。但结合读偏好设置,可进一步精准控制读操作分配。