面试题答案
一键面试查看数据库列表
- 单机环境:在单机MongoDB环境下,查看数据库列表相对简单。通过使用
show dbs
命令,MongoDB直接从本地存储引擎读取数据库元数据,快速返回当前实例中的所有数据库列表。因为数据都集中存储在单机,无需进行额外的数据聚合或跨节点操作。 - 集群环境:
- 副本集:副本集环境下查看数据库列表(同样使用
show dbs
命令),从主节点获取数据库列表信息。主节点维护着整个副本集的元数据,从节点会定期与主节点同步元数据信息。所以show dbs
命令本质上是查询主节点的元数据存储来获取数据库列表。 - 分片集群:在分片集群中,
show dbs
命令的执行稍微复杂。MongoDB查询路由(mongos)会向每个分片的config服务器查询数据库相关元数据。每个分片的config服务器存储着该分片的数据库和集合等元数据信息。mongos汇总来自各个分片config服务器的信息,然后返回完整的数据库列表给客户端。这一过程涉及到跨多个分片节点的元数据查询与聚合。
- 副本集:副本集环境下查看数据库列表(同样使用
切换数据库操作
- 单机环境:单机环境下切换数据库使用
use <database_name>
命令,此操作只是简单地改变当前会话所操作的数据库上下文,对单机系统的负载影响极小,因为不涉及数据移动或节点间通信。 - 集群环境:
- 副本集:副本集内切换数据库同样使用
use <database_name>
命令。由于副本集内主从节点数据同步是异步的,且主要数据操作在主节点,切换数据库主要影响主节点的上下文切换。只要主节点性能足够,对整个副本集的负载均衡影响不大。 - 分片集群:在分片集群中执行
use <database_name>
命令时,mongos会根据数据库的分片规则确定数据所在的分片。如果频繁切换数据库且这些数据库分布在不同分片,可能会增加mongos与不同分片之间的通信开销,影响集群的负载均衡。因为mongos需要不断与不同分片交互,可能导致某些分片和mongos之间的网络流量增加,在极端情况下可能成为性能瓶颈。同时,如果某个数据库的数据分布不均衡,频繁切换到该数据库可能导致对应分片负载过高。
- 副本集:副本集内切换数据库同样使用