面试题答案
一键面试MongoDB均衡器工作原理
- 数据分布基础:MongoDB采用分片机制将数据分散存储在多个分片(Shard)上。每个分片包含部分数据子集,通过片键(shard key)来决定文档属于哪个分片。
- 均衡器角色:均衡器负责在各个分片之间自动迁移数据块(chunk),以确保数据和负载在集群中均匀分布。
- 检测不均衡:均衡器定期检查集群状态,通过比较各个分片的数据量和负载情况(如磁盘使用、操作频率等)来判断是否存在不均衡。
- 数据迁移:当检测到不均衡时,均衡器会将数据块从数据量或负载较大的分片迁移到较小的分片。迁移过程中,MongoDB会在源分片和目标分片之间建立连接,以流的方式传输数据块,同时确保数据的一致性和完整性。
简单分片集群环境中基本均衡器配置
- 启动配置服务器(Config Server):
- 配置服务器存储整个集群的元数据,包括分片信息、chunk信息等。可以启动多个配置服务器以提高可用性。例如,在
config.conf
文件中配置:
然后使用storage: dbPath: /var/lib/mongodb-configsvr systemLog: destination: file path: /var/log/mongodb-configsvr.log logAppend: true processManagement: fork: true sharding: clusterRole: configsvr net: bindIp: 127.0.0.1 port: 27019
mongod -f config.conf
启动配置服务器。 - 配置服务器存储整个集群的元数据,包括分片信息、chunk信息等。可以启动多个配置服务器以提高可用性。例如,在
- 启动分片服务器(Shard Server):
- 每个分片服务器存储实际的数据。同样可以启动多个实例组成一个分片。例如,在
shard1.conf
文件中配置:
使用storage: dbPath: /var/lib/mongodb-shard1 systemLog: destination: file path: /var/log/mongodb-shard1.log logAppend: true processManagement: fork: true sharding: clusterRole: shardsvr net: bindIp: 127.0.0.1 port: 27018
mongod -f shard1.conf
启动分片服务器,类似地可以启动其他分片服务器。 - 每个分片服务器存储实际的数据。同样可以启动多个实例组成一个分片。例如,在
- 启动路由服务器(mongos):
mongos
是客户端与集群交互的入口,它从配置服务器获取元数据来路由客户端请求。在mongos.conf
文件中配置:
使用systemLog: destination: file path: /var/log/mongodb-mongos.log logAppend: true processManagement: fork: true net: bindIp: 127.0.0.1 port: 27017 sharding: configDB: configReplSet/127.0.0.1:27019
mongos -f mongos.conf
启动mongos
。 - 初始化分片集群:
- 连接到
mongos
,使用mongo
命令进入MongoDB shell。 - 使用
sh.addShard("shard1/127.0.0.1:27018")
添加分片1,类似地可以添加其他分片。 - 使用
sh.enableSharding("test")
对指定数据库(这里是test
)启用分片,然后使用sh.shardCollection("test.collection", {keyField: 1})
对集合指定片键进行分片。
- 连接到
- 均衡器设置:
- 可以通过
sh.getBalancerState()
查看均衡器状态,默认是开启的。如果要关闭均衡器,可以使用sh.setBalancerState(false)
;若要重新开启,使用sh.setBalancerState(true)
。 - 可以通过
sh.getBalancerWindow()
查看当前均衡器窗口设置,均衡器只会在设置的窗口时间内进行数据迁移。若要设置窗口,可以使用sh.setBalancerWindow("Mon - Fri 23:00 - 06:00")
,这里设置了周一到周五晚上23点到早上6点为均衡器窗口。
- 可以通过