面试题答案
一键面试集合配置方面
- 设置合理的大小:根据预计的数据量和系统资源,设定合适的固定集合大小。既要保证能容纳一定时间内的数据,又不能过大浪费资源。例如,如果预计每秒产生100条数据,每条数据大小1KB,每天运行8小时,那么一天的数据量约为100 * 1024 * 60 * 60 * 8 = 2880MB。可以在此基础上适当增加一定比例作为集合大小。
- 指定文档数量:结合业务需求,限制集合中的文档数量。若业务场景下数据是按事件记录,且每个事件相关数据量较为固定,可以设定一个合适的文档数量上限。
日常维护方面
- 监控集合状态:定期使用
db.collection.stats()
命令监控集合的大小、文档数量、空闲空间等指标,及时发现异常情况。如发现集合快满,提前预警。 - 数据备份与恢复:定期备份固定集合数据,以防数据丢失。使用
mongodump
和mongorestore
工具进行备份和恢复操作。
处理固定集合满员后新数据插入操作
- 覆盖旧数据:固定集合默认采用循环覆盖策略,即当集合满时,新插入的数据会覆盖最早插入的数据。这种方式适用于对历史数据需求不大,只关注最新数据的场景。
- 分割集合:当集合满员时,创建一个新的固定集合,并将旧集合中部分数据迁移到新集合。例如,按照时间维度,将旧集合中较老的数据迁移出去,保持当前集合为近期数据,这样可避免性能瓶颈。同时,为了便于管理,可以给集合命名加上时间戳等标识。
- 使用队列缓冲:在数据插入前,先将数据放入消息队列(如RabbitMQ、Kafka等)。在集合未满时,从队列中获取数据插入;当集合满员时,暂停从队列获取数据,直到集合有空闲空间(如通过监控发现有空间),再恢复从队列取数据插入,以此避免因频繁处理满员情况导致的性能瓶颈。