面试题答案
一键面试故障检测
- 副本集内部检测:MongoDB副本集成员之间通过心跳机制(默认2秒一次)相互发送ping消息来检测彼此状态。如果某个节点在一定时间(默认10秒)内未收到主节点的心跳响应,会触发选举流程。
- MongoDB Compass 检测:MongoDB Compass 连接到副本集时,会监控连接状态。当连接到故障节点时,会尝试重新连接到副本集的其他可用节点。它依赖副本集自身的心跳检测机制来获取节点状态信息,当副本集内完成故障检测和选举后,MongoDB Compass 能够感知到副本集拓扑结构的变化。
故障转移过程中交互机制
- 选举新主节点:当检测到主节点故障,符合条件的从节点(如优先级较高、数据较新)会发起选举。在选举过程中,节点会相互投票,获得大多数票(超过副本集成员半数)的节点成为新主节点。
- MongoDB Compass 重定向:故障转移完成后,MongoDB Compass 会检测到副本集拓扑变化,自动将后续操作请求重定向到新的主节点。例如,如果之前连接的主节点故障,新主节点选举产生后,Compass 会更新连接状态,将写操作发送到新主节点,读操作根据配置可发送到新主节点或从节点。
避免数据丢失和业务中断的配置与操作
- 写关注配置:
- 在应用层面,使用合适的写关注(write concern)。例如,设置
w: "majority"
,确保数据写入到大多数节点后才返回成功,这样在主节点故障时,已确认写入的数据不会丢失。例如在使用insertOne
方法时:
- 在应用层面,使用合适的写关注(write concern)。例如,设置
db.collection('yourCollection').insertOne({data: "example"}, {writeConcern: {w: "majority"}});
- 在 MongoDB Compass 中,也可以在执行写操作时指定写关注选项,保证数据写入的可靠性。
2. 读偏好配置:
- 对于读操作,合理设置读偏好(read preference)。例如,应用场景允许读取稍旧数据时,可设置读偏好为 secondaryPreferred
或 secondary
,将读请求发送到从节点,减轻主节点压力,同时在主节点故障时,从节点可继续提供读服务,减少业务中断可能性。在 MongoDB Compass 连接设置中可配置读偏好:
// 示例代码用于设置读偏好
var client = new MongoClient("mongodb://replicaSetHosts", {
readPreference: "secondaryPreferred"
});
- 副本集成员配置:
- 确保副本集有足够数量的节点(至少3个),以便在单个节点故障时能够进行选举。并且合理设置节点优先级,将性能较好、数据可靠性高的节点设置为较高优先级,使其更有可能成为主节点。在副本集配置文件中设置优先级:
{
"_id": "yourReplicaSetName",
"members": [
{
"_id": 0,
"host": "primaryHost:27017",
"priority": 2
},
{
"_id": 1,
"host": "secondaryHost1:27017",
"priority": 1
},
{
"_id": 2,
"host": "secondaryHost2:27017",
"priority": 1
}
]
}
- 定期备份与恢复:
- 定期使用 MongoDB 的备份工具(如
mongodump
)对数据进行备份。在出现严重故障导致数据丢失时,可以通过mongorestore
进行恢复,最大程度减少数据丢失。例如,使用以下命令进行备份:
- 定期使用 MongoDB 的备份工具(如
mongodump --uri="mongodb://replicaSetHosts" --out=/backup/path
然后在需要恢复时:
mongorestore --uri="mongodb://newReplicaSetHosts" --dir=/backup/path