多平台/跨语言远程管理项目设计

1.概述

设计并发开一套远程管理系统,由单点触发管理所有的内部机器,兼容Windows与Linux,可以方便化的开发并增加模块,并且便于部署与版本更新升级。

2.实现目标和意义

  1. 作为系统部对机器进行远程管理的中间件
  2. 实现运维人员可以在从单点触发管理目前线上的机器(Windows/Linux)
  3. 使开发人员可以方便的接入远程管理系统,并通过远程管理接口操作线上机器,实现运维自动化
  4. 实现机器的定时任务集中管理

3.应用范围

所有的资产机器

4.主要功能需求

基础

1 通讯协议、在线检测与配置文件

通讯协议基于Thrift,并且Scheduler与Agent全部注册到Zookeeper上,确保客户端的时效性,并且存储部分配置文件信息

2 管理界面与外部接口

提供一套统一的接口,允许系统调用接口实现远程内部所有功能。并且基于统一接口为用户提供一套管理界面,允许用户在管理界面上进行功能使用。

3 操作模式

所有用户/系统操作均由Scheduler端进行中转,并且中心端记录所有详细的操作日志

4 模块与语言

支持模块的开发,并且支持多语言支持(Shell,Python,Java,C#),模块支持动态加载,可以在不重启Scheduler与Agent时动态加载模块

任务模式

1 支持异步调用

允许用户/系统,发送指令至Scheduler端,由Scheduler端将指令转发至Agent端,Agent端异步执行后将反馈结果反馈至Scheduler端,用户/系统可以再做请求后获得上次指令的结果

2 支持同步调用

允许用户/系统,发送指令至Scheduler端,由Scheduler端将指令转发至Agent端,并将数据反馈至用户/系统,并同步将客户端执行结果反馈给用户/系统

基础功能

1 计划任务(Crontab)

可以远程设置并查看机器的计划任务(Cron)信息,Cron支持Agent端本地模式与Scheduler端触发模式,并可以监控Cron的执行状态

2 队列模式

Scheduler端支持队列模式,支持用户发送一套指令,并且指令可以确定依赖关系,并且根据指令的顺序性(并发性)进行执行

3 远程更新

可以支持Scheduler端与Agent端与模块的自动更新

5.系统设计

5.1 程序架构

5.2 通讯结构体

命令构体

struct instruct{
   1 : string instruct,
   2 : string id,
   3 : map param
}
** 命令结果结构体 **
struct reinstruct{
   1 : instruct ins,
   2 : string ip,
   3 : i32 costtime,
   4 : string memo
}

5.3 代码结构

Dao层:数据访问层,数据库相关操作,Model 层:模型层,实体模型,Serverice 业务层,处理所有业务逻辑

5.4 组件设计

5.4.1 Module

5.4.1.1 简介

5.4.1.2 接口

public interface Worker {
    public String Exec(instruct ins) ;
}

public interface Processor {
    public String Exec(reinstruct reins) ;
}

public interface Tasker {
    public String Exec() ;
}

5.4.1.3 设计思想

  1. 每个模块均需要配备Worker、Processor、Tasker,并且作为一个包同时加载到Schedualr与Agent
  2. Worker加载至Agent,执行相应节点机器逻辑,如检测线程数,进程数,负载情况等等
  3. Processor加载至Schedualr主要用户处理由Worker返回的数据,如入库操作,错误判断等
  4. Tasker加载至Schedualr端,用于定时触发增加队列任务
  5. 所有的模块信息由Schedualr待其注册至Zookeeper

5.4.2 Schedular

5.4.2.1 简介

5.4.2.2 服务

service SchedulerService{
    //异步返回结果处理器
    string dataTransport(1:reinstruct reinstruct)

    //指令中转器[同步]
    string instructionTransit(1:string ip, 2:instruct instruct)
}

service InterfaceService{
    //创建队列
    string createQueue(1:string ip, 2:string instruct,3:string jsonParam ,4:string depend)

    //提交队列
    string subQueue(1:string queueId)

    //停止队列
    string stopQueue(1:string queueId)

    //获取队列信息
    string getQueue(1:string queueId)

    //创建计划任务
    string createCron(1:string ip,2:string type 3:string instruct,4:string jsonParam ,5:string rule)

    //获取计划任务
    string getCron(1:string ip)

    //删除计划任务
    string deleteCron(1:string ip,2:string cronId)
}

5.4.2.3 设计思想

  1. Schedular由Master与Slave构成
  2. Master由Java实现,并可动态加载Java编写的Module
  3. Slave分为 C#版与Python版,可分别加载其语言编写的相应模块
  4. 原则上Master与Slave需要部署在同一台机器上,Master与Slave之间通讯协议使用Thrift
  5. Master与两个Slave全部注册到Zookeeper上,只有全部注册成功才可认定此Schedular正常运行
  6. 多个Schedular依靠Zookeeeper通过选举方式产生Leader,Leader负责计划任务的调用执行与队列任务的调用执行,所有的Schedular均会进行Agent的数据处理
  7. 指令中转器可由用户通过WEB界面或其他系统调用,并且只可以采用同步模式,异步模式将采用队列方式提交
  8. Schedular提供队列功能,并且队列之间可以设置依赖关系,在构造完队列后提交至Schedular,由Schedular触发完成后续操作,队列功能全部采用异步模式进行
  9. Schedular提供计划任务功能,并且提供对外接口,可以设置某IP上的队列,支持设置由Schedular触发或Agent触发模式
  10. Schedular与核心数据库进行数据交互
  11. Schedular采用jdk1.7, Spring , Mybatis构建JAVA客户端项目,C# slave采用.net4.0构建console项目,python slave采用python2.7构建python项目

5.4.3 Agent

5.4.3.1 简介

5.4.3.2 服务

service AgentService{
    //指令接收器[异步]
    listinstructionInvokeAsync(1: list instruct)

    //指令接收器[同步]
    reinstruct instructionInvokeSync(1: instruct instruct)
}

5.4.3.3 设计思想

  1. Agent有两个版本,Python版与C#版,分别对应安装在Linux机器与Windows机器
  2. 所有的Agent均注册到Zookeeper上,达到健康监测的作用,Agent自有的配置文件均存放在Zookeeper的本身节点目录下
  3. 所有的模块均采用动态加载的方式
  4. Agent不与核心数据库进行数据交互
  5. Agent采用jdk1.7, Spring , Mybatis构建JAVA客户端项目,C# slave采用.net4.0构建console项目,python slave采用python2.7构建python项目

5.5 Zookeeper

5.5.1 目录树

5.5.2 使用原则

  1. Zookeeper需要与Schedular建设在同一个机房
  2. Zookeeper中数据存储均采用Json格式

5.6 核心库物理模型