1.项目概述
随着信息化发展,云计算、高性能集群等应用规模不断扩大、机房设备数量不断增加。传统的厂商监控工具无法满足运维人员日常工作需要,反之会给运维人员增加负担,传统的设备厂商监控工具有管网络设备的,有管机房环境的,有管主机服务器的,有管数据库、中间件的等。各管一滩、各自为政,这样让维护业务系统成为一个难题,一旦某个业务运行缓慢甚至中断时,无法及时判断问题根源,所以需要建立一套实时、统一、集中有效的智能运维监控管理平台。
2.需求分析
需求分析的类型如下
- 功能需求:根据所需的活动描述所需的行为
- 质量需求或非功能需求:描述软件必须具备的一些质量特性
- 设计约束(设计约束): 设计决策,例如选择平台或接口组件
- 过程约束(过程约束): 对可用于构建系统的技术或资源的限制
2.1 功能性需求
2.1.1 用户需求
- 用户注册:注册一个账号管理属于自己的机器集群
- 用户登录:登录监控平台网页
- 实时监控:可以通过网页显示设备实时状态
- 配置设备:添加或者删除设备
- 断开连接:可以手动断开设备连接释放资源
- 设备状态变更推送:检测设备状态并且可以实时更改
2.1.2 分布式机器端需求
- 监控机器性能:实时发送机器的物理指标与系统资源指标
- 发送心跳包:每隔30s实时发送一个心跳包
- 发送异常信号:当设备出现异常及时通知服务器
- 发送设备状态变化:当设备状态发生变化通知服务器
- 更改状态:接受服务器端指令改变状态
2.2 非功能性需求
- 支持用户并发访问
- 支持多个集群
- 每个集群节点扩展至几千个并能保证响应速度不变
- 提供外部访问接口,实现手机应用的调用
3.用例建模
3.1 抽象用例
更据上文的需求描述,我们可以提炼出用户端与集群段需要完成的业务。
3.2 高层用例
用例 | 开始状态 | 中止状态 |
用户注册 | 点击用户注册按钮 | 系统给用户分配账号 |
用户登录 | 点击用户登录按钮 | 登入监控页面 |
添加设备 | 点击添加设备按钮 | 设备被添加入列表 |
删除设备 | 点击删除设备按钮 | 设备从列表中删除 |
连接设备 | 点击设备连接按钮 | 列表显示设备在线 |
断连设备 | 点击设备断连按钮 | 列表显示设备离线 |
变更状态 | 点击设备状态按钮 | 选中设备状态改变 |
3.3 用例图
4. 业务数据建模
我们采用了redis数据库进行前后端的数据存储,redis是使用ANSI C语言开发的一个高性能Key-Value数据库,是当今速度最快的内存型非关系型(NoSQL)数据库。
Key | Value |
u_id | 用户id |
u_name | 用户名称 |
u_password | 用户账号密码 |
u_count | 监控机器数量 |
u_machineArray | 监控机器集群id |
Key | Value |
m_id | 机器id |
m_owner | 所属用户id |
m_status | 机器连接状态 |
m_temperature | 机器cpu温度 |
m_operation | 机器运作状态 |
m_resources | 机器系统资源 |
5.设计分析
5.1 架构模式
显而易见我们应该使用C/S架构进行整个系统的设计,我们在测试阶段可以通过进程模仿机器集群,tcp服务器接受client的tcp连接,同时tcp服务器同时作为websocket服务器的客户端,向websocket服务器发送设备信息,最终传入web网页供用户观看。
5.2 设计模式
当机器集群多达几千台甚至上万台,对于tcp服务器来说是个巨大考验,这个时候我们需要保证系统的正常响应,需要通过代理模式实现负载均衡。
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
代理模式的主要优点有:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
其主要缺点是:
- 代理模式会造成系统设计中类的数量增加
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
具体的负载均衡实现思路:当我们集群需要连接到服务器时,是需要先连接到代理服务器,代理服务器从数据库中进行查询,查询到正维持的连接数量最少的一台服务器的ip地址返回给机器端,便可实现负载均衡。
6.开发与部署
6.1 开发环境与工具
- 开发语言: C++、python
- 代码管理与版本控制:gitee
- 开发工具:visual studio 2019 、pycharm
- 网络库与框架选择:libhv(TCPServer)、Django(websocket)、vue(web)、redis(数据库)、nginx(proxy)
6.2 development view
6.3 logic view
我们在写tcp服务器的时候,可以参照libhv网络库里的api直接调用
6.4 Implementation view
6.5 depoly view
6.6 executable view
最终形成的可执行文件执行顺序
作者:595