國網(wǎng)寧夏電力有限公司信通公司 劉思堯 李雪松
安徽繼遠(yuǎn)軟件有限公司 李 昂
隨著公司“十三五”信息化規(guī)劃的總體推進(jìn),公司逐步建成和完善“兩級調(diào)控、三層檢修、一體化運行、全業(yè)務(wù)支撐”的信息通信運維體系(SG-ITOM3.0)。同時,公司完成了運行維護(hù)-信息通信一體化調(diào)度運行支撐平臺(I6000)(四期)的建設(shè),為公司電力信息運維工作提供了強(qiáng)大的支撐,保障了電網(wǎng)信息系統(tǒng)的穩(wěn)定運行、高效運轉(zhuǎn)、全面支撐公司生產(chǎn)經(jīng)營管理。在此期間,雖然電力信息通信技術(shù)得到了極快的發(fā)展,但是仍存在不足。支撐信息通信業(yè)務(wù)進(jìn)一步融合發(fā)展,提升信息通信的運維管理水平,本項目在信息通信一體化調(diào)度運行支撐平臺基礎(chǔ)上,研究信息通信運行數(shù)據(jù)自主采集、故障檢測、風(fēng)險預(yù)警、自動化運維及輔助決策等關(guān)鍵技術(shù),并開發(fā)原型系統(tǒng),通過構(gòu)建統(tǒng)一的信息通信融合模型和自主標(biāo)準(zhǔn)化采集框架,提出信息通信運行故障監(jiān)測與風(fēng)險預(yù)警算法,實現(xiàn)信息通信業(yè)務(wù)系統(tǒng)的智能運維和主動檢修,提高信息運維水平、提高信息通信運檢效率,保障信息通信系統(tǒng)的運行質(zhì)量和服務(wù)質(zhì)量。
隨著堅強(qiáng)智能電網(wǎng)建設(shè)深入開展,信息通信系統(tǒng)作為國家電網(wǎng)公司智能電網(wǎng)重要技術(shù)支撐和手段,面臨著新的問題和挑戰(zhàn),業(yè)務(wù)應(yīng)用需求主要表現(xiàn)在運行數(shù)據(jù)越來越繁雜多樣,運行管理必須從被動向主動轉(zhuǎn)變,提供科學(xué)智能的趨勢預(yù)測和主動預(yù)警,研究信息通信運行主動輔助決策技術(shù),實現(xiàn)信息系統(tǒng)運維及部署的自動化,特別是版本升級的部署自動化,將運維人員從機(jī)械的、枯燥的可自動化完成的工作中解放出來,有效提高信息系統(tǒng)運維效率,降低運維成本,提升運維服務(wù)的質(zhì)量,減少信息系統(tǒng)版本升級時帶來的風(fēng)險。
通過本項目的實施,進(jìn)一步支撐“兩級調(diào)度、三層檢修、一體化運行”的調(diào)運體系建設(shè)要求,實現(xiàn)對信息通信系統(tǒng)的集中管控、精益管理、高效運作,全面支撐堅強(qiáng)智能電網(wǎng)和“三集五大”管理體系建設(shè)。
本課題主要研究業(yè)務(wù)系統(tǒng)智能化運維關(guān)鍵技術(shù),包括研究信息系統(tǒng)版本自動升級的管理方法、技術(shù)規(guī)范;研究信息系統(tǒng)版本升級時數(shù)據(jù)庫腳本自動傳輸、執(zhí)行、回滾、執(zhí)行成功驗證技術(shù);研究信息系統(tǒng)程序的自動傳輸、部署、回退、部署成功驗證技術(shù);研究支撐信息系統(tǒng)多級部署的集中式版本自動升級管理技術(shù)平臺,集中管理各類信息通信系統(tǒng)的版本自動升級。
系統(tǒng)的總統(tǒng)架構(gòu)如下圖所示:
圖2 -1 系統(tǒng)總體架構(gòu)
通過系統(tǒng)的總體架構(gòu)設(shè)計,利用好Docker容器技術(shù)、自動構(gòu)建技術(shù)及Kubernetes技術(shù)實現(xiàn)應(yīng)用系統(tǒng)從開發(fā)、測試、部署到升級的全過程自動化。系統(tǒng)研發(fā)人員利用Docker容器實現(xiàn)代碼的快速更新和部署,測試人員利用Docker容器的易復(fù)制性,能時刻保持和開發(fā)環(huán)境的一致,及時反饋測試結(jié)果。利用自動代碼構(gòu)建工具保持代碼的持續(xù)發(fā)布,通過搭建鏡像服務(wù)器,將應(yīng)用系統(tǒng)代碼以鏡像的方式存儲在鏡像倉庫中,現(xiàn)場人員即可通過鏡像倉庫快速部署系統(tǒng),并利用Kubernetes技術(shù)實現(xiàn)對容器的集群化管理,快速地更新應(yīng)用、擴(kuò)展應(yīng)用節(jié)點,保持系統(tǒng)的高可用性。
數(shù)據(jù)架構(gòu)中數(shù)據(jù)技術(shù)分類和數(shù)據(jù)部署設(shè)計,分別解決每一方面的關(guān)鍵問題,同時又相互支撐,互為補(bǔ)充,形成一個統(tǒng)一、有機(jī)的整體數(shù)據(jù)架構(gòu)。數(shù)據(jù)技術(shù)分類和數(shù)據(jù)部署設(shè)計在數(shù)據(jù)模型的基礎(chǔ)上展開,按照不同的數(shù)據(jù)分類,結(jié)合系統(tǒng)架構(gòu)的要求進(jìn)行數(shù)據(jù)部署設(shè)計。
數(shù)據(jù)架構(gòu)分類設(shè)計是基于信息系統(tǒng)版本的自動升級處理實踐,從設(shè)計角度將信息系統(tǒng)升級所需要的數(shù)據(jù)進(jìn)行具體分類,并針對不同設(shè)計類別的數(shù)據(jù)特性采用不同的存儲方式和處理方式,以保證系統(tǒng)的處理性能、靈活性和可擴(kuò)展性。
在版本升級過程中,對于數(shù)據(jù)庫和程序很顯然需要考慮成功之后的驗證,以及未成功時的回退,尤其是回退如果不成功,將會影響到系統(tǒng)的正常訪問,這首先需要一套切實可行的規(guī)范的管理機(jī)制和流程,其次對于一個集中的版本管理平臺而言,如何統(tǒng)一規(guī)劃實現(xiàn)不同的信息通信系統(tǒng)通過數(shù)據(jù)庫腳本實現(xiàn)自動傳輸、執(zhí)行、回滾、執(zhí)行成功驗證,以及信息系統(tǒng)程序的自動傳輸、部署、回退、部署成功驗證,這是本科技課題的研究重點之一。
2.3.1 容器技術(shù)
Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux 機(jī)器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口。
Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器。Docker 容器通過 Docker 鏡像來創(chuàng)建。容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類。
Docker采用 C/S架構(gòu) Docker daemon 作為服務(wù)端接受來自客戶的請求,并處理這些請求(創(chuàng)建、運行、分發(fā)容器)。 客戶端和服務(wù)端既可以運行在一個機(jī)器上,也可通過 socket 或者RESTful API 來進(jìn)行通信。
Docker daemon 一般在宿主主機(jī)后臺運行,等待接收來自客戶端的消息。 Docker 客戶端則為用戶提供一系列可執(zhí)行命令,用戶用這些命令實現(xiàn)跟 Docker daemon 交互。
2.3.2 Linux Namespace
LXC所實現(xiàn)的隔離性主要是來自kernel的namespace, 其中pid,net, ipc, mnt, uts 等namespace將container的進(jìn)程, 網(wǎng)絡(luò), 消息, 文件系統(tǒng)和hostname 隔離開。
2.3.3 Control Groups
cgroups 實現(xiàn)了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似文件的接口,在 /cgroup目錄下新建一個文件夾即可新建一個group,在此文件夾中新建task文件,并將pid寫入該文件,即可實現(xiàn)對該進(jìn)程的資源控制。
2.3.4 AUFS
AUFS (AnotherUnionFS) 是一種 Union FS, 簡單來說就是支持將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)的文件系統(tǒng),更進(jìn)一步地,AUFS支持為每一個成員目錄(AKA branch)設(shè)定'readonly', 'readwrite' 和 'whiteout-able' 權(quán)限,同時AUFS里有一個類似分層的概念, 對 readonly 權(quán)限的branch可以邏輯上進(jìn)行修改(增量地,不影響readonly部分的)。通常 Union FS有兩個用途, 一方面可以實現(xiàn)不借助 LVM, RAID 將多個disk和掛在到一個目錄下,另一個更常用的就是將一個readonly的branch和一個writeable的branch聯(lián)合在一起,Live CD正是基于此可以允許在OS image不變的基礎(chǔ)上允許用戶在其上進(jìn)行一些寫操作。
Docker是Docker.Inc公司開源的一個基于輕量級虛擬化技術(shù)的容器引擎項目,整個項目基于Go語言開發(fā),并遵從Apache 2.0協(xié)議。通過分層鏡像標(biāo)準(zhǔn)化和內(nèi)核虛擬化技術(shù),Docker使得應(yīng)用開發(fā)者和運維工程師可以以統(tǒng)一的方式跨平臺發(fā)布應(yīng)用,并且以幾乎沒有額外開銷的情況下提供資源隔離的應(yīng)用運行環(huán)境。
鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角,下面的這張圖展示了鏡像的定義。
圖3 -1 鏡像示意圖
從左邊我們看到了多個只讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指針指向下一層。這些層是Docker內(nèi)部的實現(xiàn)細(xì)節(jié),并且能夠在主機(jī)(注:運行Docker的機(jī)器)的文件系統(tǒng)上訪問到。統(tǒng)一文件系統(tǒng)(union file system)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€文件系統(tǒng),為這些層提供了一個統(tǒng)一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統(tǒng)。 我們可以在圖片的右邊看到這個視角的形式。
(1)應(yīng)用封裝
應(yīng)用封裝采用Docker做為應(yīng)用容器引擎,Docker是輕量級虛擬化技術(shù),它在標(biāo)準(zhǔn)的LXC之上融合AUFS分層鏡像管理機(jī)制,并以應(yīng)用為單元進(jìn)行“集裝封箱”,實現(xiàn)的相關(guān)應(yīng)用封裝能力如下:
1)Docker容器技術(shù)可以部署應(yīng)用到可移植的的容器中,這些容器獨立于硬件、語言、框架、打包系統(tǒng),幫助實現(xiàn)持續(xù)集成與部署。一個標(biāo)準(zhǔn)的Docker容器包含一個軟件組件及其所有的依賴,包括二進(jìn)制文件、庫、配置文件、腳本等。
2)Docker容器可以封裝任何有效負(fù)載,可以在任何服務(wù)器之間進(jìn)行一致性運行。開發(fā)者構(gòu)建的應(yīng)用只需一次構(gòu)建即可多平臺運行。
(2)應(yīng)用鏡像管理
將應(yīng)用進(jìn)行封裝后,得到應(yīng)用鏡像,和基礎(chǔ)鏡像類似,需要對應(yīng)用鏡像進(jìn)行統(tǒng)一的管理。
Docker鏡像(Image)類似于虛擬機(jī)的鏡像,可以將他理解為一個面向Docker引擎的只讀模板,包含了文件系統(tǒng)。鏡像是創(chuàng)建Docker容器的基礎(chǔ),通過版本管理和增量的文件系統(tǒng),Docker提供了一套十分簡單的機(jī)制來創(chuàng)建和更新現(xiàn)有的鏡像。鏡像倉庫是Docker集中存放鏡像文件的場所。
用戶直接指定相關(guān)版本的應(yīng)用鏡像進(jìn)行部署或升級,成功后,對應(yīng)用的發(fā)布結(jié)果進(jìn)行驗證,對驗證不通過的應(yīng)用直接指定原版本鏡像進(jìn)行回滾和還原。整個升級過程就是對應(yīng)用鏡像的復(fù)制和運行,從而實現(xiàn)信息系統(tǒng)的快速部署,保證生產(chǎn)環(huán)境、測試環(huán)境和開發(fā)環(huán)境的一致。
應(yīng)用發(fā)布完成后,用戶可根據(jù)應(yīng)用的版本進(jìn)行升級或回滾,所用的kubernetes的命令為kubectl rolling-update。
kubectl rolling-update是一個非常重要的命令,對于已經(jīng)部署并且正在運行的業(yè)務(wù),rolling-update提供了不中斷業(yè)務(wù)的更新方式。rolling-update每次起一個新的pod,等新pod完全起來后刪除一個舊的pod,然后再起一個新的pod替換舊的pod,直到替換掉所有的pod。rolling-update需要確保新的版本有不同的name,Version和label,否則會報錯 。
應(yīng)用發(fā)布完成后,應(yīng)用的節(jié)點可根據(jù)需要或資源負(fù)荷進(jìn)行調(diào)節(jié),即為應(yīng)用的擴(kuò)容/縮容。所用的kubernetes的命令為kubectl scale。
Kubectl scale用于程序在負(fù)載加重或縮小時副本進(jìn)行擴(kuò)容或縮小,如前面創(chuàng)建的nginx有兩個副本,可以輕松的使用scale命令對副本數(shù)進(jìn)行擴(kuò)展或縮小。
圖3 -8 與I6000系統(tǒng)的集成
信息系統(tǒng)版本自動升級完成后,若需要對數(shù)據(jù)庫進(jìn)行相關(guān)升級,可首先對數(shù)據(jù)庫進(jìn)行備份,然后執(zhí)行升級腳本,對升級后的數(shù)據(jù)庫進(jìn)行驗證,若升級失敗,則利用數(shù)據(jù)庫備份文件進(jìn)行還原,實現(xiàn)數(shù)據(jù)庫的遠(yuǎn)程自動化升級。
由于自動化部署系統(tǒng)采用B/S結(jié)構(gòu),產(chǎn)品本身提供豐富的Webservice接口/JMS接口,通過接口調(diào)用的方式,可實現(xiàn)與I6000系統(tǒng)的數(shù)據(jù)集成。自動化部署系統(tǒng)還提供Webservice接口/JMS接口來提取/發(fā)布包括應(yīng)用系統(tǒng)信息、數(shù)據(jù)庫信息等在內(nèi)的數(shù)據(jù),自動化部署系統(tǒng)可通過調(diào)用相關(guān)接口來讀取I6000系統(tǒng)的基礎(chǔ)數(shù)據(jù)來實現(xiàn)同步與更新。
自動化部署系統(tǒng)對設(shè)備的管理有其自身的特點,初次進(jìn)行設(shè)備納管時需以I6000系統(tǒng)中資源管理模塊(CMDB)為準(zhǔn)提取IP、OS/IOS版本等基本配置信息。在日常運維中,系統(tǒng)定時進(jìn)行設(shè)備信息采集,則以系統(tǒng)所搜集設(shè)備信息為準(zhǔn),對I6000中資源管理模塊(CMDB)進(jìn)行同步與更新,對其數(shù)據(jù)項進(jìn)行補(bǔ)充與更新,從而保證信息的完整與準(zhǔn)確。
對基礎(chǔ)鏡像和應(yīng)用鏡像進(jìn)行版本管理。基礎(chǔ)鏡像主要用于存儲信息系統(tǒng)運行所需的運行時庫(如JRE、.NETFramework等)和中間件(Tomcat、Weblogic等)的鏡像文件;應(yīng)用鏡像主要用于存儲信息系統(tǒng)軟件的鏡像文件。
實現(xiàn)信息系統(tǒng)運維及部署的版本自動化升級部署,將運維人員從機(jī)械的、枯燥的可自動化完成的工作中解放出來,有效提高信息系統(tǒng)運維效率,降低運維成本,提升運維服務(wù)的質(zhì)量,減少信息系統(tǒng)版本升級時帶來的風(fēng)險。
工具化和標(biāo)準(zhǔn)化的運用程度是運維自動化發(fā)展水平提升的重要體現(xiàn),逐步構(gòu)建物理設(shè)備層、操作系統(tǒng)層、應(yīng)用服務(wù)層、運維操作層的標(biāo)準(zhǔn)運維體系,實現(xiàn)以下目標(biāo)∶
(1)運維自動化發(fā)展工具化:設(shè)計和利用各種小工具,促進(jìn)標(biāo)準(zhǔn)化的實施,將可重復(fù)的操作簡單化,將多次操作流程化,減少人為操作的低效,降低故障率。
(2)運維自動化發(fā)展web化:設(shè)計研發(fā)完善的運維工作平臺,具備完善的權(quán)限控制,完備的日志記錄,弱化流程,實現(xiàn)統(tǒng)一平臺,標(biāo)準(zhǔn)化作業(yè)。
(3)運維自動化發(fā)展服務(wù)化(api化):根據(jù)4層標(biāo)準(zhǔn)化運維體系,逐步設(shè)計和完善API,實現(xiàn)運維操作API化。
(4)運維自動化發(fā)展智能化:建立和完善觸發(fā)機(jī)制和決策系統(tǒng)(網(wǎng)絡(luò)神經(jīng)系統(tǒng)),初步實現(xiàn)智能化的自動擴(kuò)容、縮容、故障自愈等。
版本自動化升級僅僅是運維自動化發(fā)展的其中一點,更多的是以此為起點探索運維自動化發(fā)展的廣闊前景。運維自動化未來的發(fā)展方向是智能運維,隨著智能化技術(shù)的發(fā)展,智能運維的呼聲越來越高,目前國內(nèi)智能運維發(fā)展還處于一個探索階段,要想盡快在智能運維領(lǐng)域有所突破,首先要主抓好監(jiān)控系統(tǒng)和告警系統(tǒng),并利用機(jī)器學(xué)習(xí)算法進(jìn)行快速監(jiān)控和排障。智能運維的發(fā)展一定是一個長期演進(jìn)的過程,需要大量的投入和學(xué)習(xí)。