MST

星途 面试题库

面试题:MongoDB副本集在读写分离场景中的基本配置

请描述如何配置MongoDB副本集以实现基本的读写分离?包括副本集的搭建步骤以及读写分离相关的配置参数说明。
48.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

搭建MongoDB副本集步骤

  1. 准备工作
    • 确保安装了MongoDB,并且各节点(主节点、从节点)之间网络互通。
    • 为每个节点创建数据目录和日志目录,例如:
      mkdir -p /data/mongodb/node1/data
      mkdir -p /data/mongodb/node1/logs
      
  2. 配置每个节点的mongod.conf文件
    • 以一个节点为例,编辑mongod.conf,以下是基本配置内容:
    systemLog:
      destination: file
      path: /data/mongodb/node1/logs/mongod.log
      logAppend: true
    storage:
      dbPath: /data/mongodb/node1/data
    net:
      bindIp: 0.0.0.0
      port: 27017
    replication:
      oplogSizeMB: 1024
      replSetName: rs0
    
    • 其中replSetName是副本集的名称,所有节点需保持一致。oplogSizeMB用于设置操作日志大小,可根据实际需求调整。
  3. 启动各节点的mongod服务
    • 在每个节点所在目录执行:
    mongod -f /etc/mongod.conf
    
  4. 初始化副本集
    • 连接到其中一个节点,例如主节点:
    mongo --port 27017
    
    • 在MongoDB shell中执行初始化命令:
    rs.initiate({
      _id: "rs0",
      members: [
        { _id: 0, host: "node1:27017" },
        { _id: 1, host: "node2:27017" },
        { _id: 2, host: "node3:27017" }
      ]
    });
    
    • 这里_id需与replSetName一致,members数组中列出了副本集中所有节点的主机名和端口。

读写分离相关配置参数说明

  1. 读偏好(Read Preference)
    • Primary:默认设置,读操作只在主节点执行。这确保了读取到的是最新数据,但可能会给主节点带来较大负载。
    • PrimaryPreferred:优先在主节点执行读操作,如果主节点不可用,则在从节点执行读操作。
    • Secondary:读操作只在从节点执行。适用于对数据实时性要求不高,希望减轻主节点负载的场景,但可能读取到的数据不是最新的。
    • SecondaryPreferred:优先在从节点执行读操作,如果所有从节点不可用,则在主节点执行读操作。
    • Nearest:在延迟最小的节点执行读操作,无论该节点是主节点还是从节点。
    • 在应用程序中设置读偏好,以Python的pymongo库为例:
    from pymongo import MongoClient, ReadPreference
    
    client = MongoClient('mongodb://node1:27017,node2:27017,node3:27017/?replicaSet=rs0',
                         read_preference = ReadPreference.SECONDARY)
    
  2. 写关注(Write Concern)
    • w参数:用于指定写操作需要确认的节点数。例如w:1表示只需主节点确认写操作成功;w:2表示需要主节点和至少一个从节点确认写操作成功。更高的w值可以提高数据的安全性,但会增加写操作的延迟。
    • j参数j=true表示写操作需要等待数据写入磁盘日志(journal)后才返回确认,这可以保证数据的持久性,但同样会增加写操作的延迟。在应用程序中设置写关注,以pymongo为例:
    collection = client.test.collection
    result = collection.insert_one({"key": "value"}, write_concern = {"w": 2, "j": true})