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。

练习#

  1. 设计一张“配置项”表(config_item),包含版本、环境、变更人字段,并建立与 asset 的关系表。
  2. 用 curl 调用 CMDB 的新增资产接口,随后在 MQ 中发布 cmdb.asset.created 事件。
  3. 为 API 网关增加鉴权头校验规则,模拟 401 与 200 的返回结果。
  4. 绘制你所在团队的运维数据模型草图,至少包含 6 个实体与 5 条关系。