3、CMDB配置管理数据库:模型设计、自动发现机制、数据一致性保障

聊到CMDB,很多运维同学第一反应就是「又脏又乱又没人用」。说实话,我见过太多CMDB项目最后变成了摆设。数据不准、没人维护、跟实际环境对不上。嗯,这其实不是CMDB的错,是设计思路出了问题。

今天我就把我在金融云这几年折腾CMDB的经验,掰开了揉碎了讲给你听。核心就三件事:模型怎么设计、数据怎么自动发现、一致性怎么保障。

3.1 模型设计:别想着一步到位

模型设计是CMDB的根基。我见过最惨的案例,是某团队一开始设计了200多个字段,结果运维同学填了三天就放弃了。你想想看,谁会愿意手动维护那么多信息?

我个人习惯是「最小可用原则」。先保证核心字段,后面慢慢迭代。

3.1.1 核心模型结构

金融云的CMDB,我一般分成三层:

层级 示例 核心字段
资源层 服务器、网络设备、存储 IP、序列号、型号、机房位置
逻辑层 应用、中间件、数据库实例 端口、版本、所属应用、配置参数
业务层 业务系统、服务单元 业务线、负责人、SLA等级

这里有个坑——千万别把逻辑层和资源层混在一起。我在项目中遇到过,有人把IP地址直接当成应用实例的唯一标识。结果一台服务器上部署了三个应用,数据全乱套了。

核心原则:资源层管「有什么」,逻辑层管「跑什么」,业务层管「谁在用」。三层之间通过关联关系连接,不要互相包含字段。

3.1.2 关系设计

模型之间的关系,我建议用「简单关联」而不是「复杂继承」。说白了,就是一张表记录A和B的关系,别搞什么多态继承那一套。

-- 关系表示例
CREATE TABLE cmdb_relation (
    id INT PRIMARY KEY,
    source_type VARCHAR(50),   -- 源对象类型
    source_id INT,             -- 源对象ID
    target_type VARCHAR(50),   -- 目标对象类型
    target_id INT,             -- 目标对象ID
    relation_type VARCHAR(50), -- 关系类型:部署在、依赖、连接
    create_time DATETIME
);

为什么这么设计?因为金融云的环境变化太快。今天这个应用部署在A机器,明天可能就迁移到B机器了。用这种松耦合的关系表,改起来特别方便。

3.2 自动发现机制:让数据自己长出来

手动录入?那是上个时代的玩法。自动发现才是CMDB的灵魂。我曾经接手过一个项目,2000台服务器全靠人工录入,准确率不到60%。后来我上了自动发现,三个月后准确率提到了95%以上。

3.2.1 发现策略分层

自动发现不能一把抓,要分层进行:

  1. 网络层发现:通过SNMP、LLDP协议,发现网络拓扑和设备信息
  2. 系统层发现:通过Agent或SSH,采集OS信息、CPU、内存、磁盘
  3. 应用层发现:通过API或日志,发现中间件、数据库、应用进程

我的经验:网络层用SNMP轮询,每5分钟一次。系统层用Agent推送,每1分钟一次。应用层用事件触发,有变化才上报。这样既保证了实时性,又不会把CMDB压垮。

3.2.2 发现脚本示例

这里给一个简单的Agent发现脚本,采集服务器基本信息:

#!/bin/bash
# 服务器自动发现脚本
# 采集信息并上报到CMDB

HOSTNAME=$(hostname)
IP=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
CPU_CORES=$(nproc)
MEM_TOTAL=$(free -m | grep Mem | awk '{print $2}')
DISK_TOTAL=$(df -h / | tail -1 | awk '{print $2}')
OS_VERSION=$(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')

# 上报到CMDB API
curl -X POST http://cmdb-api:8080/v1/resource \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "'$HOSTNAME'",
    "ip": "'$IP'",
    "cpu_cores": '$CPU_CORES',
    "mem_total_mb": '$MEM_TOTAL',
    "disk_total": "'$DISK_TOTAL'",
    "os_version": "'$OS_VERSION'"
  }'

这个脚本看起来简单,但我在实际项目中踩过坑——Agent的版本管理。曾经有一次,我更新了Agent脚本,但没通知所有团队。结果有的机器跑旧版本,有的跑新版本,上报的数据格式都不一样。后来我强制所有Agent通过CMDB统一分发,才解决了这个问题。

3.3 数据一致性保障:CMDB的命根子

数据一致性,说白了就是「CMDB里的数据跟实际环境一模一样」。这听起来简单,做起来难。我见过太多CMDB,刚上线时数据挺准,三个月后就没人信了。

3.3.1 一致性检查机制

我一般用「三明治检查法」:

  • 上层检查:业务系统负责人定期确认应用关系是否正确
  • 中层检查:自动发现引擎每天全量比对一次
  • 底层检查:Agent实时上报,发现差异立即告警

注意:自动发现不是万能的。有些信息,比如「这个应用属于哪个业务线」,机器是发现不了的。这种信息需要人工维护,但一定要有审批流程,不能随便改。

3.3.2 差异处理流程

当发现数据不一致时,我建议走这个流程:

  1. 自动修复:如果是Agent上报的差异,且差异在阈值范围内,自动更新CMDB
  2. 人工确认:如果是结构变化(比如新增了应用),发工单给负责人确认
  3. 审计追溯:所有变更记录都要保留,方便回溯

为什么会这样设计?因为金融云对变更管控特别严。我曾经因为一个自动修复的误操作,把生产环境的配置改错了,差点引发事故。从那以后,我对自动修复加了「阈值保护」——只有差异在5%以内才允许自动修复,超过5%必须人工介入。

3.3.3 一致性评分

我习惯给每个资源打一个「一致性评分」,让数据质量变得可量化:

评分区间 含义 处理方式
95-100分 数据准确,无需处理 正常监控
80-94分 少量差异,自动修复 触发自动修复流程
60-79分 较多差异,需要人工介入 生成工单,通知负责人
60分以下 数据不可信,需要全面排查 紧急告警,暂停依赖该数据的自动化任务

这个评分机制,说白了就是给CMDB的数据质量上了个「仪表盘」。运维团队每天看一眼评分,就知道今天的数据靠不靠谱。

3.4 整体架构图

下面这张图,是我在金融云实践中总结的CMDB核心架构。你看一眼,基本就能理解整个体系是怎么运转的。

CMDB配置管理数据库核心架构 数据采集层 Agent主动上报 SNMP/SSH轮询 API事件触发 日志解析 模型层 资源模型(服务器/网络/存储) 逻辑模型(应用/中间件/DB) 业务模型(业务线/SLA) 一致性保障层 自动修复(阈值内) 人工确认(结构变化) 审计追溯(变更记录) 一致性评分

这张图里,数据从底层采集上来,经过模型层标准化,再通过一致性保障层确保准确。三个环节环环相扣,缺一不可。

总结一下:CMDB不是一次性项目,而是一个持续运营的过程。模型设计要轻量,自动发现要分层,一致性保障要量化。做到这三点,你的CMDB就能从「没人用」变成「离不开」。

嗯,关于CMDB的核心内容就这些。如果你在实际落地中遇到什么问题,欢迎随时交流。毕竟,金融云的运维自动化,从来不是一个人的战斗。