MST

星途 面试题库

面试题:MongoDB手动分片的基本步骤有哪些

请详细阐述在MongoDB中进行手动分片操作时,从初始化到完成分片的主要步骤。包括但不限于配置服务器、分片服务器以及路由服务器的设置,同时说明在每个步骤中可能涉及到的关键命令或操作。
45.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 初始化配置服务器
    • 创建配置服务器实例
      • 配置服务器用于存储分片群集的元数据。通常建议使用3个配置服务器节点组成副本集以提高可靠性。
      • 启动配置服务器进程,例如在Linux系统下,可以通过以下命令启动(假设MongoDB安装在/usr/local/mongodb目录下):
        /usr/local/mongodb/bin/mongod --configsvr --replSet <configReplSetName> --port <configServerPort> --dbpath <configServerDataDir>
        
        • --configsvr:表示该实例是配置服务器。
        • --replSet <configReplSetName>:指定配置服务器副本集名称。
        • --port <configServerPort>:指定配置服务器监听端口,例如27019
        • --dbpath <configServerDataDir>:指定配置服务器数据存储目录。
    • 初始化配置服务器副本集
      • 连接到其中一个配置服务器实例,例如通过mongo --port <configServerPort>连接。
      • 在Mongo shell中,使用以下命令初始化副本集:
        rs.initiate({
          _id: "<configReplSetName>",
          members: [
            { _id: 0, host: "<configServer1Host>:<configServerPort>" },
            { _id: 1, host: "<configServer2Host>:<configServerPort>" },
            { _id: 2, host: "<configServer3Host>:<configServerPort>" }
          ]
        });
        
        • <configReplSetName>:与启动配置服务器时指定的副本集名称一致。
        • <configServer1Host><configServer2Host><configServer3Host>:分别是3个配置服务器节点的主机名或IP地址。
  2. 设置分片服务器
    • 启动分片服务器实例
      • 每个分片可以是一个单独的MongoDB实例,也可以是一个副本集。如果使用副本集作为分片,启动过程类似配置服务器副本集的启动。
      • 对于单个实例的分片服务器,启动命令如下(假设MongoDB安装在/usr/local/mongodb目录下):
        /usr/local/mongodb/bin/mongod --shardsvr --port <shardServerPort> --dbpath <shardServerDataDir>
        
        • --shardsvr:表示该实例是分片服务器。
        • --port <shardServerPort>:指定分片服务器监听端口,例如27018
        • --dbpath <shardServerDataDir>:指定分片服务器数据存储目录。
      • 对于副本集作为分片,启动命令需添加--replSet参数,例如:
        /usr/local/mongodb/bin/mongod --shardsvr --replSet <shardReplSetName> --port <shardServerPort> --dbpath <shardServerDataDir>
        
        • <shardReplSetName>:分片副本集名称。
    • 添加分片到群集
      • 连接到路由服务器(通常是mongos实例),例如mongo --port <mongosPort>
      • 在Mongo shell中,使用以下命令添加分片:
        • 如果是单个实例分片:
          sh.addShard("<shardServerHost>:<shardServerPort>");
          
          • <shardServerHost>:分片服务器主机名或IP地址。
          • <shardServerPort>:分片服务器端口。
        • 如果是副本集分片:
          sh.addShard("<shardReplSetName>/<primaryMemberHost>:<shardServerPort>,<secondaryMemberHost>:<shardServerPort>");
          
          • <shardReplSetName>:分片副本集名称。
          • <primaryMemberHost>:副本集主节点主机名或IP地址。
          • <secondaryMemberHost>:副本集从节点主机名或IP地址。
  3. 配置路由服务器(mongos)
    • 启动mongos实例
      • mongos是客户端与分片群集交互的接口,它本身不存储数据,而是根据配置服务器的元数据将请求路由到合适的分片服务器。
      • 启动mongos实例的命令如下(假设MongoDB安装在/usr/local/mongodb目录下):
        /usr/local/mongodb/bin/mongos --configdb <configReplSetName>/<configServer1Host>:<configServerPort>,<configServer2Host>:<configServerPort>,<configServer3Host>:<configServerPort> --port <mongosPort>
        
        • --configdb:指定配置服务器副本集的连接字符串,包含副本集名称和配置服务器节点信息。
        • --port <mongosPort>:指定mongos实例监听端口,例如27017
  4. 启用数据库分片
    • 连接到mongos:通过mongo --port <mongosPort>连接到mongos实例。
    • 启用数据库分片
      • 使用以下命令启用特定数据库的分片:
        sh.enableSharding("<databaseName>");
        
        • <databaseName>:要启用分片的数据库名称。
  5. 定义分片键
    • 选择分片键
      • 分片键是集合中用于决定文档分布到哪个分片的字段或字段组合。选择合适的分片键非常重要,它应具有良好的分布性,避免数据倾斜。
    • 为集合添加分片键
      • 使用以下命令为已启用分片的数据库中的集合定义分片键:
        sh.shardCollection("<databaseName>.<collectionName>", { "<shardKeyField>": 1 });
        
        • <databaseName>:数据库名称。
        • <collectionName>:集合名称。
        • <shardKeyField>:分片键字段,1表示升序,如果是降序则用-1。例如,如果以user_id字段作为分片键,命令为sh.shardCollection("users_db.users", { "user_id": 1 });