功能目标

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

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

  1. struct command
  2. {
  3. 1:string cmd;
  4. 2:list<string> arguments;
  5. }
  6.  
  7. service cli
  8. {
  9. string call(1:command c);
  10. }

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环境变量

如何使用

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

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

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

  • -t:只向指定角色的所有进程发送。
  • -l:只向指定的地址发送,可以通过列表指定多个地址。 如果你不知道目标进程支持哪些远程命令,可以发送help命令查看,譬如:
  1. >>> remote_command -l 127.0.0.1:34801 help
  2. COMMAND: help
  3. CALL [user-specified] [127.0.0.1:34801] succeed: help|Help|h|H [command] - display help information
  4. repeat|Repeat|r|R interval_seconds max_count command - execute command periodically
  5. engine - get engine internal information
  6. system.queue - get queue internal information
  7. server-info - query server information
  8. server-stat - query selected perf counters
  9. task-code - query task code containing any given keywords
  10. flush-log - flush log to stderr or log file
  11. reset-log-start-level - reset the log start level
  12. perf-counters - query perf counters, supporting filter by POSIX basic regular expressions
  13. profile|Profile|p|P - performance profiling
  14. profiler data - get appointed data, using by pjs
  15. profiler.query|pq - query profiling data, output in json format
  16. config-dump - dump configuration
  17. replica.kill_partition [app_id [partition_index]]
  18. replica.deny-client <true|false>
  19. replica.verbose-client-log <true|false>
  20. replica.verbose-commit-log <true|false>
  21. replica.trigger-checkpoint [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')
  22. replica.query-compact [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')
  23. replica.query-app-envs [id1,id2,...] (where id is 'app_id' or 'app_id.partition_id')
  24. Succeed count: 1
  25. Failed count: 0

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