1.概述
设计并发开一套远程管理系统,由单点触发管理所有的内部机器,兼容Windows与Linux,可以方便化的开发并增加模块,并且便于部署与版本更新升级。
2.实现目标和意义
- 作为系统部对机器进行远程管理的中间件
- 实现运维人员可以在从单点触发管理目前线上的机器(Windows/Linux)
- 使开发人员可以方便的接入远程管理系统,并通过远程管理接口操作线上机器,实现运维自动化
- 实现机器的定时任务集中管理
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 设计思想
- 每个模块均需要配备Worker、Processor、Tasker,并且作为一个包同时加载到Schedualr与Agent
- Worker加载至Agent,执行相应节点机器逻辑,如检测线程数,进程数,负载情况等等
- Processor加载至Schedualr主要用户处理由Worker返回的数据,如入库操作,错误判断等
- Tasker加载至Schedualr端,用于定时触发增加队列任务
- 所有的模块信息由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 设计思想
- Schedular由Master与Slave构成
- Master由Java实现,并可动态加载Java编写的Module
- Slave分为 C#版与Python版,可分别加载其语言编写的相应模块
- 原则上Master与Slave需要部署在同一台机器上,Master与Slave之间通讯协议使用Thrift
- Master与两个Slave全部注册到Zookeeper上,只有全部注册成功才可认定此Schedular正常运行
- 多个Schedular依靠Zookeeeper通过选举方式产生Leader,Leader负责计划任务的调用执行与队列任务的调用执行,所有的Schedular均会进行Agent的数据处理
- 指令中转器可由用户通过WEB界面或其他系统调用,并且只可以采用同步模式,异步模式将采用队列方式提交
- Schedular提供队列功能,并且队列之间可以设置依赖关系,在构造完队列后提交至Schedular,由Schedular触发完成后续操作,队列功能全部采用异步模式进行
- Schedular提供计划任务功能,并且提供对外接口,可以设置某IP上的队列,支持设置由Schedular触发或Agent触发模式
- Schedular与核心数据库进行数据交互
- 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 设计思想
- Agent有两个版本,Python版与C#版,分别对应安装在Linux机器与Windows机器
- 所有的Agent均注册到Zookeeper上,达到健康监测的作用,Agent自有的配置文件均存放在Zookeeper的本身节点目录下
- 所有的模块均采用动态加载的方式
- Agent不与核心数据库进行数据交互
- 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 使用原则
- Zookeeper需要与Schedular建设在同一个机房
- Zookeeper中数据存储均采用Json格式