百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

尽可能通用的运维CMDB的设计与实践

mhr18 2024-12-13 13:01 28 浏览 0 评论

CMDB是配置管理数据库的简称,本文所阐述的CMDB只专注于存储运维相关的资源数据,有别于应用系统的配置管理。实际上企业一般都是自己内部的运维团队按照公司的运维场景需求设计和构建的CMDB,因为很少能有开源产品能满足他们的需求,或者是个性化的需求二次开发比较难易实现,所以他们都选择了自主研发,而不是使用开源!

因此,要实现一个尽可能通用、灵活、可扩展的运维资源数据的配置和管理系统,系统必须要满足:

1. 运维人员能根据企业的应用场景和需求,自己去构建存储的数据模型,以及模型之间的关系

2. 提供丰富的API,尤其是在数据和关系检索要做到通用,便于二次开发

3. 用户可以方便的订阅自己关心的数据

基于上述理念,设计并实现了一个CMDB,并开源出来,希望能得到大家的积极反馈,系统将持续不断的改进,UI上还有大量工作需要去完成。

源码: https://github.com/pycook/cmdb

具体安装和使用见README

总体架构

如图1,CMDB自下而上被划分为4层: 存储层、数据层、API、UI,图中的CIType可以理解为数据模型,例如物理机、虚拟机、应用、网卡、软件等。CI是配置项,即CIType的实例, 例如具体的1台物理机就是1个CI。下面概要介绍一下这4层。

存储层:主要用来存储CIType和CI,以及它们之间的关系。

· Mysql: 所有数据的持久化存储

· Redis: 数据缓存,主要是用户、属性、CIType、权限等的数据缓存,减少Mysql访问压力,提升API的响应速度

· Elasticsearch: 主要存储CI的实例数据,用来检索CI。实际上ES是一个可选的方案,CI数据的检索默认是通过Mysql+Redis来实现的,当然CI的实例数若超过一定数量级,考虑到查询效率,建议使用ES。

数据层:描述了模型数据和实例数据,以及它们之间的关系。在这一层首先需要运维按照具体的应用场景来完成模型的构建。模型包括属性,属性有不同的值的类型,且有一些检验规则,比如唯一、必须等的校验,在系统层面避免脏数据的录入。总结下来,运维CMDB实际上主要包括下面4种类型的数据:

1. 硬件数据:物理机、宿主机、机柜、网络设备、网卡、硬盘、内存等等

2. 软件数据:docker、mysql、redis、tomcat等等

3. 业务数据:应用、产品线、事业部等等

4. 关系数据:上面3种类型数据之间的关系

当然,每个公司的运维场景各异,用户都可以按照自己的需求来设计数据模型。

API层: 对UI提供一套统一、透明的调用接口,对下层各数据模块实行接口抽象与封装。要尽可能实现通用,要求CI和CI relation的查询API必须做到通用和灵活,要考虑到用户各种各样的查询需求,本系统实现了对应的2个API,基本上满足了前端对数据查询的所有需求。

UI层: 实际上就是web portal,用户直接访问CMDB的门户。核心功能主要包括:模型配置、资源视图、关系视图、树形视图和权限管理这5个核心模块。下面将对这5个功能模块进行阐述。

模型配置


除非是大型的成熟的企业,否则很难在开始就完全能够定义清楚运维的数据模型。因为企业在不断成长和发展的过程中,运维的场景和需求也是在不断的变化的,所以,通用的CMDB一定要能够让管理员方便对CIType进行动态的修改。如图2所示, 要完成动态建模,至少要能增删改CIType,给CIType定义属性,也可以从属性库直接复用已存在的属性,属性可以有校验规则,以便尽可能保证数据的准确性。属性值的类型支持以下5种:

1)整数类型

2)浮点数

3)日期类型: date, datetime, time

4)文本类型

5)json类型

此外,还可以构建CIType之间的关系,比如事业部包含产品线,产品线包含应用,应用部署在物理机,应用部署在docker上。


上图3和图4分别是对CIType的增删改和CIType的属性进行定义。下图5则是对关系视图进行定义,比如构建服务树,这个将在下面关系视图进行详细的阐述。

资源视图

资源视图即CI数据的检索。为了保证系统的通用、灵活,CI数据检索的API要能按照CI的属性进行各种条件过滤查询,而且这个API要尽可能覆盖用户不同的查询需求。CI的通用查询API实现了搜索表达式的查询,表达式支持AND、OR、NOT、IN、RANGE、COMPARISON的组合查询,如图6所示。具体的CI查询API使用说明见:

https://github.com/pycook/cmdb/blob/master/docs/cmdb_query_api.md

如图7,用户能够订阅自己关心的资源视图,比如物理机、应用等。图8则是用户订阅的资源视图的数据展示,我们可以根据属性字段查询,另外也提供了批量修改、下载、删除等操作,也可以查看CI的生命周期,以及它的关联CI。


树形视图

树形视图实际上是资源视图按照树形目录的方式来进行展示。 用户可以订阅某一个CIType按照不同属性分level来展示,比如物理机,我们可以定义: IDC -> 环境 -> 状态 3个属性分层的视图,如图9所示,用树形展示。这样方便了不同角色的用户可以按需来设计资源的统计展示方式,树形视图是单类CI实例数据的展示,不涉及到CI之间关系。

关系视图

关系视图是CI之间的关系,并用树形的方式来进行呈现。同样为了保证系统的通用性,CI关系查询和CI实例的查询API一样要灵活且通用,本系统实现的CI关系查询API是使用方法类似于上文提到的CI的查询API,只不过多了2个参数:root_id 搜索的根节点的ci_id和level搜索的层级,也就是说可以从某一个CI出发,去查询离该CI任一level的CI,如图10所示。从根节点root出发可以搜索level=1的关系节点,也可以直接搜索level=2或者n的任一一层节点。具体的API使用说明见:

