面试题答案
一键面试硬件配置评估
- CPU:根据现有集群负载、业务读写量以及未来增长预估,选择具有足够核心数和频率的 CPU。例如,如果当前集群在业务高峰时 CPU 利用率经常接近 80%,且业务呈上升趋势,新服务器应选择比现有服务器 CPU 性能高 30% - 50% 的型号。
- 内存:依据 MongoDB 数据量及工作集大小来确定。若工作集接近现有服务器内存上限,新服务器内存应适当增加,一般建议增加 1 - 2 倍工作集预计增长的大小。比如现有工作集 10GB,预计未来增长 5GB,新服务器内存可设置为 16GB 或 32GB。
- 存储:考虑数据增长速度和磁盘 I/O 性能。若数据增长迅速且对读写性能要求高,选用高速 SSD 存储。根据预估的数据增长量,计算所需的存储容量,如预计每年增长 1TB,新服务器可配置 2 - 3TB 的存储。
- 网络:确保网络带宽满足数据传输需求。对于分片集群,服务器间数据迁移可能产生大量网络流量,至少配备万兆网卡,以保障网络传输速率。
网络规划
- 子网划分:将新服务器规划到与现有 MongoDB 集群相同的子网内,确保内部通信的高效性和安全性。例如,若现有集群使用 192.168.1.0/24 子网,新服务器也应配置在此子网段内。
- 防火墙设置:配置防火墙规则,允许新服务器与现有集群各节点进行必要的通信。开放 MongoDB 服务端口(默认 27017 等),同时限制外部非授权访问。
- 负载均衡:如果使用负载均衡器,将新服务器添加到负载均衡器的后端服务器列表中,并根据业务需求调整负载均衡策略,如采用轮询或加权轮询算法,确保请求均匀分配到各服务器。
添加新服务器后的性能优化
- 配置优化:
- 根据新服务器硬件资源,调整 MongoDB 配置文件(如
mongod.conf
)。例如,合理设置wiredTigerCacheSizeGB
参数,以充分利用内存资源。 - 优化存储引擎参数,如调整
writeConcern
以平衡写入性能和数据安全性。对于一些对数据一致性要求不高的写入操作,可适当降低writeConcern
级别。
- 根据新服务器硬件资源,调整 MongoDB 配置文件(如
- 索引优化:
- 分析现有索引使用情况,使用
db.collection.getIndexes()
命令查看索引。对于频繁查询但未使用索引的字段,考虑添加合适的索引。 - 定期使用
db.collection.reIndex()
命令重建索引,以优化索引结构,提高查询性能。
- 分析现有索引使用情况,使用
- 分片优化:
- 检查分片键的选择是否合理,若分片不均匀,可能需要重新选择分片键并进行数据迁移。例如,若以时间戳为分片键导致数据在某些分片上堆积,可考虑选择业务相关的更均匀分布的字段作为分片键。
- 监控分片间的数据迁移情况,确保新服务器能够顺利接收和处理分配的数据。
数据一致性验证
- 副本集验证:
- 使用
rs.status()
命令检查副本集成员状态,确保新服务器成功加入副本集且数据同步正常。查看optimeDate
字段,确认各成员的操作时间戳一致。 - 执行简单的读写操作,在主节点写入数据,然后在从节点查询,验证数据是否准确同步。例如,插入一条文档
db.collection.insertOne({key: "value"})
,然后在从节点执行db.collection.find({key: "value"})
,检查是否能查到相同数据。
- 使用
- 分片集群验证:
- 使用
sh.status()
命令查看分片集群状态,确认新服务器对应的分片已正确配置且数据分布均衡。 - 进行跨分片的复杂查询操作,验证数据一致性。如执行聚合操作
db.collection.aggregate([{$group: {_id: "$category", count: {$sum: 1}}}])
,确保在不同分片上的数据能够正确聚合。 - 利用 MongoDB 的一致性检查工具,如
mongodump
和mongorestore
进行数据对比验证。在不同节点执行mongodump
备份数据,然后使用工具对比备份文件,确保数据一致。
- 使用