面试题答案
一键面试MongoDB事务机制
- 作用:在高并发场景下,事务可确保多个操作要么全部成功,要么全部失败,从而保证数据一致性。例如在一个涉及多个文档插入的业务逻辑中,若其中一个插入失败,事务能回滚已成功的插入,避免数据处于不一致状态。
- 配置与使用:从MongoDB 4.0开始支持多文档事务。使用时,首先要确保部署是复制集或分片集群。在代码中,通过客户端驱动开启事务块,例如在Node.js中:
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
async function run() {
try {
await client.connect();
const session = client.startSession();
session.startTransaction();
const collection = client.db("test").collection("documents");
await collection.insertOne({ data: "example" }, { session });
await session.commitTransaction();
} catch (e) {
console.error(e);
await session.abortTransaction();
} finally {
await client.close();
}
}
run().catch(console.dir);
写操作的原子性
- 作用:MongoDB的写操作在单个文档级别具有原子性。这意味着当多个客户端同时使用
insertOne
方法插入文档时,每个插入操作要么完整成功,要么完整失败,不会出现部分插入的情况,有助于保证数据一致性。 - 配置与使用:无需额外配置,默认单个文档的
insertOne
、updateOne
等操作都是原子性的。应用开发中,利用这种原子性可以确保对单个文档的操作完整性。
复制集同步策略
- 作用:复制集由多个成员组成,主节点处理写操作,然后将操作日志同步到从节点。在高并发插入场景下,这种同步机制确保了数据在多个节点上的一致性。如果主节点出现故障,从节点可以接替成为主节点,保证服务的连续性和数据一致性。
- 配置与使用:配置复制集时,首先要规划好节点数量和角色。在
mongod
配置文件中设置replSet
参数,例如:
replication:
replSetName: "rs0"
初始化复制集时,在主节点的MongoDB shell中运行:
rs.initiate()
分片集群同步策略
- 作用:在分片集群中,数据分布在多个分片上。写操作会被路由到对应的分片上执行。通过分片之间的数据同步和协调,保证整个集群数据的一致性。在高并发插入时,不同客户端的插入操作可能分布在不同分片,同步策略确保各分片数据的一致性。
- 配置与使用:搭建分片集群需要配置
mongos
路由节点、config
配置服务器和多个分片节点。在mongos
和config
服务器配置文件中设置相关参数,如:
sharding:
clusterRole: configsvr
configsvr:
replSetName: "configReplSet"
对于分片节点,同样在mongod
配置文件中设置sharding.clusterRole: shardsvr
。启动各组件后,使用sh.addShard()
等命令将分片添加到集群中。