本篇文章結合參考資料中的幾篇CMDB的文章再加上目前公司的現狀談一談CMDB。mysql
CMDB:configuration management database,配置管理數據庫。CMDB本質上是一個數據庫,提供數據的存儲、查詢、校驗等操做,是一個集中式的數據託管中心,託管的內容包含全部的軟硬件資產(configuration items)。各個部門各個團隊各個系統下屬的各類重要的軟硬件資產都屬於CMDB統一管理的內容。ios
資產現狀git
全國各地區內網不互通。這個就是現狀了,由於公司產品是爲國家服務,因此全國各地的環境都在各自的內網中,安全性極高,在這種狀況下,每一個地區都配置了幾個運維手工維護當地的環境,內外網徹底隔離。程序員
運維狀況現狀sql
因爲公司資產地域分散且網絡不互通,所以公司的自動化運維程度基本爲0。總體上來講沒有運維開發的崗位,目前的運維仍然停留在人工運維結合shell腳本的時代,這些其實都算不上自動化運維,前段時間,開始搞ansible自動化部署和升級的事情,整個過程都是shell腳本完成。爲了控制人力成本,甚至否定一些用新技術。拿Python這門語言來講,自己很適合自動化運維,用於自動化升級那是再適合不過了,雖然底層會依賴shell,可是Python寫出來的邏輯必然會更清楚,可是上層考慮到後續維護人員須要掌握Python和shell兩種技術,最終仍是否認了Python,其實也就是否認了自動化運維。轉而幾種人員去研究日誌中心和nagios監控,自動化運維的事情也天然不了了之。shell
目前公司裏面尚未產生建設CMDB的萌芽,資產管理部門和運維中心團隊有本身的配置庫,也就是自建庫。可是並無將產品團隊的軟件資產列入配置管理的範圍。各個產品團隊使用Confluence文檔服務器或者Excel表格(這種狀況較多)管理本身的軟硬件資源,並稱之爲資源臺帳。就服務器而言,常常不知道一個ip對應的服務器是否正在使用,由誰使用,這些信息一無所知。若是各個團隊使用自建庫,而不是經過文檔形式來管理,那這種CMDB最多也只能算是各自爲政的CMDB,並非集中式的數據託管。數據庫
好比,ip單獨成表,host單獨成表api
優勢:配置簡單直觀安全
缺點:一旦某種配置須要修改字段,就須要修改代碼,代碼維護成本過高服務器
表名,列名,列值,行分開存放到四張張表(schema, filed, value, entity)
表的設計以下圖:
整個設計的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的價值(華爲都花了7年的時間,更別說別的公司了)。
若是必定要使用CMDB,那隻能使用分散式的各自爲政的,各個團隊使用各個團隊的自建庫,好比管IP庫的就專門設計IP庫,管帳號庫的就專門設計帳號庫,數據庫之間經過各自提供的api通信。可是分散式的缺點是從領導的角度看,看不到全局的數據,所以還須要作一個集中化的dashboard。
CMDB在大多數互聯網公司不可行,所以不少公司都另闢蹊徑,好比一種方式經常使用的方式 Mesos
Mesos的調度框架能夠有多種語言開發,包括Python。
參考
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。
我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。
聽我說,進步多,程序人生一把梭
若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!