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_on 与 belongs_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等自定义属性。
通过明确的资产数据模型与标准定义,可为资源编排与自动化交付提供稳定可依赖的数据支撑,降低运维成本,提升平台化治理能力。