云Mongodb Sharding如何在指定的Shard上执行Profile等命令

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'}}}
上一篇:MySql——查看数据库性能基本参数


下一篇:[MySQL 5.6] MySQL5.6新参数