runCommandOnShard命令允许用户通过mongos,在某一个指定的shard执行指定的命令。格式如下:
{runCommandOnShard: <shardId>, command: [running comamnd]}
字段 | 类型 | 含义 |
---|---|---|
runCommandOnShard | string | 期望执行命令的shard的shardId,对于mongo sharding就是db节点的实例名称 |
command | json | 实际期望执行的命令 |
执行runCommandOnShard命令用db.runCommand( { <command> } )
的方式。
指定shard的具体节点
云mongo sharding模式下一个shard也是三副本。默认情况下,runCommandOnShard指定的命令是在shard的primary节点上执行。如果用户想在secondary节点上执行,可以利用mongodb官方的ReadPreference机制,通过如下的方式来实现这个目的:
{runCommandOnShard: "dds-xxx", "command": {profile:2}, $queryOptions: {$readPreference: {mode: 'secondary'}}}
关于ReadPreference的介绍可以参考官方的文档,mongodb支持多种形式的ReadPreference,但是在runCommandSharding这个命令中,只建议采用如上secondary的形式,其它形式一律不建议。
授权的命令列表
出于安全,runCommandOnShard只支持部分命令,用户可以通过如下方式查看支持的命令列表:
{runCommandOnShard: "", help: true}
将会返回如下结果:
{
"help" : "help for: runCommandOnShard specify a shard then execute the command on the shard
usage: {runCommandOnShard : <shardId>, command : [running command]}
authorized commands :'profile'
'compact'
'find
'aggregate'
'count'
'currentOp'
'killOp'
'serverStatus'
'distinct'
'group'
'mapReduce'
",
"lockType" : 0,
"ok" : 1
}
例子
针对用户需求比较集中的profile命令和compact命令,分别举例说明如何通过runCommandOnShard执行这两个命令。
比如用户想在shardId为dds-xx1的shard上开启对慢查询的profile,只需要执行如下命令:
{runCommandOnShard: "dds-xx1", "command": {profile:1, slowms: 200}}
执行这样完这样的命令后,profile只会在dds-xx1的primary节点上开启,如果用户的读请求也可能访问secondary节点,希望在secondary上也设置想要的profile级别,那么需要如上面所言设置ReadPeference,使用如下命令:
{runCommandOnShard: "dds-xx1", "command": {profile:1, slowms: 200}, $queryOptions: {$readPreference: {mode: 'secondary'}}}
如果用户想通过compact命令来释放dds-xx1 db节点的磁盘空间,和上面的profile命令类似,在primary节点执行compact可以通过以下命令:
{runCommandOnShard: "dds-xx1", "command": {compact: user_collection}}
compact命令和profile一样不会扩散到备节点,如果想通过compact命令释放secondary节点的空间,也需要指定ReadPeference在secondary节点上再执行一次:
{runCommandOnShard: "dds-xx1", "command": {compact: user_collection}, $queryOptions: {$readPreference: {mode: 'secondary'}}}