結合公司現狀淺談CMDB

本篇文章結合參考資料中的幾篇CMDB的文章再加上目前公司的現狀談一談CMDB。mysql

CMDB概述

CMDB:configuration management database,配置管理數據庫。CMDB本質上是一個數據庫,提供數據的存儲、查詢、校驗等操做,是一個集中式的數據託管中心,託管的內容包含全部的軟硬件資產(configuration items)。各個部門各個團隊各個系統下屬的各類重要的軟硬件資產都屬於CMDB統一管理的內容。ios

公司運維現狀

資產現狀git

全國各地區內網不互通。這個就是現狀了,由於公司產品是爲國家服務,因此全國各地的環境都在各自的內網中,安全性極高,在這種狀況下,每一個地區都配置了幾個運維手工維護當地的環境,內外網徹底隔離。程序員

運維狀況現狀sql

因爲公司資產地域分散且網絡不互通,所以公司的自動化運維程度基本爲0。總體上來講沒有運維開發的崗位,目前的運維仍然停留在人工運維結合shell腳本的時代,這些其實都算不上自動化運維,前段時間,開始搞ansible自動化部署和升級的事情,整個過程都是shell腳本完成。爲了控制人力成本,甚至否定一些用新技術。拿Python這門語言來講,自己很適合自動化運維,用於自動化升級那是再適合不過了,雖然底層會依賴shell,可是Python寫出來的邏輯必然會更清楚,可是上層考慮到後續維護人員須要掌握Python和shell兩種技術,最終仍是否認了Python,其實也就是否認了自動化運維。轉而幾種人員去研究日誌中心和nagios監控,自動化運維的事情也天然不了了之。shell

CMDB現狀

目前公司裏面尚未產生建設CMDB的萌芽,資產管理部門和運維中心團隊有本身的配置庫,也就是自建庫。可是並無將產品團隊的軟件資產列入配置管理的範圍。各個產品團隊使用Confluence文檔服務器或者Excel表格(這種狀況較多)管理本身的軟硬件資源,並稱之爲資源臺帳。就服務器而言,常常不知道一個ip對應的服務器是否正在使用,由誰使用,這些信息一無所知。若是各個團隊使用自建庫,而不是經過文檔形式來管理,那這種CMDB最多也只能算是各自爲政的CMDB,並非集中式的數據託管。數據庫

CMDB設計

最簡單的設計:一種配置一個表

好比,ip單獨成表,host單獨成表api

優勢:配置簡單直觀安全

缺點:一旦某種配置須要修改字段,就須要修改代碼,代碼維護成本過高服務器

複雜點的設計:列式數據存儲

表名,列名,列值,行分開存放到四張張表(schema, filed, value, entity)

  • schema:一個配置表在schema中就是一條記錄,記錄表的信息和描述。
  • field:每一列的列名和列相關的meta信息都存放在field表中。
  • entity:看成rowid使用,表示惟一衡量傳統意義上的一行數據。
  • value:存放每一條記錄的每一列的值,即一個entity和一個field既能夠肯定一個值。

表的設計以下圖:

整個設計的sql以下:

-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`schema`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`schema` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `desc` TEXT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`field`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`field` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `meta` TEXT NULL,
  `schema_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_field_schema_idx` (`schema_id` ASC),
  CONSTRAINT `fk_field_schema`
    FOREIGN KEY (`schema_id`)
    REFERENCES `mydb`.`schema` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`entity`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`entity` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `key` VARCHAR(45) NOT NULL,
  `schema_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_entity_schema1_idx` (`schema_id` ASC),
  CONSTRAINT `fk_entity_schema1`
    FOREIGN KEY (`schema_id`)
    REFERENCES `mydb`.`schema` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`value`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`value` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `value` TEXT NOT NULL,
  `field_id` INT NOT NULL,
  `entity_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_value_field1_idx` (`field_id` ASC),
  INDEX `fk_value_entity1_idx` (`entity_id` ASC),
  INDEX `ux_value` (`field_id` ASC, `entity_id` ASC),
  CONSTRAINT `fk_value_field1`
    FOREIGN KEY (`field_id`)
    REFERENCES `mydb`.`field` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_value_entity1`
    FOREIGN KEY (`entity_id`)
    REFERENCES `mydb`.`entity` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

數據庫查詢時須要提供(entity, schema, field, value)這樣一個四元組才能獲得結果。

優勢:在線定義,表有變更時不須要修改代碼,增長一列只須要向field表中插入一個字段。

缺點:複雜,增刪改查時須要同時操做多個表,對數據的約束須要在應用層去實現,須要本身封裝ORM,每一列的約束信息存放在field表的meta字段中。

更復雜的設計:數據多版本和回滾

增長數據多版本

CMDB存放的信息都是很是重要的信息,所以不容許修改數據,每一次修改數據都單獨增長一條記錄,這樣就能夠保證數據多版本。所以能夠增長一個snapshot快照表,用來存放各個歷史版本的數據。snapshot表的具體設計較複雜,暫不使用。

增長回滾

增長數據多版本以後對應的就能夠增長一個回滾的功能,多版本基礎上的回滾功能能夠參考git的實現。

CMDB使用結論

強烈反對大型集中式CMDB。CMDB團隊執行力不強,需求多變,短時間內看不到價值等多種緣由致使在大多數互聯網公司CMDB是沒法落地的,到目前爲止除了華爲也沒幾家公司能把CMDB落地直到發揮CMDB的價值(華爲都花了7年的時間,更別說別的公司了)。

若是必定要使用CMDB,那隻能使用分散式的各自爲政的,各個團隊使用各個團隊的自建庫,好比管IP庫的就專門設計IP庫,管帳號庫的就專門設計帳號庫,數據庫之間經過各自提供的api通信。可是分散式的缺點是從領導的角度看,看不到全局的數據,所以還須要作一個集中化的dashboard。

CMDB替代方案

CMDB在大多數互聯網公司不可行,所以不少公司都另闢蹊徑,好比一種方式經常使用的方式 Mesos

  • Mesos:託管於Apache下C++開發的開源分佈式資源管理系統

Mesos的調度框架能夠有多種語言開發,包括Python。


參考


記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!

resource-introduce

念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。

我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。

聽我說,進步多,程序人生一把梭

若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

wechat-platform-guide-attention

本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!

相關文章
相關標籤/搜索