面试题答案
一键面试1. 分片键选择
- 理解业务读写模式:
- 若读操作主要基于某个特定字段,如用户ID进行,那么该字段可作为分片键候选。例如在社交媒体应用中,大量读操作围绕用户动态,以用户ID作为分片键,可使特定用户相关的数据集中在一个或少数分片上,提升读性能。
- 对于写操作,若存在特定规律,如按时间创建记录,时间字段(如创建时间戳)可考虑作为分片键。这样新写入的数据会按时间分布在不同分片,避免写入热点。
- 数据关联性考量:
- 如果数据间存在强关联,比如订单和订单详情,它们应尽量存储在同一分片。可选择订单ID作为分片键,保证相关数据在同一分片,减少跨分片查询开销。
- 避免选择低基数(唯一值少)的字段作为分片键,如性别字段,否则数据分布会极不均匀,导致部分分片负载过重。
2. 平衡数据负载
- 监控与分析:
- 使用MongoDB提供的监控工具,如MongoDB Cloud Manager或Ops Manager,实时监控各分片的负载情况,包括CPU使用率、内存使用、磁盘I/O和网络流量等指标。
- 分析数据分布,查看各分片的数据量和读写请求频率,判断是否存在负载不均衡的情况。
- 动态调整:
- 当发现某个分片负载过高时,可通过MongoDB的balancer机制进行数据迁移。balancer会自动在分片间移动数据块(chunk),以平衡负载。默认情况下,balancer每24小时运行一次,但可根据需要调整运行频率。
- 手动干预,在必要时,可使用
splitChunk
和moveChunk
命令,将数据从高负载分片迁移到低负载分片。例如,当发现某个分片由于特定业务操作导致数据过度集中,手动迁移数据可快速缓解负载压力。
3. 处理跨分片事务
- 多文档事务:
- MongoDB从4.0版本开始支持多文档事务。在跨分片事务场景下,应用程序可使用
startTransaction
、commitTransaction
和abortTransaction
等方法来管理事务。 - 例如,在电商场景中,订单创建涉及订单表和库存表的更新,可使用多文档事务保证数据一致性。但要注意,跨分片事务性能相对单分片事务较低,应尽量减少不必要的跨分片事务。
- MongoDB从4.0版本开始支持多文档事务。在跨分片事务场景下,应用程序可使用
- 最终一致性:
- 对于一些对一致性要求不高的场景,可采用最终一致性策略。即允许数据在短时间内存在不一致,但经过一段时间后达到一致。例如在一些统计类业务中,先进行数据的异步更新,最终实现数据一致性,可提升系统整体性能和可扩展性。