MST

星途 面试题库

面试题:MongoDB副本集数据一致性模型的基本概念

请阐述MongoDB副本集数据一致性模型中的强一致性、最终一致性的概念,并说明在副本集环境下,通常哪些操作可以保证强一致性,哪些场景会体现最终一致性?
23.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

强一致性概念

强一致性意味着任何对数据的修改操作一旦成功完成,后续对该数据的读取操作都能立即看到最新的值。在MongoDB副本集里,从写操作成功返回那一刻起,所有节点都应保持数据的一致性,客户端无论从哪个节点读取数据,都能获取到最新写入的值。

最终一致性概念

最终一致性指在数据更新后,需要经过一定时间,所有副本才会达到一致状态。在这段时间内,不同副本可能存在数据不一致的情况。不过,随着时间推移,最终所有副本的数据会达成一致。

保证强一致性的操作

  1. 使用majority写关注:写操作在多数节点确认写入成功后才返回,这确保了大多数副本集成员拥有最新数据,后续读取操作能获取到最新写入的值,保证了强一致性。例如:
db.collection.insertOne({ data: "example" }, { writeConcern: { w: "majority" } });
  1. 从主节点读取:直接从主节点读取数据,由于主节点是接收写操作并将其传播到副本节点的源头,从主节点读取能保证获取到最新数据,从而保证强一致性。但这种方式会增加主节点负载。例如在Node.js驱动中:
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);

async function readFromPrimary() {
    try {
        await client.connect();
        const database = client.db('test');
        const collection = database.collection('testCollection');
        const result = await collection.find().maxTimeMS(2000).toArray();
        console.log(result);
    } finally {
        await client.close();
    }
}

readFromPrimary();

体现最终一致性的场景

  1. 从副本节点读取:为了分担主节点负载,很多时候会从副本节点读取数据。由于副本节点同步主节点数据存在一定延迟,所以可能读取到旧数据,这体现了最终一致性。例如在MongoDB Shell中:
rs.slaveOk();
db.collection.find();
  1. 网络分区时:当副本集成员间发生网络分区,不同分区内的节点可能各自独立处理写操作。在网络恢复后,数据需要重新同步,在此期间会出现数据不一致,最终才会达到一致状态,这也是最终一致性的体现。