面试题答案
一键面试网络拓扑优化
- 合理规划物理网络:确保服务器之间网络带宽充足,减少网络延迟和丢包。例如,在数据中心内部使用高速光纤连接,不同地域的数据中心之间采用专线连接,保障副本集节点和分片集群节点间数据传输的高效性。
- 负载均衡器配置:在应用层和数据库层之间部署负载均衡器,将读请求均匀分配到各个副本集节点,写请求分配到主节点。如采用Nginx或HAProxy等负载均衡器,通过配置合理的调度算法(如轮询、加权轮询等),提高整体服务的可用性和性能。
副本集配置优化
- 节点数量与角色:根据业务读写负载,合理配置副本集节点数量。一般建议3 - 5个节点,一个主节点负责写操作,其余从节点负责读操作。避免节点过多导致选举时间过长影响性能,过少则影响高可用性。例如,对于读多写少的业务场景,可以适当增加从节点数量来分担读压力。
- 优先级设置:根据节点的硬件性能和网络状况,设置合适的优先级。性能好、网络优的节点设置较高优先级,使其更有可能成为主节点,保障写操作的高效性。例如,在一个有三个节点的副本集中,将性能最强的节点优先级设为2,其余两个设为1。
分片策略优化
- 选择合适的分片键:根据业务数据特点选择合适的分片键,确保数据在各个分片上均匀分布。例如,对于时间序列数据,可以选择时间字段作为分片键;对于用户相关数据,可以选择用户ID作为分片键,避免数据倾斜。
- 动态分片调整:根据业务发展和数据量变化,动态调整分片策略。如当某个分片的数据量增长过快时,可以进行手动拆分或利用MongoDB的自动平衡机制,将数据迁移到其他分片,保持各分片负载均衡。
索引优化
- 创建复合索引:结合业务查询条件,创建复合索引,提高查询效率。例如,对于经常按照用户ID和时间范围查询的业务,创建包含用户ID和时间字段的复合索引。
- 覆盖索引:尽量使用覆盖索引,即查询所需的字段都包含在索引中,减少对文档的读取操作。例如,查询用户的姓名和年龄,若创建了包含姓名和年龄字段的索引,MongoDB可直接从索引中获取数据,而无需读取整个文档。
结合业务场景说明优化思路
假设一个电商订单系统,存在高并发的订单查询(读操作)和订单创建(写操作)。
- 网络拓扑方面:在数据中心内部采用高速网络连接各服务器,部署负载均衡器将读请求分发到副本集从节点,写请求发送到主节点。
- 副本集配置:配置3个副本集节点,1个主节点处理订单创建,2个从节点处理订单查询。根据节点性能设置优先级,保证主节点的高效性。
- 分片策略:选择订单ID作为分片键,确保订单数据在各个分片上均匀分布。随着业务增长,若发现某个分片负载过高,及时进行动态调整。
- 索引优化:对于订单查询,根据查询条件创建复合索引,如按用户ID和订单时间查询,创建包含这两个字段的复合索引。对于查询订单基本信息的操作,使用覆盖索引,提高查询速度。