Pomelo 监控管理 pomelo-admin 与客户端 pomelo-admin-web、pomelo-cli


pomelo-admin是 Pomelo 的管理控制台库,它提供了一系列实用工具来监控 Pomelo 服务器群集。再配置客户端pomelo-admin-webpomelo-cli,可实现对 Pomelo 服务器集群状态实时查看、服务器管理等。

  1. Pomelo-admin介绍
  2. Pomelo-admin中的组件
  3. Pomelo-admin的使用
  4. pomelo-admin-web
  5. Pomelo-cli

1. Pomelo-admin介绍

1.1 进程角色

pomelo-admin中有mastermonitorclient三种角色:

  • master - 主服务器进程,负责收集、维护所有client和monitor状态,并向导出客户端的集群状态。
  • monitor - 监控代理,存在于每个需要监控的服务器进程中。应在服务器启动时启动,并将其注册到主服务器,其监控的进程状态也应上报给主服务器。
  • client - pomelo-admin客户端进程,其会从主服务器获取状态。如:pomelo-admin-webpomelo-cli


1.2 消息类型

有两种类型的消息用于进程间的通讯。

  • request - 与响应交互的双向消息
  • notify - 单向消息


2. Pomelo-admin中的组件

2.1 ConsoleService

运行于mastermonitor进程中的pomelo-admin主服务。它会维护master代理或monitor代理的进程,加载已注册的模块,并为其他进程的消息提供消息路由服务。


2.2 MasterAgent

为在主进程上运行的pomelo-admin代理提供基本的网络通信和通信协议的编码解码。


2.3 MonitorAgent

为在监控进程上运行的pomelo-admin代理提供基本的网络通信和通信协议的编码解码。


2.4 Module

模块(Module)是实现监控器逻辑的地方,如:进程状态收集。开发者可以在pomelo-admin注册模块,以定制各种系统监控器。

在每个监控模块中,有以下三种回调函数:

  • function masterHandler(agent, msg, cb) - 在主进程中的回调,以处理来自监控进程的消息或主进程中的计时器事件。
  • function monitorHandler(agent, msg, cb) - 在监控进程中的回调以处理来自主进程的消息或监控进程中的计时器事件。
  • function clientHandler(agent, msg, cb) - 在主进程中的回调,以处理来自客户端的消息。

组件间的关系如下:


3. Pomelo-admin的使用

3.1 安装

通过npm安装pomelo-admin模块即可:

npm install pomelo-admin


3.2 简单使用

引入pomelo-admin模块:

const admin = require("pomelo-admin");

在主进程中创建一个consoleService实例:

var masterConsole = admin.createMasterConsole({  
  port: masterPort  
});

注册admin模块:

masterConsole.register(moduleId, module);

启动masterConsole

masterConsole.start(function(err) {  
  // start servers  
});

在监控进程中创建consoleService实例:

var monitorConsole = admin.createMonitorConsole({  
  id: serverId,  
  type: serverType,  
  host: masterInfo.host,  
  port: masterInfo.port,  
  info: serverInfo  
});


3.3 自定义模块

你可以根据需要定制模块,以收集和导出你所需要的一些状态。

简单示例

var Module = function(app, opts) {
  opts = opts || {};
  this.type = opts.type || 'pull';  // pull or push 
  this.interval = opts.interval || 5; // pull or push interval
};

Module.moduleId = 'helloPomelo';

module.exports = Module;

Module.prototype.monitorHandler = function(agent, msg) {
  var word = agent.id + ' hello pomelo';
  // notify admin messages to master
  agent.notify(Module.moduleId, {serverId: agent.id, body: word});
};

Module.prototype.masterHandler = function(agent, msg) {
  // if no message, then notify all monitors to fetch datas
  if(!msg) {
    agent.notifyAll(Module.moduleId);
    return;
  }
  // collect data from monitor
  var data = agent.get(Module.moduleId);
  if(!data) {
    data = {};
    agent.set(Module.moduleId, data);
  }

  data[msg.serverId] = msg;
};

Module.prototype.clientHandler = function(agent, msg, cb) {
  // deal with client request,directly return data cached in master
  cb(null, agent.get(Module.moduleId) || {});
};

