19.1.5 数据模型与平台基础服务
平台数据模型是运维平台化的核心资产,应围绕“人、资源、配置、服务、流程、事件、度量”构建统一语义与主数据。推荐采用实体-关系模型,统一标识体系(全局唯一 ID)、生命周期状态、变更历史与关联依赖,避免“资产孤岛”。
原理草图(数据模型与基础服务关系)
数据模型与主数据示例#
以 CMDB 为例,定义关键实体与关系(简化):
-- 文件:/opt/cmdb/schema.sql
CREATE TABLE asset (
id UUID PRIMARY KEY,
name TEXT NOT NULL,
type TEXT CHECK (type IN ('host','vm','container','cluster','instance')),
env TEXT CHECK (env IN ('prod','pre','test')),
status TEXT CHECK (status IN ('online','offline','retired')),
owner TEXT,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE app (
id UUID PRIMARY KEY,
name TEXT NOT NULL,
version TEXT,
owner TEXT,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE asset_app_rel (
asset_id UUID REFERENCES asset(id),
app_id UUID REFERENCES app(id),
rel_type TEXT CHECK (rel_type IN ('deploy','depend')),
PRIMARY KEY (asset_id, app_id, rel_type)
);
初始化与验证
# 以 PostgreSQL 为例
sudo apt-get update
sudo apt-get install -y postgresql
sudo -u postgres psql -c "CREATE DATABASE cmdb;"
sudo -u postgres psql cmdb -f /opt/cmdb/schema.sql
# 插入示例数据
sudo -u postgres psql cmdb -c "INSERT INTO asset VALUES (gen_random_uuid(),'web-01','host','prod','online','ops',now());"
sudo -u postgres psql cmdb -c "INSERT INTO app VALUES (gen_random_uuid(),'nginx-web','1.24','dev',now());"
# 查看关系表结构
sudo -u postgres psql cmdb -c "\d asset_app_rel"
预期效果:资产、应用、关系可查询并形成统一拓扑视图。
平台基础服务与技术选型示例#
基础服务应提供稳定通用能力支撑上层编排与自动化:
- 统一认证与权限:Keycloak/LDAP/SSO,RBAC/ABAC。
- 资产与配置中心:CMDB + Git/数据库配置版本化。
- 服务发现与注册:Consul/Nacos,健康检查。
- 任务与调度引擎:Jenkins/Argo/自研调度。
- 流程与审批:标准化变更流程。
- 日志与审计:审计日志、变更留痕。
- 通知与消息总线:Kafka/RabbitMQ。
- 监控与告警:Prometheus/Alertmanager。
示例:搭建最小化“认证 + CMDB + 消息总线”
# 1) 安装 Keycloak(简化 Docker 方式)
docker run -d --name keycloak -p 8080:8080 \
-e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:22.0.5 start-dev
# 2) 安装 RabbitMQ
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 \
rabbitmq:3-management
# 3) 安装 PostgreSQL(CMDB)
docker run -d --name cmdb-pg -e POSTGRES_PASSWORD=cmdbpass -p 5432:5432 postgres:15
基础服务联动示意图
数据一致性与接口层示例#
主数据与业务数据拆分,关键实体强一致,关系更新通过事件总线驱动。
事件发布示例(伪代码)
# 新资产入库后发布事件
curl -X POST http://mq-host:15672/api/exchanges/%2F/amq.topic/publish \
-u guest:guest \
-H "Content-Type: application/json" \
-d '{
"properties": {},
"routing_key": "cmdb.asset.created",
"payload": "{\"asset_id\":\"...\",\"type\":\"host\",\"env\":\"prod\"}",
"payload_encoding": "string"
}'
API 网关标准化(示例 Nginx)
# 文件:/etc/nginx/conf.d/api.conf
server {
listen 80;
location /api/ {
proxy_pass http://cmdb-service:8081/;
proxy_set_header X-Request-Id $request_id;
limit_req zone=api burst=20 nodelay;
}
}
排错清单(示例)#
- Keycloak 8080 无法访问:确认容器状态
docker ps,查看日志docker logs keycloak。 - PostgreSQL 连接失败:确认端口映射
docker port cmdb-pg,检查密码POSTGRES_PASSWORD。 - RabbitMQ 消息未消费:检查交换机与路由键是否匹配,查看管理台
http://localhost:15672。 - API 429 限流:调整
limit_req参数或加大 burst。
练习#
- 设计一张“配置项”表(config_item),包含版本、环境、变更人字段,并建立与 asset 的关系表。
- 用 curl 调用 CMDB 的新增资产接口,随后在 MQ 中发布
cmdb.asset.created事件。 - 为 API 网关增加鉴权头校验规则,模拟 401 与 200 的返回结果。
- 绘制你所在团队的运维数据模型草图,至少包含 6 个实体与 5 条关系。