面试题答案
一键面试过时数据处理策略
- 定期删除脚本:编写一个定期执行的脚本(如使用Python的
pymongo
库)。脚本逻辑如下:
可以使用系统的定时任务工具(如Linux的import pymongo from datetime import datetime, timedelta client = pymongo.MongoClient("mongodb://your_replica_set_uri") db = client.your_database collection = db.your_collection now = datetime.now() types_retention = { "A": timedelta(days = 90), "B": timedelta(days = 60) } for type, retention in types_retention.items(): cutoff = now - retention collection.delete_many({ "type": type, "timestamp": {"$lt": cutoff} })
cron
)定期运行该脚本,确保数据按业务类型的保留时间要求清理。 - TTL索引:对于部分业务类型,如果其数据量较大且删除操作对性能影响较小,也可以考虑使用MongoDB的TTL索引。例如,对于业务类型A:
这样MongoDB会自动删除超过指定时间的数据。但要注意,TTL索引有一些限制,如索引字段必须是db.your_collection.createIndex( { "timestamp": 1, "type": 1 }, { expireAfterSeconds: 90 * 24 * 60 * 60, partialFilterExpression: { type: "A" } } )
date
类型等。
应对网络分区等异常情况
- 选举机制:MongoDB副本集有自动选举机制。在网络分区时,多数节点(超过半数)所在的分区会继续提供服务并维持数据一致性。少数节点所在分区则会暂停写入操作,防止数据不一致。当网络恢复后,少数节点会自动同步多数节点的数据,重新加入副本集。
- 心跳检测:副本集成员之间通过心跳机制保持联系。如果某个成员在一定时间内没有收到其他成员的心跳,就会触发重新选举。可以适当调整心跳检测的时间间隔(通过配置
heartbeatIntervalMillis
等参数),以在网络不稳定时能够及时发现并处理异常情况。 - 日志记录:在删除过时数据的脚本中,增加详细的日志记录。记录每次删除操作的执行时间、处理的业务类型、删除的数据量等信息。这样在出现异常情况(如误删除、未按预期删除等)时,可以通过日志进行排查和恢复。
- 备份恢复:定期对数据库进行备份(如使用
mongodump
工具)。如果在网络分区或其他异常情况下数据出现问题,可以通过备份数据进行恢复。同时,将备份数据存储在多个位置,以防止存储设备故障等导致备份数据丢失。