面试题答案
一键面试缓存策略
- 读写分离:
- 主节点负责写操作,从节点负责读操作。利用从节点分担读压力,通过配置MongoDB副本集实现。应用程序根据读写需求连接不同节点,降低主节点读负载,提升读性能。
- 例如,使用MongoDB驱动程序时,可在连接字符串中指定读偏好(readPreference)为secondaryPreferred,让读操作优先从从节点获取数据。
- 合理设置缓存有效期:
- 根据数据的变化频率设置不同缓存有效期。对于变化频繁的数据,设置较短有效期,如实时统计数据;对于相对稳定的数据,设置较长有效期,如商品分类信息。
- 在应用程序缓存实现中,可采用时间戳或版本号机制,当数据更新时,更新缓存的有效期或版本,确保缓存数据的一致性。
- 多级缓存:
- 采用内存缓存(如Redis)作为一级缓存,应用程序本地缓存作为二级缓存。一级缓存用于快速响应大量读请求,二级缓存减轻一级缓存压力并加快本地访问速度。
- 例如,先从应用程序本地缓存查找数据,若未命中则从Redis缓存查找,仍未命中则查询MongoDB,查询到的数据依次更新到二级和一级缓存。
- 缓存预热:
- 在系统启动阶段,预先将热点数据加载到缓存中。通过分析历史访问记录或业务逻辑确定热点数据,利用脚本或定时任务在系统启动前将数据查询并写入缓存。
- 比如,在电商系统启动时,将热门商品信息、促销活动数据等加载到缓存,避免系统刚启动时大量请求直接查询MongoDB导致性能下降。
配置参数
- 调整内存分配:
- mmapv1存储引擎:MongoDB默认使用mmapv1存储引擎,可通过调整操作系统的内存分配参数(如sysctl的vm.swappiness参数),减少磁盘交换,让更多内存用于MongoDB数据缓存。将vm.swappiness设置为较低值(如10),使系统优先使用物理内存,提升MongoDB性能。
- WiredTiger存储引擎:该引擎有自己的缓存配置参数,可通过调整
storage.wiredTiger.engineConfig.cacheSizeGB
参数,根据服务器内存情况合理分配给WiredTiger的缓存大小。一般建议设置为服务器物理内存的50% - 80%,例如服务器有32GB内存,可设置为16GB - 25.6GB。
- 副本集配置:
- 仲裁节点:在副本集中,仲裁节点不存储数据,仅参与选举。合理配置仲裁节点,可减少数据节点负载,提升副本集稳定性。例如,在三节点副本集中,可设置一个仲裁节点,两个数据节点,让仲裁节点负责选举决策,数据节点专注于数据读写。
- 延迟节点:添加延迟节点,它的数据比主节点延迟一定时间。可用于数据备份、灾难恢复及特定查询(如查询历史数据状态),不影响主从节点的正常读写。通过在副本集配置文件中设置
priority
为0,slaveDelay
为指定延迟时间(如3600秒)来配置延迟节点。
- 索引优化:
- 复合索引:根据查询条件创建复合索引,将经常一起使用的查询字段组合成复合索引。例如,在用户查询中,经常按“年龄”和“性别”查询,可创建复合索引
{age: 1, gender: 1}
,提升查询性能。注意索引字段顺序,遵循最左前缀原则。 - 覆盖索引:当查询字段都包含在索引中时,MongoDB可直接从索引获取数据,无需回表操作。例如,查询只需要“用户名”和“邮箱”字段,创建包含这两个字段的覆盖索引
{username: 1, email: 1}
,减少磁盘I/O,提升查询效率。
- 复合索引:根据查询条件创建复合索引,将经常一起使用的查询字段组合成复合索引。例如,在用户查询中,经常按“年龄”和“性别”查询,可创建复合索引