面试题答案
一键面试- 初始化配置服务器
- 创建配置服务器实例:
- 配置服务器用于存储分片群集的元数据。通常建议使用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地址。
- 连接到其中一个配置服务器实例,例如通过
- 创建配置服务器实例:
- 设置分片服务器
- 启动分片服务器实例:
- 每个分片可以是一个单独的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地址。
- 如果是单个实例分片:
- 连接到路由服务器(通常是
- 启动分片服务器实例:
- 配置路由服务器(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
。
- 启动mongos实例:
- 启用数据库分片
- 连接到mongos:通过
mongo --port <mongosPort>
连接到mongos
实例。 - 启用数据库分片:
- 使用以下命令启用特定数据库的分片:
sh.enableSharding("<databaseName>");
<databaseName>
:要启用分片的数据库名称。
- 使用以下命令启用特定数据库的分片:
- 连接到mongos:通过
- 定义分片键
- 选择分片键:
- 分片键是集合中用于决定文档分布到哪个分片的字段或字段组合。选择合适的分片键非常重要,它应具有良好的分布性,避免数据倾斜。
- 为集合添加分片键:
- 使用以下命令为已启用分片的数据库中的集合定义分片键:
sh.shardCollection("<databaseName>.<collectionName>", { "<shardKeyField>": 1 });
<databaseName>
:数据库名称。<collectionName>
:集合名称。<shardKeyField>
:分片键字段,1
表示升序,如果是降序则用-1
。例如,如果以user_id
字段作为分片键,命令为sh.shardCollection("users_db.users", { "user_id": 1 });
- 使用以下命令为已启用分片的数据库中的集合定义分片键:
- 选择分片键: