远程命令

功能目标

Pegasus基于rDSN框架构建,可以利用到rDSN框架的很多有用的功能,远程命令就是其中一个。

rDSN框架通过RPC对外提供服务,除了开发者注册的用于业务逻辑的RPC服务,还提供了内建的RPC服务RPC_CLI_CLI_CALL,接口定义如下:

struct command
{
    1:string       cmd;
    2:list<string> arguments;
}

service cli
{
    string call(1:command c);
}

RPC的请求参数为command结构体,指定远程命令的cmdarguments;RPC的返回结果是string

开发者可以注册各种远程命令,对远程命令处理并返回结果。你可以通过shell的remote_command接口向Pegasus的进程发送远程命令,以执行某些操作。

通过远程命令执行操作有这些好处:

  • 直接。命令直接发给目标进程。
  • 快速生效。命令一般都是立即执行。
  • 开发简单。注册和开发过程都很容易。

支持命令

Pegasus不同角色的进程支持不同的远程命令。但是collector没有监听端口,所以不支持远程命令。

rdsn内建命令

命令 功能
engine 获取rdsn框架引擎的信息,主要是包含哪些线程池、每个线程池有多少个线程
system.queue 获取各线程池执行队列的排队长度
server-info 获取进程的基本信息,包括版本号、启动时间,对应shell的server_info子命令
server-stat 获取进程的简要统计信息,包括get/put等操作的QPS和延迟、机器的内存和存储使用情况,对应shell的server_stat子命令
task-code 获取该进程注册的task code列表
flush_log 将最近缓冲区中的日志数据刷出到日志文件中,对应shell的flush_log子命令
reset-log-start-level 动态修改日志的级别
perf-counters 获取最近一个统计周期内的perf counter数据
config-dump 获取该进程启动时的配置文件的信息

meta-server

命令 功能
meta.lb.assign_delay_ms 动态修改配置replica_assign_delay_ms_for_dropouts
meta.lb.assign_secondary_black_list 动态修改add_secondary操作的黑名单,名单中的节点在负载均衡中不再分派replica
meta.lb.balancer_in_turn 动态修改配置balancer_in_turn,控制负载均衡app时是one-by-one执行还是并行执行
meta.lb.only_primary_balancer 动态修改配置only_primary_balancer,控制负载均衡时是否只要求各机器的primary replica个数达到平衡
meta.lb.only_move_primary 动态修改配置only_move_primary,控制负载均衡时是否只做primary replica迁移,不做replica数据拷贝
meta.lb.add_secondary_enable_flow_control 动态修改配置add_secondary_enable_flow_control,控制负载均衡时是否对add_secondary操作进行流控
meta.lb.add_secondary_max_count_for_one_node 动态修改配置add_secondary_max_count_for_one_node,控制负载均衡时如果进行流控,单个机器最多并发执行add_secondary操作的个数

replica-server

命令 功能
replica.kill_partition 将指定的replica关闭,停止提供服务
replica.deny-client 动态修改配置deny_client_on_start,控制是否拒绝客户端的读写请求
replica.verbose-client-log 动态修改配置verbose_client_log_on_start,控制回复客户端的请求时是否打印ERROR日志
replica.verbose-commit-log 动态修改配置verbose_commit_log_on_start,控制在提交写请求时是否打印DEBUG日志
replica.trigger-checkpoint 对指定的replica手动触发async_checkpoint操作
replica.query-compact 对指定的replica查询其执行Manual-Compact操作的状态
replica.query-app-envs 对指定的replica查询其当前的Table环境变量
useless-dir-reserve-seconds 动态修改无用文件夹的保留时间,方便快速释放存储空间,从1.11.3版本开始支持,参见垃圾文件夹管理

如何使用

通过shell的remote_command子命令,可以向指定的一个或者多个进程发送远程命令。用法:

USAGE:  remote_command         [-t all|meta-server|replica-server] [-l ip:port,ip:port...] <command>
                               [arguments...]

其中需要通过-t或者-l来指定目标进程:

  • -t:只向指定角色的所有进程发送。
  • -l:只向指定的地址发送,可以通过列表指定多个地址。

如果你不知道目标进程支持哪些远程命令,可以发送help命令查看,譬如:

>>> remote_command -l 127.0.0.1:34801 help
COMMAND: help

CALL [user-specified] [127.0.0.1:34801] succeed: help|Help|h|H [command] - display help information
repeat|Repeat|r|R interval_seconds max_count command - execute command periodically
engine - get engine internal information
system.queue - get queue internal information
server-info - query server information
server-stat - query selected perf counters
task-code - query task code containing any given keywords
flush-log - flush log to stderr or log file
reset-log-start-level - reset the log start level
perf-counters - query perf counters, supporting filter by POSIX basic regular expressions
profile|Profile|p|P - performance profiling
profiler data - get appointed data, using by pjs
profiler.query|pq - query profiling data, output in json format
config-dump - dump configuration
replica.kill_partition [app_id [partition_index]]
replica.deny-client <true|false>
replica.verbose-client-log <true|false>
replica.verbose-commit-log <true|false>
replica.trigger-checkpoint [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')
replica.query-compact [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')
replica.query-app-envs [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')


Succeed count: 1
Failed count: 0

如果指定多个进程,就会并发地向所有进程发送命令,等待命令的返回结果,然后打印出来。