翟桂鋒,徐 丹,錢 鋒,夏 晨
(南京南瑞繼保電氣有限公司,江蘇省南京市 211102)
隨著智能電網(wǎng)建設(shè)的不斷深入,對水電廠運行的可靠性、源網(wǎng)協(xié)調(diào)能力及智能決策能力提出全新的要求[1]?,F(xiàn)有的水電廠自動化系統(tǒng)由于發(fā)展階段和技術(shù)條件限制,各類業(yè)務(wù)應(yīng)用系統(tǒng)的信息和數(shù)據(jù)相對獨立、一體化程度低、標準差異性大、信息孤島現(xiàn)象嚴重,將不同系統(tǒng)的數(shù)據(jù)進行整合,建立一體化的數(shù)據(jù)中心成為進行水電廠大數(shù)據(jù)分析和智能化決策的先決條件。但水電廠內(nèi)各系統(tǒng)對同一設(shè)備在命名和編碼方式上存在差異,必須通過全局統(tǒng)一的設(shè)備命名和編碼來保證各系統(tǒng)接入數(shù)據(jù)的一致性。
本文提出并實現(xiàn)了一種基于鍵值對存儲的水電廠一體化數(shù)據(jù)中心全局編碼系統(tǒng),用來管理水電廠各類業(yè)務(wù)系統(tǒng)中對象的全局命名和統(tǒng)一編碼,為數(shù)據(jù)中心和各業(yè)務(wù)系統(tǒng)提供統(tǒng)一的對象編碼、查詢、更改等操作服務(wù),從技術(shù)上保證數(shù)據(jù)中心內(nèi)對象全局命名和編碼的標準化、統(tǒng)一化,保證數(shù)據(jù)中心接入各業(yè)務(wù)系統(tǒng)數(shù)據(jù)的一致性,解決數(shù)據(jù)中心數(shù)據(jù)集成及各業(yè)務(wù)系統(tǒng)之間數(shù)據(jù)交互的問題。
水電數(shù)據(jù)中心編碼系統(tǒng)是水電廠一體化數(shù)據(jù)中心內(nèi)對象全局編碼的統(tǒng)一管理系統(tǒng),是實現(xiàn)水電廠內(nèi)各業(yè)務(wù)系統(tǒng)數(shù)據(jù)接入一致性的技術(shù)保證。其主要作用體現(xiàn)在兩個方面:一是不同系統(tǒng)內(nèi)的同一設(shè)備對象通過統(tǒng)一的全局編碼進行一一對應(yīng),數(shù)據(jù)中心全景建模時來源于不同應(yīng)用系統(tǒng)的模型可以更好地拼接和擴展,數(shù)據(jù)中心進行數(shù)據(jù)集成時也可將不同系統(tǒng)的數(shù)據(jù)根據(jù)設(shè)備對象的全局編碼進行數(shù)據(jù)聚合;二是各類業(yè)務(wù)系統(tǒng)間進行數(shù)據(jù)交互時,利用全局編碼標識同一個設(shè)備對象,有利于系統(tǒng)間的數(shù)據(jù)交互。
水電數(shù)據(jù)中心編碼系統(tǒng)的核心功能是對所有業(yè)務(wù)系統(tǒng)的對象進行全局編碼。為存儲全局編碼和實體對象的一對一映射關(guān)系,必須對實體對象進行全局唯一的標準化命名。當前,IEC61970標準已經(jīng)成為電力系統(tǒng)信息標準化的技術(shù)規(guī)范[2,3]。編碼系統(tǒng)對象的全局命名也遵循IEC61970標準中的CIM模型來實施。圖1是基于IEC61970標準構(gòu)建的水電廠監(jiān)控、水情監(jiān)視、水電調(diào)度等應(yīng)用系統(tǒng)設(shè)備對象和量測的層次結(jié)構(gòu)圖。
圖1 水電數(shù)據(jù)中心多應(yīng)用系統(tǒng)對象的層次結(jié)構(gòu)示意圖Fig.1 Hierarchical structure of objects from multiple systems in data center of hydropower plant
依據(jù)層次式的分類結(jié)構(gòu),水電數(shù)據(jù)中心對象的全局命名也呈現(xiàn)層次式方式。例如水電廠設(shè)備對象“中國長江電力股份有限公司成都梯級調(diào)度向家壩水電廠1號機組”的全局命名可定義為“長江電力/成都梯調(diào)/向家壩水電廠/#1機”。
鍵值對存儲是數(shù)據(jù)庫最簡單的組織方式,其結(jié)構(gòu)是一個“鍵-值”的集合。鍵值對存儲中鍵是全局唯一的。Redis是一個使用ANSI C編寫的開源、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對存儲數(shù)據(jù)庫,是目前最流行的鍵值對存儲數(shù)據(jù)庫[4]。Redis由一個鍵、值映射的字典構(gòu)成。Redis中值的類型不僅限于字符串,還支持抽象的數(shù)據(jù)類型,如字符串列表、無序不重復的字符串集合、有序不重復的字符串集合、鍵值都為字符串的哈希表等。
水電數(shù)據(jù)中心編碼系統(tǒng)存儲的核心數(shù)據(jù)是對象的全局命名和全局編碼,同一對象的全局命名和全局編碼在編碼系統(tǒng)內(nèi)保持唯一。此外,編碼系統(tǒng)還存儲對象的其他屬性如類型、編碼信息、編碼時間等。編碼系統(tǒng)的數(shù)據(jù)存儲方式如表1所示。
將全局命名和全局編碼設(shè)計為鍵,可以通過鍵的唯一性來保證對象的全局命名和全局編碼的唯一性。此外,對象的全局命名和全局編碼的互相映射關(guān)系也通過鍵值對的形式來保證,具體細節(jié)參考2.1的內(nèi)容。
表1 編碼系統(tǒng)的數(shù)據(jù)存儲方式Tab.1 Data storage method of the encoding system
根據(jù)水電一體化數(shù)據(jù)中心和各業(yè)務(wù)系統(tǒng)訪問編碼系統(tǒng)的需求,編碼系統(tǒng)提供了對象編碼、查詢、更改及刪除等相關(guān)操作接口。在水電一體化數(shù)據(jù)中心建立過程中,各業(yè)務(wù)系統(tǒng)通過編碼系統(tǒng)提供的接口,將本系統(tǒng)接入數(shù)據(jù)中心的所有模型對象進行統(tǒng)一編碼。數(shù)據(jù)中心通過統(tǒng)一的全局編碼接入各業(yè)務(wù)系統(tǒng)的數(shù)據(jù),對不同業(yè)務(wù)系統(tǒng)的數(shù)據(jù)進行聚合,為后續(xù)基于數(shù)據(jù)中心的數(shù)據(jù)挖掘和智能決策提供一致的數(shù)據(jù)模型和數(shù)據(jù)訪問方式。
水電一體化數(shù)據(jù)中心編碼系統(tǒng)基于Spring/Spring MVC框架[5]實現(xiàn)操作接口的微服務(wù)化,接口形式上采用HTTPS傳輸協(xié)議與JSON報文格式相結(jié)合的方式。微服務(wù)通用的接口形式易于數(shù)據(jù)中心和各業(yè)務(wù)系統(tǒng)進行改造和開發(fā)。微服務(wù)化使得對編碼系統(tǒng)的訪問更加靈活、方便,開放性和通用性更好。同時,微服務(wù)架構(gòu)的輕量級、易擴展的特性,使得編碼系統(tǒng)在并發(fā)訪問和彈性擴展上更具優(yōu)勢,易于承載更高數(shù)據(jù)量級的對象數(shù)據(jù)。
全局命名和全局編碼都通過鍵值對存儲的鍵的唯一性來保證其唯一性。因此,在鍵值對存儲中存在著以全局命名為鍵和以全局編碼為鍵的兩個鍵值對數(shù)據(jù),而這兩個鍵值對數(shù)據(jù)的值實際上對應(yīng)的是同一個對象的數(shù)據(jù)。
為了避免對象數(shù)據(jù)重復和不一致,在具體的存儲設(shè)計時,對象的完整數(shù)據(jù)只存儲在以全局編碼為鍵對應(yīng)的值數(shù)據(jù)中,以全局命名為鍵對應(yīng)的值數(shù)據(jù)中只保存對象的全局編碼。同時,為了能夠從全局編碼直接查詢到全局命名,全局命名也作為對象的屬性之一,存儲于全局編碼為鍵對應(yīng)的值數(shù)據(jù)中。具體的鍵值對映射關(guān)系示意如圖2所示。
圖2 全局命名和全局編碼的映射關(guān)系示意圖Fig.2 Mappings between global name and global ID
原子服務(wù)是提供數(shù)據(jù)和業(yè)務(wù)邏輯的一個最小的單元。根據(jù)編碼系統(tǒng)的特點,將編碼系統(tǒng)提供的注冊、查詢、刪除和更新操作進行原子化,形成注冊原子服務(wù)、查詢原子服務(wù)、刪除原子服務(wù)和更新原子服務(wù),并基于Spring/Spring MVC框架實現(xiàn)微服務(wù)化。
微服務(wù)的優(yōu)勢在于通過彈性擴展支持大量并發(fā)訪問。在編碼系統(tǒng)提供的四個原子服務(wù)中,查詢服務(wù)是無狀態(tài)的,可以直接進行擴展。而注冊服務(wù)、刪除服務(wù)和更新服務(wù)是有狀態(tài)的,必須要保證這些有狀態(tài)的服務(wù)能夠按照服務(wù)調(diào)用的順序先后執(zhí)行。為了解決這一問題,在實現(xiàn)過程中,本文基于Redis的SETNX命令實現(xiàn)了一個分布式鎖。通過分布式鎖的獲取和釋放,解決了有狀態(tài)服務(wù)調(diào)用的串行化。
全局編碼重用指當某個對象刪除后,同樣全局命名的對象再次編碼時重用原有的全局編碼。這就要求在編碼系統(tǒng)在處理對象刪除時,對象全局名和全局編碼的對應(yīng)關(guān)系必須被保留。因此,編碼系統(tǒng)引入一個狀態(tài)標記位,用來標記對象是否為停用狀態(tài)。當對象被編碼時,狀態(tài)標記位被置為“啟用”;當對象被刪除后,狀態(tài)標記位被置為“停用”。
狀態(tài)標記位作為一個新屬性,存儲于鍵值對存儲的對象數(shù)據(jù)中。
基于上述研究,本文依托開源軟件Redis作為鍵值對存儲,基于Spring/Spring MVC框架實現(xiàn)了一個水電數(shù)據(jù)中心的編碼系統(tǒng)。
3.1.1 存儲設(shè)計
根據(jù)1.2和2.1的內(nèi)容所述,以電廠設(shè)備對象“中國長江電力股份有限公司成都梯級調(diào)度向家壩水電廠1號機組”為例,設(shè)計如下的鍵值對存儲方案:
全局命名的鍵值對
鍵:字符串“GlobalName/長江電力/成都梯調(diào)/向家壩水電廠/#1機”
值:字符串“026301170000401126”
全局編碼的鍵值對
鍵:字符串“GlobalID/026301170000401126”
表2 全局編碼鍵值對的值中哈希表的內(nèi)容Tab.2 Contents of the hash table as the value of the KV pair
值:哈希表,其內(nèi)容如表2所示例,對象數(shù)據(jù)中的屬性并不限于表中所示的哈希鍵值。
通過在鍵的字符串中增加“GlobalName”和“GlobaID”的前綴,可以避免命名和編碼在極端情況下重復,引發(fā)系統(tǒng)異常。
3.1.2 高可用設(shè)計和備份機制
在高可用方面,鍵值對存儲通過Redis集群方式進行部署。Redis集群存在多個實例和數(shù)據(jù)端口,客戶端請求對應(yīng)的數(shù)據(jù),如果被請求的實例中沒有對應(yīng)的數(shù)據(jù),該請求會轉(zhuǎn)發(fā)給對應(yīng)的實例來處理。Redis集群通過Gossip協(xié)議同步節(jié)點信息。
為了提高編碼系統(tǒng)的可用性,編碼系統(tǒng)通過自定義腳本的方式實現(xiàn)定時數(shù)據(jù)備份,備份方式默認按照最近三天、最近一周、最近一月的方式進行數(shù)據(jù)全備份。備份的數(shù)據(jù)通過JSON文件的方式存放在磁盤上,可用于編碼系統(tǒng)的數(shù)據(jù)恢復和數(shù)據(jù)遷移。
采用模擬某水電站的水電監(jiān)控系統(tǒng)、水情水調(diào)系統(tǒng)的對象作為數(shù)據(jù)來源進行測試。水電數(shù)據(jù)中心模擬編碼系統(tǒng)運行在華為FusionCube云平臺的兩臺虛擬機上,配置均為8核2.4G,內(nèi)存32G,操作系統(tǒng)為RHEL7.3,測試程序運行在一臺HPZ400工作站上,機器配置為雙核2.4G,內(nèi)存8G,操作系統(tǒng)RHEL7.3。
3.2.1 功能測試
功能測試主要驗證水電數(shù)據(jù)中心編碼系統(tǒng)的功能是否達到預期目標。通過分別對水電監(jiān)控系統(tǒng)、水情水調(diào)系統(tǒng)的對象進行編碼、查詢、更改、刪除等一系列測試,證實基于鍵值對存儲的水電數(shù)據(jù)中心編碼系統(tǒng)可以根據(jù)對象的信息進行統(tǒng)一命名和編碼,并提供相應(yīng)的接口供不同業(yè)務(wù)系統(tǒng)進行編碼、查詢等功能,解決多業(yè)務(wù)系統(tǒng)的數(shù)據(jù)互操作問題。
3.2.2 性能測試
理論上,基于鍵值對存儲構(gòu)建的編碼系統(tǒng),其查詢速度比傳統(tǒng)的關(guān)系數(shù)據(jù)庫要快上幾個數(shù)量級。為便于性能對比,本文以相同的數(shù)據(jù)來源,基于MySQL實現(xiàn)了一個編碼系統(tǒng)原型。該原型系統(tǒng)使用關(guān)系數(shù)據(jù)庫的外鍵機制來描述對象的層次關(guān)系,通過視圖的方式進行多表訪問。
模擬某水電站的水電監(jiān)控系統(tǒng)、水情水調(diào)系統(tǒng)共約100萬對象數(shù)據(jù)的存儲條件下,進行10萬次查詢重復實驗,求得平均時間對比如表3所示。
表3 編碼系統(tǒng)的性能測試Tab.3 Performance of the encoding system
為了精準測試編碼系統(tǒng)存儲的性能,微服務(wù)相關(guān)的額外時間開銷均未計入測試結(jié)果。實驗證明,基于鍵值對存儲的編碼系統(tǒng)比基于MySQL的編碼系統(tǒng)查詢操作快了大約1個數(shù)量級以上。
本文提出并實現(xiàn)了一種基于鍵值對存儲的水電廠一體化數(shù)據(jù)中心全局編碼系統(tǒng),解決水電廠建立一體化數(shù)據(jù)中心時,各類業(yè)務(wù)應(yīng)用的自動化系統(tǒng)由于設(shè)備命名和編碼方式差異大,造成數(shù)據(jù)集成與互相操作困難的問題。水電廠一體化數(shù)據(jù)中心全局編碼系統(tǒng)通過對各業(yè)務(wù)系統(tǒng)的對象進行全局命名和全局編碼,為一體化數(shù)據(jù)中心和各系統(tǒng)提供統(tǒng)一的微服務(wù)接口,從技術(shù)上保證數(shù)據(jù)中心內(nèi)對象命名和編碼的標準化和一致性,為后續(xù)基于數(shù)據(jù)中心的大數(shù)據(jù)分析和智能化決策提供了先決條件。