Skip to content

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" }) 命令清理集合中的孤儿文档。