https://github.com/pycook/cmdb/blob/master/docs/cmdb_query_api.md


关系视图是由管理员根据需求来进行定义,然后授权给不同的角色来使用。举个例子: 事业部 -> 产品线 -> 应用 定义这样的一个关系视图,我们命名为服务树, 树的节点是这3层CI, 具体的数据展示是应用下面的所有资源,可以是物理机,也可以是docker,如图11所示。

权限管理

权限管理:系统提供了基于角色的访问权限控制,支持角色继承,其设计也是比较灵活,可以按需实现比较细粒度的权限控制,目前可以按照CIType和关系视图来进行权限控制,主要包括增、删、改、查的权限控制。

相关推荐

MYSQL数据同步(mysql数据同步方式)

java开发工程师在实际的开发经常会需要实现两台不同机器上的MySQL数据库的数据同步,要解决这个问题不难,无非就是mysql数据库的数据同步问题。但要看你是一次性的数据同步需求,还是定时数据同步,亦...

SpringBoot+Redis实现点赞收藏功能+定时同步数据库

由于点赞收藏都是高频率的操作,如果因此频繁地写入数据库会造成数据库压力比较大,因此采用redis来统计点赞收藏浏览量,之后定时一次性写入数据库中,缓解数据库地压力。一.大体思路设计redis中的储存结...

双11订单洪峰:Codis代理层如何扛住Redis集群搞不定的120万QPS?

双11订单洪峰下的技术挑战每年的双11购物节,都是对电商平台技术架构的极限考验。当零点钟声敲响,海量用户瞬间涌入,订单量呈指数级增长,系统需要承受每秒数十万甚至上百万次的请求。作为电商系统的核心组件之...

基于spring boot + MybatisPlus 商城管理系统的Java开源商城系统

前言Mall4j项目致力于为中小企业打造一个完整、易于维护的开源的电商系统,采用现阶段流行技术实现。后台管理系统包含商品管理、订单管理、运费模板、规格管理、会员管理、运营管理、内容管理、统计报表、权限...

商品券后价产品设计方案(显示券后价)

如何设计一套高效、准确且稳定的券后价计算系统,是电商产品设计中的关键挑战之一。本文详细介绍了商品券后价的产品设计方案,从背景目标、功能设计、系统实现逻辑到异常处理机制等多个方面进行了全面阐述。一、背景...

外观(门面)模式-Java实现(java 门面模式)

定义外观模式(FacadePattern),也叫门面模式,原始定义是:为了子系统中的一组接口提供统一的接口。定义一个更高级别的接口,使子系统更易于使用。大大降低应用程序的复杂度,提高了程序的可维护性...

Mall - 用 SpringBoot 实现一个电商系统

目前最为主流的Web开发技术,包括SpringBoot、MyBatis、MongoDB、Kibina、Docker、Vue等,都是开发者十分需要掌握的技术。有没有一个全面而又实际的项目,能把这...

腾讯云国际站:哪些工具能实现可视化运维?

本文由【云老大】TG@yunlaoda360撰写开源工具Grafana:开源的可视化平台,可与Prometheus、Elasticsearch、MySQL等多种数据源集成,将复杂监控数据转化...

系统稳定性保障全流程实战:事前、事中、事后 Java 代码详解

在互联网架构中,系统稳定性是生命线。本文基于“事前预防、事中管控、事后复盘”三阶段模型,结合Java实战代码,深度解析如何构建高可用系统,让你的服务稳如磐石!一、事前:未雨绸缪,筑牢防线1.发...

Java面试题:拆分微服务应该注意哪些地方方,如何拆分?

在拆分微服务时,需要综合考虑业务、技术和组织等多方面因素,以下是关键注意事项及拆分策略的详细说明:一、拆分注意事项1.业务边界清晰化单一职责原则:每个服务应专注于单一业务能力,例如订单服务仅处理订单...

软件性能调优全攻略:从瓶颈定位到工具应用

性能调优是软件测试中的重要环节,旨在提高系统的响应时间、吞吐量、并发能力、资源利用率,并降低系统崩溃或卡顿的风险。通常,性能调优涉及发现性能瓶颈、分析问题根因、优化代码和系统配置等步骤,调优之前需要先...

Docker Compose实战,多容器协同编排的利器,让开发部署更高效!

开篇导读你是否有过这样的经历?启动一个项目,数据库、Redis、Web服务得一个个敲dockerrun?想让别人复现你的开发环境,却得发一堆复杂的启动命令?明明都是容器,为什么不能“一键启动”所...

如何设计Agent的记忆系统(agent记忆方法)

最近看了一张画Agent记忆分类的图我觉得分类分的还可以,但是太浅了,于是就着它的逻辑,仔细得写了一下在不同的记忆层,该如何设计和选型先从流程,作用,实力和持续时间的这4个维度来解释一下这几种记忆:1...

不了解业务和技术术语怎么做好产品和项目?

基础技术术语术语分类解释API开发技术应用程序接口,不同系统间数据交互的协议(如支付接口、地图接口)。SDK开发工具软件开发工具包,包含API、文档和示例代码,帮助快速接入服务。RESTfulAPI...

Docker 架构详解与核心概念实战图解:一文读懂容器的前世今生

不懂Docker架构,你只是“用容器的人”;理解了它的底层逻辑,才能成为真正的高手!在学习Docker之前,很多同学可能会陷入一个误区:“反正我用dockerrun就能跑起服务,架构这种...

取消回复欢迎 发表评论: