介绍:
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差(+++里面的说明+++),查询则尽量避免跨分片查询。使用分片的时机:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障;
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用
主机规划:
IP地址 | 实例(端口) | 实例(端口) | 实例(端口) | 实例(端口) | 实例(端口) |
192.168.2.3 | mongos(27107) | configsvr(20000) | shard1(27018) | shard2(27019) | shard3(27020) |
192.168.2.4 | mongos(27107) | configsvr(20000) | shard1(27018) | shard2(27019) | shard3(27020) |
192.168.2.5 | mongos(27107) | configsvr(20000) | shard1(27018) | shard2(27019) | shard3(27020) |
目录创建:
在每台服务器创建对应的目录
mkdir -p /data/mongodb/{share1,share2,share3}/db
mkdir -p /data/mongodb/mongos/db
mkdir -p /data/mongodb/configsvr/db
mkdir -p /data/mongodb/{conf,logs}
创建配置文件:
touch /data/mongodb/conf/configsvr.conf
touch /data/mongodb/conf/mongos.conf
touch /data/mongodb/conf/shard1.conf
touch /data/mongodb/conf/shard2.conf
touch /data/mongodb/conf/shard3.conf
配置文件详情:
官网连接 :https://docs.mongodb.com/manual/reference/configuration-options/configsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/configsvr.log
storage:
dbPath: /data/mongodb/configsvr/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/configsvr/configsvr.pid
net:
port: 20000
bindIp: 0.0.0.0
replication:
replSetName: config
sharding:
clusterRole: configsvr
shard1.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard1.log
storage:
dbPath: /data/mongodb/shard1/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/shard1/shard1.pid
net:
port: 27018
bindIp: 0.0.0.0
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
shard2.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard2.log
storage:
dbPath: /data/mongodb/shard2/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/shard2/shard2.pid
net:
port: 27019
bindIp: 0.0.0.0
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
shard3.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard3.log
storage:
dbPath: /data/mongodb/shard3/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/shard3/shard3.pid
net:
port: 27020
bindIp: 0.0.0.0
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
mongos.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongos.log
processManagement:
fork: true
pidFilePath: /data/mongodb/mongos/mongos.pid
net:
port: 27017
bindIp: 0.0.0.0
sharding:
configDB: config/192.168.2.3:20000,192.168.2.4:20000,192.168.2.5:20000
启动命令:
/data/mongodb/bin/mongod -f /data/mongodb/config/configser.conf #
/data/mongodb/bin/mongod -f /data/mongodb/config/shard1.conf #启动分片1
/data/mongodb/bin/mongod -f /data/mongodb/config/shard2.conf #启动分片2
/data/mongodb/bin/mongod -f /data/mongodb/config/shard3.conf #启动分片3
/data/mongodb/bin/mongos -f /data/mongodb/config/mongos.conf #
停止命令:
killall mongod #停止config 和shard
killall mongos #停止 mongos
连接 shard1
/data/mongodb/bin/mongo 192.168.2.3:27018
执行
rs.initiate({
"_id":"shard1",
"members":[
{
"_id":0,
"host":"192.168.2.3:27018"
},
{
"_id":1,
"host":"192.168.2.4:27018"
},
{
"_id":2,
"host":"192.168.2.5:27018"
}
]
})
连接 shard2
/data/mongodb/bin/mongo 192.168.2.3:27019
执行
rs.initiate({
"_id":"shard2",
"members":[
{
"_id":0,
"host":"192.168.2.3:27019"
},
{
"_id":1,
"host":"192.168.2.4:27019"
},
{
"_id":2,
"host":"192.168.2.5:27019"
}
]
})
连接 shard3
/data/mongodb/bin/mongo 192.168.2.3:27020
执行
rs.initiate({
"_id":"shard3",
"members":[
{
"_id":0,
"host":"192.168.2.3:27020"
},
{
"_id":1,
"host":"192.168.2.4:27020"
},
{
"_id":2,
"host":"192.168.2.5:27020"
}
]
})
连接 config
/data/mongodb/bin/mongo 192.168.2.3:20000
rs.initiate({
"_id":"config",
"members":[
{
"_id":0,
"host":"192.168.2.3:20000"
},
{
"_id":1,
"host":"192.168.2.4:20000"
},
{
"_id":2,
"host":"192.168.2.5:20000"
}
]
})
连接 mongos 添加路由
/data/mongodb/bin/mongo 192.168.2.3:27017
sh.addShard("shard1/192.168.2.3:27018,192.168.2.4:27018,192.168.2.5:27018")
sh.addShard("shard2/192.168.2.3:27019,192.168.2.4:27019,192.168.2.5:27019")
sh.addShard("shard3/192.168.2.3:27020,192.168.2.4:27020,192.168.2.5:27020")
查看状态
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5e0995613452582938deff4f")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.2.3:27018,192.168.2.4:27018,192.168.2.5:27018", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.2.3:27019,192.168.2.4:27019,192.168.2.5:27019", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.2.3:27020,192.168.2.4:27020,192.168.2.5:27020", "state" : 1 }
active mongoses:
"3.6.3" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 5
Last reported error: Could not find host matching read preference { mode: "primary" } for set shard1
Time of Reported error: Mon Dec 30 2019 14:30:41 GMT+0800 (CST)
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)
{ "_id" : "dfcx_test", "primary" : "shard2", "partitioned" : false }
{ "_id" : "test", "primary" : "shard1", "partitioned" : false }
mongodb 6.0 以后的版本连接客户端mongosh需要单独下载使用
初始化用户
接入其中一个mongos实例,添加管理员用户
use admin
db.createUser({user:'admin',pwd:'admin',roles:['clusterAdmin','dbAdminAnyDatabase','userAdminAnyDatabase','readWriteAnyDatabase']})
# 查看用户 在 admin库
db.system.users.find().pretty()
#授权库账号
use df_test
db.createUser({user:'df_test',pwd:'admin',roles:['readWrite']})
#修改权限
db.updateUser("usertest",{roles:[ {role:"read",db:"testDB"} ]})
注:updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它
#修改密码
db.updateUser("usertest",{pwd:"changepass1"});
role角色:
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root
内部角色:__system
角色说明:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
dbOwner: readWrite + dbAdmin + dbAdmin
MongoDB管理用户的认证机制拓展内容
数据操作
在案例中,创建appuser用户、为数据库实例df_test启动分片。
use df_test
db.createUser({user:'appuser',pwd:'AppUser@01',roles:[{role:'dbOwner',db:'df_test'}]})
sh.enableSharding("df_test") #开启分片
创建集合userid,为其执行分片初始化。
use df_test
db.createCollection("users")
db.users.ensureIndex({userid:1}) 创建索引,
sh.shardCollection("dfcx_test.users",{userid:1}) 同时为集合指定片键
sh.shardCollection("dfcx_test.users.users", {users:"hashed"}, false, { numInitialChunks: 4} ) (添加参数,可以执行4 和5任意一个)
插入测试数据
mongos> for(var i=1;i<1000000;i++) db.users.insert({userid:i,username:"HSJ"+i,city:"beijing"})
mongos> for(var i=1;i<1000000;i++) db.users.insert({userid:i,username:"HSJ"+i,city:"tianjing"})
查看状态
sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5e0995613452582938deff4f")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.2.3:27018,192.168.2.4:27018,192.168.2.5:27018", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.2.3:27019,192.168.2.4:27019,192.168.2.5:27019", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.2.3:27020,192.168.2.4:27020,192.168.2.5:27020", "state" : 1 }
active mongoses:
"3.6.3" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: yes
Collections with active migrations:
dfcx_test.users started at Thu Jan 02 2020 14:35:34 GMT+0800 (CST)
Failed balancer rounds in last 5 attempts: 4
Last reported error: Could not find host matching read preference { mode: "primary" } for set shard1
Time of Reported error: Mon Dec 30 2019 14:32:41 GMT+0800 (CST)
Migration Results for the last 24 hours:
1 : Success
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)
{ "_id" : "dfcx_test", "primary" : "shard2", "partitioned" : true }
dfcx_test.users
shard key: { "userid" : 1 }
unique: false
balancing: true
chunks:
shard1 1
shard2 3
{ "userid" : { "$minKey" : 1 } } -->> { "userid" : 2 } on : shard1 Timestamp(2, 0)
{ "userid" : 2 } -->> { "userid" : 500002 } on : shard2 Timestamp(2, 1)
{ "userid" : 500002 } -->> { "userid" : 750003 } on : shard2 Timestamp(1, 3)
{ "userid" : 750003 } -->> { "userid" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 4)
{ "_id" : "test", "primary" : "shard1", "partitioned" : false }
mongodb 生产开启 keyfile安全认证以及用户权限
keyfile是mongodb副本集的实例之间的权限认证,如果keyfile文件内容不同,那么该实例添加到副本集的时候,会出现不可达的状态
创建副本集认证key文件
1、创建key文件: 注意,三个节点必须要用同一份keyfile,在一台机器生成,拷贝到另外两台,并且修改成 600 的文件属性
openssl rand -base64 90 -out ./keyfile
cp keyfile /data/mongodb/conf
chmod 600 /data/mongodb/keyfile
2.在每个配置文件里添加配置
config 和shard 添加:
security:
keyFile: /data/mongodb/conf/keyfile
authorization: enabled
mongos 添加
security:
keyFile: /data/mongodb/conf/keyfile
3.重启集群
3.重启集群
查看文档:
生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)配置文件(拓展内容)
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
# #The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/single/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
##The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "/mongodb/single/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
net:
#服务实例绑定的IP,默认是localhost
bindIp: localhost,192.168.0.2
#bindIp
#绑定的端口,默认是27017
port: 27017
MongoDB配置文件详解
#Mongod config file # Mongod配置文件
#MongoDB configuration files use the YAML format. # MongoDB配置文件使用YAML格式
#The following example configuration file contains several mongod settings. # 下面的示例配置文件包含几个mongod设置
#
########Example Start(示例开始)########
#systemLog: # 系统日志配置
# destination: file # 日志输出的目的地,file | syslog,如果指定file,必须指定systemlog.path
# path: "/var/log/mongodb/mongodb.log" # 日志路径
# logAppend: true # 写日志的模式,ture:追加 | false:覆盖(默认)。ture:实例重启时,在老的日志文件末尾继续添加
#storage:
# journal:
# enabled: true # 是否开启journal日志持久存储,journal日志用来数据恢复,通常用于故障恢复。64位默认true,32位默认false,建议开启,仅对mongod进程有效。
#processManagement:
# fork: true # 是否守护进程在后台运行
#net:
# bindIp: 127.0.0.1 # 绑定Ip
# port: 27017 # 监听端口号
#setParameter:
# enableLocalhostAuthBypass: false # 本地主机绕过身份验证,0或false:禁止,1或true:启动(默认)
#
########Example End(示例结束)########
#
########Core Options
systemLog: # 日志相关参数
# verbosity: 0 # 日志级别 默认值0,包含"info"信息,大于0的值,会包含debug信息
# quiet: <boolean> # 是否减少日志的输出量,不建议在生成环境下开启,跟踪错误比较困难
# traceAllException: <boolean> # 打印调试详细信息,用于支持相关的故障排除的附加日志
# syslogFacility: user # 用于登录时信息到syslog Facility水平,指定的值必须由你的操作系统实现支持syslog。要使用此选项,您必须启用–syslog
path: "/data/mongodb/data/conf/mongodb.log" # 日志路径
logAppend: true # 写日志的模式
# logRotate: <string> # 日志回转,防止一个日志文件特别大 rename: 重命名日志文件 | reopen:使用Linux日志rotate特性,关闭并重新打开此日志文件,可以避免日志丢失,但是logAppend必须为true
destination: file # 日志输出的目的地
# timeStampFormat: iso8601-local # 指定日志格式的时间戳格式
# component: # 为不同的组件指定各自的日志信息级别
# accessControl:
# verbosity: 0
# command:
# verbosity: 0
# # COMMENT additional component verbosity settings omitted for brevity
# storage:
# verbosity: 0
# journal:
# verbosity: <int>
# write:
# verbosity: 0
#
#
########ProcessManagement Options
processManagement: # 进程相关参数
fork: true # 是否守护进程在后台运行
pidFilePath: "/data/mongodb/data/conf/mongod.pid" # fork为true时,将mongod/mongos进程ID写入指定的文件,如果不指定,将不会创建PID文件
#
#
#########Net Options
net: # 网络相关参数
port: 27020 # 监听端口号
bindIp: 0.0.0.0 # mongod/monogs进程绑定的IP
# maxIncomingConnections: 65536 # mongod/mongos进程允许的最大连接数
# wireObjectCheck: true # 客户端写入数据时,mongos/mongod检测数据的有效性(BSON),如果数据格式不良,此insert、update操作将会被拒绝;默认值为true。
# ipv6: false # 是否支持ipv6
# unixDomainSocket: # 适用于Unix系统,启用或禁用监听Unix域的套接字
# enabled: true
# pathPrefix: "/tmp"
# filePermissions: 0700
# http: # http相关
# enabled: false
# JSONPEnabled: false
# RESTInterfaceEnabled: false
# ssl: # ssl相关
# sslOnNormalPorts: <boolean> # deprecated since 2.6
# mode: <string>
# PEMKeyFile: <string>
# PEMKeyPassword: <string>
# clusterFile: <string>
# clusterPassword: <string>
# CAFile: <string>
# CRLFile: <string>
# allowConnectionsWithoutCertificates: <boolean>
# allowInvalidCertificates: <boolean>
# allowInvalidHostnames: false
# FIPSMode: <boolean>
#
#
########security Options
security: # 安全相关参数
keyFile: /data/mongodb/data/keyfile/security # 对于副本集模式,指定副本集节点间身份验证密钥文件的路径,注意这个只是副本集节点间的认证,跟Mongodb认证和授权不是一回事
clusterAuthMode: keyFile
authorization: enabled # 开启或关闭副本集模式下的MongoDB认证功能
#javascriptEnabled: true
########security.sasl Options
# sasl:
# hostName: <string>
# serviceName: <string>
# saslauthdSocketPath: <string>
#
#
#########setParameter Option
setParameter: # 自定义变量
enableLocalhostAuthBypass: false # 本地主机绕过身份验证
# <parameter1>: <value1>
# <parameter2>: <value2>
#
#
#########storage Options
storage: # 存储引擎相关参数
dbPath: "/data/mongodb/data/conf" # mongod进程存储数据目录,此配置仅对mongod进程有效
# indexBuildRetry: true # 当构建索引时mongod意外关闭,再次启动是否重新构建索引,默认值为true
# repairPath: "/data/db/_tmp" # 配合–repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效(不建议在配置文件中配置,而是使用mongod启动命令指定)
# journal:
# enabled: true # 是否开启journal日志持久存储,journal日志用来数据恢复,通常用于故障恢复。64位默认true,32位默认false,建议开启,仅对mongod进程有效。
# directoryPerDB: false # 是否将不同DB的数据存储在不同的目录中,dbPath的子目录,目录名为db的名称
# syncPeriodSecs: 60 # mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60s,强烈建议不要修改此值
engine: "wiredTiger" # mongodb数据库的存储引擎,wiredTiger存储引擎(3.2开始默认使用)
#########storage.mmapv1 Options
# mmapv1: # mmapv1存储引擎相关参数
# preallocDataFiles: true
# nsSize: 16
# quota:
# enforced: false
# maxFilesPerDB: 8
# smallFiles: false
# journal:
# debugFlags: <int>
# commitIntervalMs: 100 # 100 or 30
#########storage.wiredTiger Options
# wiredTiger: # wiredTiger存储引擎相关参数
# engineConfig:
# cacheSizeGB: <number> # 使用所有数据的最大缓存大小,wiredTiger缓存工作集数据的内存大小,单位:GB
# statisticsLogDelaySecs: 0 # 默认值设置为0,wiredtiger不做日志统计
# journalCompressor: "snappy" # journal日志的压缩算法,可选值为"none"、"snappy"(默认)、"zlib"。
# directoryForIndexes: false # 是否将索引和collections数据分别存储在dbPath单独的目录中。即index数据保存"index"子目录,collections数据保存在"collection"子目录。默认值为false,仅对mongod有效。
# collectionConfig:
# blockCompressor: "snappy" # collection数据压缩算法,可选值"none"、"snappy"、"zlib"。
# indexConfig:
# prefixCompression: true # 是否对索引数据使用"前缀压缩"(prefix compression,一种算法)。
#
#
##########operationProfiling Options
#operationProfiling: # 慢查询相关参数
# slowOpThresholdMs: 100 # 判定一个操作是“慢查询”的时间阀值,单位毫秒
# mode # 操作的性能信息将会被写入日志文件中,off:关闭、slowOp:on,只包含慢操作日志、all:on,记录所有操作。
数据库profiling会影响性能,建议只在性能调试阶段开启。此参数仅对mongod有效。
#########replication Options
replication: # 复制集相关参数
# oplogSizeMB: <int> # replication操作日志的最大尺寸,单位:MB
replSetName: cfgsvr # "复制集"的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName。仅对mongod有效。
# secondaryIndexPrefetch: all # 默认值all,复制集中的secondary
#
#
##########sharding Options
sharding: # 分片相关参数
clusterRole: configsvr # 在sharding集群中,此mongod实例的角色,可选值:configsvr-->config server,默认侦听27019端口;shardsvr-->sharding(分片),默认侦听27018端口
# --此配置仅对mongod有效。通常config server和sharding server需要使用各自的配置文件。
# archiveMovedChunks: True # 当chunks因为"负载平衡"而迁移到其他节点时,mongod是否将这些chunks归档,并保存在dbPath下"moveChunk"目录下,mongod不会删除moveChunk下的文件。默认为true。
#
#
#########auditLog Options
#auditLog: # 审计相关参数
# destination: <string> # 开启审计,需指定审计记录的输出方式 syslog | console | file
# format: <string> # 目标文件的输出文件格式 JSON | BSON
# path: <string> # 如果审计时间输入为文件,那么这里就需要指定文件的完整路径及文件名
# filter: <string> # 过滤器,可以限制审计系统记录的操作类型
#
#
#########snmp Options
#snmp: # SNMP监控相关参数
# subagent: <boolean>
# master: <boolean>
#
#
########mongos-only Options
## mongos配置文件的单独设置
#replication:
# localPingThresholdMs: 15
#
#sharding:
# autoSplit: true
# configDB: 10.50.16.34:27017,10.50.16.35:27017,10.50.16.36:27017,10.50.16.18:27017 # 监听的配置服务器,只能有1个或者3个。configs为配置服务器的副本集名字
# chunkSize: 64
#
#
########Windows Service Options
## windows系统设置
#processManagement:
# windowsService:
# serviceName: <string>
# displayName: <string>
# description: <string>
# serviceUser: <string>
# servicePassword: <string>
mongodb常用命令
db.collectionName.getShardDistribution() #可以查看数据分布
db.collectionName.stats().sharded #简单的返回true或者false
sh.status() #查看分片状态