面试题答案
一键面试数据分布策略
- 基于片键选择:选择合适的片键对数据进行分区,如按时间戳、地理位置等进行划分。例如对于时间序列数据,以时间字段作为片键,可保证数据按时间顺序均匀分布在各个分片上,便于按时间范围查询。这样新数据也能均匀分布,避免数据倾斜。
- 范围分片与哈希分片结合:对于需要按范围查询的数据采用范围分片,对于需要均匀分布且无明显范围查询需求的数据采用哈希分片。比如用户ID,若经常按用户ID范围查询,可采用范围分片;若主要是随机查询,哈希分片能更好地分布数据。
节点配置
- 硬件资源分配:
- 计算资源:根据数据量和查询负载,为每个节点合理分配CPU核心数和内存。例如对于读密集型业务,增加内存可提高数据缓存命中率,减少磁盘I/O。如果预估每秒有大量查询请求,为节点配置多核高性能CPU以处理计算任务。
- 存储资源:选择合适的存储介质,如SSD,提高读写速度。对于数据量增长较快的场景,确保有足够的磁盘空间,并且可采用分布式存储系统来进一步扩展存储容量。
- 节点角色分配:
- 配置节点:合理规划配置节点数量,一般3个为宜,以保证配置信息的一致性和可靠性。它们存储集群的元数据,元数据的稳定对整个集群至关重要。
- 路由节点(mongos):根据客户端请求数量和负载情况,动态调整mongos节点数量。例如在高并发时期,增加mongos节点分担请求压力,避免单个mongos成为瓶颈。
- 数据节点:依据数据量和性能需求添加数据节点。当数据量预计增长到一定程度,提前规划新的数据节点加入集群,保证数据存储和处理能力的扩展性。
负载均衡
- mongos负载均衡:mongos自动将客户端请求均衡分配到各个数据节点。通过合理配置mongos的负载均衡算法参数,如权重等,可根据数据节点的硬件性能和负载情况进行更优化的分配。例如性能好的节点设置较高权重,接收更多请求。
- 复制集内负载均衡:在复制集中,主节点处理写操作,从节点可分担读操作。配置从节点的优先级,根据业务需求让特定从节点接收更多读请求。如对于实时性要求不高的报表查询,可将其定向到优先级较低的从节点。
应对资源瓶颈
- CPU瓶颈:
- 优化查询:分析慢查询日志,优化查询语句,减少不必要的计算。例如避免全表扫描,通过创建合适的索引来加速查询。
- 增加节点:若单个节点CPU持续满载,考虑增加数据节点或mongos节点,分担计算压力。
- 内存瓶颈:
- 调整缓存策略:优化MongoDB的内存使用策略,如调整WiredTiger引擎的缓存参数,确保重要数据能被缓存。
- 数据清理:清理过期或无用的数据,释放内存空间。对于一些日志数据,设置合理的保留期限,定期删除过期数据。
- 网络瓶颈:
- 升级网络设备:若网络带宽不足,升级网络交换机、路由器等设备,提高网络传输速率。
- 数据本地化:尽量将相关数据存储在同一数据中心内,减少跨数据中心的数据传输,降低网络延迟。