外观
MongoDB 分片集群管理命令
集群状态查看命令
查看集群状态
sh.status():
- 显示分片集群的详细状态
- 包含分片列表、数据库分布、集合分布等信息
- 支持可选参数
verbose查看更详细信息 - 示例:javascript
// 查看基本集群状态 sh.status() // 查看详细集群状态 sh.status({ verbose: true })
db.adminCommand({ shardStatus: 1 }):
- 显示更详细的分片状态信息
- 包含分片连接、复制状态、数据分布等
- 支持
verbose参数查看更详细信息 - 示例:javascript
db.adminCommand({ shardStatus: 1 }) db.adminCommand({ shardStatus: 1, verbose: 1 })
查看分片信息
sh.getShards():
- 返回所有分片的列表
- 包含分片名称、连接字符串等信息
- 示例:javascript
sh.getShards()
db.adminCommand({ listShards: 1 }):
- 显示所有分片的详细信息
- 包含分片 ID、主机信息、状态等
- 示例:javascript
db.adminCommand({ listShards: 1 })
分片管理命令
添加分片
sh.addShard():
- 将新分片添加到集群
- 支持添加单个节点或副本集
- 需要指定分片的连接字符串
- 示例:javascript
// 添加副本集分片 sh.addShard("shard1ReplSet/shard1a:27018,shard1b:27018,shard1c:27018") // 添加单节点分片(不推荐用于生产) sh.addShard("shard2:27018")
db.adminCommand({ addShard: 1, shard: "shardName" }):
- 另一种添加分片的方式
- 支持更多高级选项
- 示例:javascript
db.adminCommand({ addShard: "shard3ReplSet/shard3a:27018,shard3b:27018,shard3c:27018", name: "shard3", maxSize: 1024 // 最大存储容量(MB) })
移除分片
sh.removeShard():
- 从集群中移除分片
- 触发数据迁移,将分片上的数据迁移到其他分片
- 显示迁移进度
- 示例:javascript
sh.removeShard("shard2")
db.adminCommand({ removeShard: "shardName" }):
- 另一种移除分片的方式
- 支持查看迁移进度
- 示例:javascript
// 开始移除分片 db.adminCommand({ removeShard: "shard2" }) // 查看移除进度 db.adminCommand({ removeShard: "shard2" })
启用分片
sh.enableSharding():
- 为数据库启用分片
- 必须先启用数据库分片,才能为集合启用分片
- 示例:javascript
sh.enableSharding("testDB")
db.adminCommand({ enableSharding: "dbName" }):
- 另一种启用数据库分片的方式
- 示例:javascript
db.adminCommand({ enableSharding: "testDB" })
集合分片命令
为集合启用分片
sh.shardCollection():
- 为集合启用分片
- 需要指定数据库、集合和分片键
- 支持哈希分片和范围分片
- 示例:javascript
// 范围分片 sh.shardCollection("testDB.users", { "username": 1 }) // 哈希分片 sh.shardCollection("testDB.orders", { "orderId": "hashed" }) // 复合分片键 sh.shardCollection("testDB.transactions", { "userId": 1, "transactionDate": 1 })
db.adminCommand({ shardCollection: "db.collection", key: { shardKey: 1 } }):
- 另一种为集合启用分片的方式
- 支持更多高级选项
- 示例:javascript
db.adminCommand({ shardCollection: "testDB.users", key: { "username": 1 }, unique: false, // 是否为唯一索引 numInitialChunks: 10 // 初始块数量 })
修改分片键
sh.updateZoneKeyRange():
- 更新分片键范围与区域的映射
- 用于基于位置的数据分布
- 示例:javascript
sh.updateZoneKeyRange( "testDB.users", { "username": "a" }, { "username": "m" }, "zoneA" )
sh.addShardTag():
- 为分片添加标签
- 用于基于标签的数据分布
- 示例:javascript
sh.addShardTag("shard1", "zoneA")
数据分布命令
查看集合分布
sh.getCollectionSplitVector():
- 计算集合的分片向量
- 用于确定分片策略
- 示例:javascript
sh.getCollectionSplitVector("testDB.users", { "username": 1 }, 1000000, 10)
db.adminCommand({ getShardDistribution: 1, ns: "db.collection" }):
- 查看集合的数据分布情况
- 显示每个分片上的数据大小和文档数量
- 示例:javascript
db.adminCommand({ getShardDistribution: 1, ns: "testDB.users" })
迁移数据
sh.moveChunk():
- 手动迁移数据块
- 将数据块从一个分片迁移到另一个分片
- 示例:javascript
sh.moveChunk( "testDB.users", { "username": "test" }, "shard2" )
db.adminCommand({ moveChunk: "db.collection", find: { shardKey: value }, to: "shardName" }):
- 另一种手动迁移数据块的方式
- 示例:javascript
db.adminCommand({ moveChunk: "testDB.users", find: { "username": "test" }, to: "shard2" })
配置管理命令
查看配置
sh.getBalancerState():
- 查看均衡器状态
- 返回布尔值,表示均衡器是否启用
- 示例:javascript
sh.getBalancerState()
sh.getBalancerHost():
- 查看当前均衡器主机
- 示例:javascript
sh.getBalancerHost()
控制均衡器
sh.startBalancer():
- 启动均衡器
- 开始自动数据迁移,平衡分片数据分布
- 示例:javascript
sh.startBalancer()
sh.stopBalancer():
- 停止均衡器
- 停止自动数据迁移
- 示例:javascript
sh.stopBalancer() // 等待均衡器停止 sh.stopBalancer(true)
db.adminCommand({ balancerStart: 1 }):
- 另一种启动均衡器的方式
- 示例:javascript
db.adminCommand({ balancerStart: 1 })
db.adminCommand({ balancerStop: 1 }):
- 另一种停止均衡器的方式
- 示例:javascript
db.adminCommand({ balancerStop: 1 })
数据库和集合命令
查看数据库分布
db.adminCommand({ listDatabases: 1 }):
- 查看所有数据库
- 包含数据库大小、分片状态等信息
- 示例:javascript
db.adminCommand({ listDatabases: 1 })
sh.getDatabaseShardAssignment():
- 查看数据库的分片分配情况
- 示例:javascript
sh.getDatabaseShardAssignment("testDB")
迁移数据库主分片
sh.movePrimary():
- 迁移数据库的主分片
- 将数据库的主分片从一个分片迁移到另一个分片
- 示例:javascript
sh.movePrimary("testDB", "shard3")
db.adminCommand({ movePrimary: "dbName", to: "shardName" }):
- 另一种迁移主分片的方式
- 示例:javascript
db.adminCommand({ movePrimary: "testDB", to: "shard3" })
监控和维护命令
查看均衡器日志
db.adminCommand({ currentOp: 1, $all: true, balancer: true }):
- 查看当前均衡器操作
- 显示正在进行的数据迁移
- 示例:javascript
db.adminCommand({ currentOp: 1, $all: true, balancer: true })
db.adminCommand({ logs: 1, log: "sharding" }):
- 查看分片相关日志
- 示例:javascript
db.adminCommand({ logs: 1, log: "sharding" })
清理分片
db.adminCommand({ cleanupOrphaned: "db.collection" }):
- 清理集合中的孤儿文档
- 孤儿文档是指存在于分片上但不在分片元数据中的文档
- 示例:javascript
db.adminCommand({ cleanupOrphaned: "testDB.users" })
db.adminCommand({ cleanupOrphaned: "db.collection", startingFromKey: { shardKey: value } }):
- 清理指定范围内的孤儿文档
- 示例:javascript
db.adminCommand({ cleanupOrphaned: "testDB.users", startingFromKey: { "username": "a" } })
高级管理命令
配置分片集群
db.adminCommand({ setShardVersion: "shardName", version: versionNumber }):
- 设置分片版本
- 用于分片集群升级
- 示例:javascript
db.adminCommand({ setShardVersion: "shard1", version: 5 })
db.adminCommand({ shardCollection: "db.collection", key: { shardKey: 1 }, numInitialChunks: num }):
- 为集合启用分片并指定初始块数量
- 优化初始数据分布
- 示例:javascript
db.adminCommand({ shardCollection: "testDB.users", key: { "username": 1 }, numInitialChunks: 20 })
管理分片键
db.adminCommand({ collMod: "collection", usePowerOf2Sizes: true }):
- 修改集合的分片策略
- 启用或禁用 2 的幂次方大小的块
- 示例:javascript
db.adminCommand({ collMod: "testDB.users", usePowerOf2Sizes: true })
db.adminCommand({ collMod: "collection", chunkSize: sizeInMB }):
- 修改集合的块大小
- 影响数据迁移和分片效率
- 示例:javascript
db.adminCommand({ collMod: "testDB.users", chunkSize: 128 })
命令使用最佳实践
生产环境注意事项
谨慎使用的命令:
sh.removeShard():会触发大量数据迁移,影响性能sh.moveChunk():手动迁移数据块,可能导致数据分布不均sh.stopBalancer():停止均衡器可能导致数据分布不均db.adminCommand({ cleanupOrphaned: "db.collection" }):可能影响性能
建议的使用方式:
- 在业务低峰期执行数据迁移操作
- 监控数据迁移进度,避免影响生产业务
- 定期检查分片集群状态,确保数据分布均衡
- 避免频繁调整分片配置
监控和维护
定期执行的命令:
sh.status():定期查看集群状态db.adminCommand({ getShardDistribution: 1, ns: "db.collection" }):检查数据分布db.adminCommand({ currentOp: 1, $all: true, balancer: true }):监控均衡器状态db.adminCommand({ cleanupOrphaned: "db.collection" }):定期清理孤儿文档
监控指标:
- 数据分布均衡度
- 均衡器运行状态
- 数据迁移进度
- 分片键分布
常见问题(FAQ)
Q1: 如何查看分片集群的状态?
A1: 可以使用 sh.status() 命令查看分片集群的详细状态,包括分片列表、数据库分布、集合分布等信息。
Q2: 如何添加新分片到集群?
A2: 可以使用 sh.addShard() 命令添加新分片,例如:sh.addShard("shard1ReplSet/shard1a:27018,shard1b:27018,shard1c:27018")。
Q3: 如何为集合启用分片?
A3: 需要先为数据库启用分片,然后为集合启用分片。例如:
javascript
sh.enableSharding("testDB")
sh.shardCollection("testDB.users", { "username": 1 })Q4: 如何查看集合的数据分布情况?
A4: 可以使用 db.adminCommand({ getShardDistribution: 1, ns: "db.collection" }) 命令查看集合的数据分布情况。
Q5: 如何手动迁移数据块?
A5: 可以使用 sh.moveChunk() 命令手动迁移数据块,例如:sh.moveChunk("testDB.users", { "username": "test" }, "shard2")。
Q6: 如何启用和禁用均衡器?
A6: 可以使用 sh.startBalancer() 启用均衡器,使用 sh.stopBalancer() 禁用均衡器。
Q7: 如何迁移数据库的主分片?
A7: 可以使用 sh.movePrimary() 命令迁移数据库的主分片,例如:sh.movePrimary("testDB", "shard3")。
Q8: 如何清理孤儿文档?
A8: 可以使用 db.adminCommand({ cleanupOrphaned: "db.collection" }) 命令清理集合中的孤儿文档。
