19.2.1 资产数据模型与标准定义

资产数据模型与标准定义#

资产数据模型是运维平台化的核心基础,用于统一描述主机、网络、存储、应用、中间件、容器、云资源等对象及其关系,保证资产信息一致性、可扩展性与可追溯性,为资源编排、变更控制、监控告警和成本治理提供标准化数据底座。

1. 原理与模型结构草图(数据实体与关系)

文章图片

2. 资产建模原则与核心字段
- 统一标识:全局唯一资产ID(UUID/雪花ID),支持跨系统映射与合并。
- 分层抽象:资源层(基础设施)、平台层(中间件/容器)、应用层(服务/实例)。
- 关系驱动:以拓扑关系驱动配置、监控和变更,强调依赖与承载关系。
- 可扩展性:支持自定义属性(JSON)和多云/混合架构演进。
- 生命周期一致性:规划、上线、变更、下线、归档状态统一。

3. 核心字段标准示例(MySQL数据模型)

示例使用 MySQL 8.0 作为 CMDB 数据库,演示核心表结构。
目标:统一资产表 cmdb_asset 与关系表 cmdb_relation

# 1) 安装并启动 MySQL(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y mysql-server
sudo systemctl enable --now mysql

# 2) 初始化数据库与用户
sudo mysql -e "CREATE DATABASE cmdb DEFAULT CHARSET=utf8mb4;"
sudo mysql -e "CREATE USER 'cmdb'@'%' IDENTIFIED BY 'Cmdb@123';"
sudo mysql -e "GRANT ALL PRIVILEGES ON cmdb.* TO 'cmdb'@'%';"
sudo mysql -e "FLUSH PRIVILEGES;"
-- 3) 创建资产主表
USE cmdb;

CREATE TABLE cmdb_asset (
  id           VARCHAR(64) PRIMARY KEY,
  name         VARCHAR(128) NOT NULL,
  type         VARCHAR(32)  NOT NULL,   -- host/mysql/redis/k8s_node/service
  env          VARCHAR(16)  NOT NULL,   -- dev/test/prod
  region       VARCHAR(32),
  zone         VARCHAR(32),
  status       VARCHAR(16)  NOT NULL,   -- planned/online/changed/offline/archived
  owner        VARCHAR(64),
  ip           VARCHAR(64),
  os           VARCHAR(64),
  cpu          INT,
  memory_gb    INT,
  disk_gb      INT,
  attributes   JSON,                   -- 扩展字段
  created_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE cmdb_relation (
  id           BIGINT AUTO_INCREMENT PRIMARY KEY,
  src_id       VARCHAR(64) NOT NULL,
  dst_id       VARCHAR(64) NOT NULL,
  relation     VARCHAR(32) NOT NULL,    -- belongs_to/runs_on/depends_on/connects_to
  created_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uniq_rel (src_id, dst_id, relation)
);

CREATE INDEX idx_asset_type ON cmdb_asset(type);
CREATE INDEX idx_asset_env  ON cmdb_asset(env);

4. 标准化命名与校验规则(示例配置)

以统一命名规则为例:业务-环境-类型-序号,并通过脚本进行校验。

# 文件路径:/opt/cmdb/validate_name.sh
#!/usr/bin/env bash
# 用法: ./validate_name.sh "pay-prod-mysql-001"
NAME="$1"
RULE='^[a-z0-9]+-(dev|test|prod)-(host|mysql|redis|k8snode|svc)-[0-9]{3}$'
if [[ "$NAME" =~ $RULE ]]; then
  echo "OK: $NAME"
  exit 0
else
  echo "INVALID: $NAME"
  exit 1
fi
chmod +x /opt/cmdb/validate_name.sh
/opt/cmdb/validate_name.sh "pay-prod-mysql-001"
# 预期输出: OK: pay-prod-mysql-001

5. 资产数据落地示例(写入资产与关系)

资产示例:MySQL 实例运行在主机上,并归属到某业务。

-- 插入主机与MySQL实例
INSERT INTO cmdb_asset (id, name, type, env, region, zone, status, owner, ip, os, cpu, memory_gb, disk_gb)
VALUES
('host-uuid-001', 'pay-prod-host-001', 'host', 'prod', 'cn-hz', 'az1', 'online', 'ops', '10.0.0.10', 'ubuntu20.04', 8, 32, 500),
('mysql-uuid-001','pay-prod-mysql-001','mysql','prod','cn-hz','az1','online','dba',NULL,NULL,NULL,NULL,NULL);

-- 关系:mysql runs_on host
INSERT INTO cmdb_relation (src_id, dst_id, relation)
VALUES ('mysql-uuid-001','host-uuid-001','runs_on');

-- 关系:mysql belongs_to 业务(业务也可以建成资产类型)
INSERT INTO cmdb_relation (src_id, dst_id, relation)
VALUES ('mysql-uuid-001','biz-pay','belongs_to');

6. API 与自动同步示例(curl调用 + 预期效果)

若 CMDB 提供 REST API,可通过自动化写入资产信息。

# 写入资产
curl -X POST http://cmdb.example.com/api/assets \
  -H "Content-Type: application/json" \
  -d '{
    "id":"redis-uuid-001",
    "name":"pay-prod-redis-001",
    "type":"redis",
    "env":"prod",
    "region":"cn-hz",
    "zone":"az1",
    "status":"online",
    "owner":"ops",
    "ip":"10.0.0.20",
    "attributes":{"port":6379,"version":"6.2"}
  }'
# 预期返回: {"code":0,"msg":"ok"}

7. 排错与数据质量检查(示例)

常见问题:重复资产、关系缺失、状态不一致。

-- 查找重复命名
SELECT name, COUNT(*) AS cnt
FROM cmdb_asset
GROUP BY name
HAVING cnt > 1;

-- 查找未关联承载关系的中间件资产
SELECT a.id, a.name, a.type
FROM cmdb_asset a
LEFT JOIN cmdb_relation r
  ON a.id = r.src_id AND r.relation = 'runs_on'
WHERE a.type IN ('mysql','redis','kafka','nginx')
  AND r.id IS NULL;

-- 状态异常(上线资产但缺少IP)
SELECT id, name, type, status, ip
FROM cmdb_asset
WHERE status='online' AND (ip IS NULL OR ip='');

8. 运维练习(建议实际动手)
1. 安装 MySQL 并创建 cmdb_asset/cmdb_relation 表。
2. 创建 2 台主机、1 个 MySQL、1 个 Redis 的资产记录。
3. 为 MySQL 与 Redis 分别建立 runs_onbelongs_to 关系。
4. 使用 SQL 查出:
- 所有未建立承载关系的中间件资产
- 某业务(biz-pay)下的所有资产
5. 将一台主机状态从 online 改为 offline,并记录更新时间。

9. 命令与字段解释(摘要)
- cmdb_asset.type:资产类型(host/mysql/redis/k8s_node/service)。
- cmdb_relation.relation:关系类型(belongs_to/runs_on/depends_on/connects_to)。
- attributes:扩展字段(JSON),适配版本号、端口、集群ID等自定义属性。

通过明确的资产数据模型与标准定义,可为资源编排与自动化交付提供稳定可依赖的数据支撑,降低运维成本,提升平台化治理能力。