注册自定义模块

自定义模块必须在 Pomelo 中注册,以使其正常工作。

模块注册在app.js文件中完成:

app.configure('production|development', function() {
  app.registerAdmin('helloPomelo',new helloPomelo());
});


3.4 用户级别控制

pomelo-admin为管理客户端定义了用户级别,以便在此模式下登录主服务器。

{
  "id": "user-1",
  "username": "admin",
  "password": "admin",
  "level": 1
}

其中,level定义了管理用户的级别,等级1表示用户具有管理权限,该用户可以做任何操作,其它用户仅有一些受限权限。做addstopkill等操作时,就需要1级权限。

默认情况下,需要在config/adminUser.json文件下配置管理用户:

[{
  "id": "user-1",
  "username": "admin",
  "password": "admin",
  "level": 1
}, {
  "id": "user-2",
  "username": "monitor",
  "password": "monitor",
  "level": 2
},{
  "id": "user-3",
  "username": "test",
  "password": "test",
  "level": 2
}]


3.5 自定义认证

pomelo-admin中提供了一个简单的认证功能(pomelo-admin auth),开发者可以在 Pomelo 主服务器实现自定义认证:

app.set('adminAuthUser', function(msg, cb){
  if(auth success) {
    cb(user);
  } else {
    cb(null);
  }
})


3.6 服务器主机认证

服务器连接到主服务器时需要授权,pomelo-admin管理认证中提供了一个简单的认证功能(pomelo-admin auth)。这样,开发者就通过在Pomelo中实现自定义服务器认证。

在主服务器中:

app.set('adminAuthServerMaster', function(msg, cb){
  if(auth success) {
    cb('ok');
  } else {
    cb('bad');
  }
})

在监控服务器中:

app.set('adminAuthServerMonitor', function(msg, cb){
  if(auth success) {
    cb('ok');
  } else {
    cb('bad');
  }
})

默认情况下,需要在config/adminServer.json中进行配置,以完成服务间的认证。

[{
  "type": "connector",
  "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
}, {
  "type": "chat",
  "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
},{
  "type": "gate",
  "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
}]

其中,type表示服务器类型,token是你自定义生成的字符串。你需要为所有服务器提供type:token

另外,pomelo-admin还提供了一系列有用的系统模块。但是其中大部分是默认关闭的,可以在app.js来启用它们:

app.configure('development', function() {
  // enable the system monitor modules
  app.enable('systemMonitor');
});


4. pomelo-admin-web

4.1 介绍

pomelo-admin-web是一个pomelo-admin客户端,它可以监控和管理Pomelo框架,并通过浏览器监控正在运行的Pomelo服务器集群状态。

pomelo-admin-web的可以对Pomelo服务器集群运行状态、性能、日志等进行实时监控,如:

pomelo-admin-web的监控信息包括以下内容:

  • 'Process Info'public/js/systemInfo.js

    监控每台服务器的系统信息,包括:loadavg、men、CPU(I/O)、DISK(I/O)

  • 'System Info'public/js/nodeInfo.js

    用于监视每个服务器的节点进程信息,包括:pid、 cpu%、mem%、vsz、rss

  • request
    • 'Conn Request'public/js/conRequest.js

      于监控Connector服务器生成的请求日志,包括:玩家日志、移动、区域切换和路由请求的时间消耗。

    • 'Rpc Request'public/js/rpcRequest.js

      用于监控游戏服务器群集的rpc调用。

    • 'Forward Request'public/js/forRequest.js

      用于监控请求转发日志

  • 'Online User'public/js/onlineUser.js

    用于监控在线玩家信息,包括:登录用户名、登录IP、登录时间

  • 'Scene Info'public/js/sceneInfo.js

    用于监控区域的信息,包括:玩家、玩家坐标

  • 'Scripts'public/js/scripts.js

    本 admin 模块提供了一种通过在主服务器上注册的客户端,在特定服务器中执行脚本的方法。Pomelo 也使用的这个 admin 模块。

  • 'RPC Debug'public/js/rpcDebug.js

    从Mongo中获取rpc日志数据的模块pomelo-rpcdebug-module

  • 'Profile'public/js/profiler.js

    Profile是由chrome提供的性能分析工具,通过配置文件集成到此admin模块中,因此可用于Pomelo服务器群集的性能分析。


4.2 使用

pomelo-admin-web是一个基于express构建的客户端,它在浏览器环境下使用,运行平台支持:Linux、Mac。

可以通过以下几步下载和运行:

$ git clone https://github.com/NetEase/pomelo-admin-web.git
$ cd pomelo-admin-web
$ node app

运行后,可以在浏览器中输入http://localhost:7001,然后就可以看到运行效果。

一些注意点

  • 在使用pomelo-admin-web之前,Pomelo项目应该已启动才能看到监控状态
  • 如果有端口冲突,可以在config/admin.json文件中修改
  • 浏览器需要支付WebSocket才能使用,如:Chrome
  • 对于脚本 admin 模块,所执行的执行脚本与pomelo-cli中相同,应该注意脚本规范


5. Pomelo-cli

Pomelo-cli是一个监控和管理客户端,它提供了一个交互式命令行工具,帮助开发者在 Pomelo 框架上维护应用。

5.1 简单使用

安装

npm install -g pomelo-cli

连接并注册到Master

pomelo-cli -h <master host> -P <master port> -u <username> -p <password>

使用pomelo-cli命令但不添加额外参数时,其格式如下:

pomelo-cli -h 127.0.0.1 -P 3005 -u monitor -p monitor

访问控制在config/adminUser.json文件中配置,关于访问控制请参考:admin 访问控制


5.2 命令介绍

Pomelo-cli中的killstopaddenabledisable等命令仅限于非管理员用户。

Pomelo-cli中的命令介绍如下:

  • use

    切换cli环境上下文,新的上下文可以是serverIdall。切换上下文之后,之后的命令将被应用于新的上下文,直至切换到另一个上下文。如下所示:

    本领格式:

    > use [ <serverId>> | all ]

    示例:

    > use area-server-1
    > use all
  • quit退出pomelo-cli
  • kill关闭所有服务器
  • exec

    在服务上执行指定的脚本文件,并返回执行结果

    > exec <filepath>

    如,执行一个指定位置的脚本文件:

    > exec xxx.js
    > exec /home/user/xxx.js

    脚本文件会通过Node.js的VM执行,其执行上下文是:

    var context = {
      app: this.app, // pomelo 应用实例
      require: require,  // Node 全局函数 
      os: require("os"), // Node os 模块
      fs: require("fs"), // Node fs 模块
      process: process,  // Node process 模块 
      util: util // Node util 模块
    };

    脚本执行结果会通过全局变量result返回,这意味着您应该将执行结果分配给result变量。如:

    var cpus = os.cpus();
    // 声明不带var的result使其成为全局变量
    result = util.inspect(cpus, true, null);
  • get等价于app.get(key)
  • set等价于app.set(key, value),其中value必须是JSONfied
  • add

    添加一个服务器到Pomelo服务器集群的运行时中,此命令是一组key/value对字符器,类似于servers.json中的配置。

    示例如下:

    add host=127.0.0.1 port=3451 serverType=chat id=chat-server-2 add host=127.0.0.1 port=3152 serverType=connector id=connector-server-3 clientPort=3012 frontend=true
  • stop停止指定的服务器

    示例如下:

    stop area-server-1
  • show显示服务器、连接等信息,格式如下:
    show [servers|connections|logins|modules|status|proxy|handler|components|settings]

    示例:

    show servers 
    show connections 
    show proxy 
    show handler 
    show logins
  • enable启用一个admin模块或应用设置
    enable [ module | app ]

    示例:

    enable module systemInfo 
    enable app systemMonitor
  • disable禁用admin模块或应用设置
    disable [ module |app ]

    示例:

    disable module systemInfo 
    disable app systemMonitor
  • dump做一个V8堆和CPU的转储,以备后续检查。
    dump [ cpu | memory ] [--force]

    示例:

    dump cpu /home/xxx/ test 5 
    dump memory /home/xxx/ test