翟桂鋒,徐 丹,錢 鋒,夏 晨
(南京南瑞繼保電氣有限公司,江蘇省南京市 211102)
隨著智能電網建設的不斷深入,對水電廠運行的可靠性、源網協調能力及智能決策能力提出全新的要求[1]。現有的水電廠自動化系統由于發展階段和技術條件限制,各類業務應用系統的信息和數據相對獨立、一體化程度低、標準差異性大、信息孤島現象嚴重,將不同系統的數據進行整合,建立一體化的數據中心成為進行水電廠大數據分析和智能化決策的先決條件。但水電廠內各系統對同一設備在命名和編碼方式上存在差異,必須通過全局統一的設備命名和編碼來保證各系統接入數據的一致性。
本文提出并實現了一種基于鍵值對存儲的水電廠一體化數據中心全局編碼系統,用來管理水電廠各類業務系統中對象的全局命名和統一編碼,為數據中心和各業務系統提供統一的對象編碼、查詢、更改等操作服務,從技術上保證數據中心內對象全局命名和編碼的標準化、統一化,保證數據中心接入各業務系統數據的一致性,解決數據中心數據集成及各業務系統之間數據交互的問題。
水電數據中心編碼系統是水電廠一體化數據中心內對象全局編碼的統一管理系統,是實現水電廠內各業務系統數據接入一致性的技術保證。其主要作用體現在兩個方面:一是不同系統內的同一設備對象通過統一的全局編碼進行一一對應,數據中心全景建模時來源于不同應用系統的模型可以更好地拼接和擴展,數據中心進行數據集成時也可將不同系統的數據根據設備對象的全局編碼進行數據聚合;二是各類業務系統間進行數據交互時,利用全局編碼標識同一個設備對象,有利于系統間的數據交互。
水電數據中心編碼系統的核心功能是對所有業務系統的對象進行全局編碼。為存儲全局編碼和實體對象的一對一映射關系,必須對實體對象進行全局唯一的標準化命名。當前,IEC61970標準已經成為電力系統信息標準化的技術規范[2,3]。編碼系統對象的全局命名也遵循IEC61970標準中的CIM模型來實施。圖1是基于IEC61970標準構建的水電廠監控、水情監視、水電調度等應用系統設備對象和量測的層次結構圖。

圖1 水電數據中心多應用系統對象的層次結構示意圖Fig.1 Hierarchical structure of objects from multiple systems in data center of hydropower plant
依據層次式的分類結構,水電數據中心對象的全局命名也呈現層次式方式。例如水電廠設備對象“中國長江電力股份有限公司成都梯級調度向家壩水電廠1號機組”的全局命名可定義為“長江電力/成都梯調/向家壩水電廠/#1機”。
鍵值對存儲是數據庫最簡單的組織方式,其結構是一個“鍵-值”的集合。鍵值對存儲中鍵是全局唯一的。Redis是一個使用ANSI C編寫的開源、支持網絡、基于內存、可選持久性的鍵值對存儲數據庫,是目前最流行的鍵值對存儲數據庫[4]。Redis由一個鍵、值映射的字典構成。Redis中值的類型不僅限于字符串,還支持抽象的數據類型,如字符串列表、無序不重復的字符串集合、有序不重復的字符串集合、鍵值都為字符串的哈希表等。
水電數據中心編碼系統存儲的核心數據是對象的全局命名和全局編碼,同一對象的全局命名和全局編碼在編碼系統內保持唯一。此外,編碼系統還存儲對象的其他屬性如類型、編碼信息、編碼時間等。編碼系統的數據存儲方式如表1所示。
將全局命名和全局編碼設計為鍵,可以通過鍵的唯一性來保證對象的全局命名和全局編碼的唯一性。此外,對象的全局命名和全局編碼的互相映射關系也通過鍵值對的形式來保證,具體細節參考2.1的內容。

表1 編碼系統的數據存儲方式Tab.1 Data storage method of the encoding system
根據水電一體化數據中心和各業務系統訪問編碼系統的需求,編碼系統提供了對象編碼、查詢、更改及刪除等相關操作接口。在水電一體化數據中心建立過程中,各業務系統通過編碼系統提供的接口,將本系統接入數據中心的所有模型對象進行統一編碼。數據中心通過統一的全局編碼接入各業務系統的數據,對不同業務系統的數據進行聚合,為后續基于數據中心的數據挖掘和智能決策提供一致的數據模型和數據訪問方式。
水電一體化數據中心編碼系統基于Spring/Spring MVC框架[5]實現操作接口的微服務化,接口形式上采用HTTPS傳輸協議與JSON報文格式相結合的方式。微服務通用的接口形式易于數據中心和各業務系統進行改造和開發。微服務化使得對編碼系統的訪問更加靈活、方便,開放性和通用性更好。同時,微服務架構的輕量級、易擴展的特性,使得編碼系統在并發訪問和彈性擴展上更具優勢,易于承載更高數據量級的對象數據。
全局命名和全局編碼都通過鍵值對存儲的鍵的唯一性來保證其唯一性。因此,在鍵值對存儲中存在著以全局命名為鍵和以全局編碼為鍵的兩個鍵值對數據,而這兩個鍵值對數據的值實際上對應的是同一個對象的數據。
為了避免對象數據重復和不一致,在具體的存儲設計時,對象的完整數據只存儲在以全局編碼為鍵對應的值數據中,以全局命名為鍵對應的值數據中只保存對象的全局編碼。同時,為了能夠從全局編碼直接查詢到全局命名,全局命名也作為對象的屬性之一,存儲于全局編碼為鍵對應的值數據中。具體的鍵值對映射關系示意如圖2所示。

圖2 全局命名和全局編碼的映射關系示意圖Fig.2 Mappings between global name and global ID
原子服務是提供數據和業務邏輯的一個最小的單元。根據編碼系統的特點,將編碼系統提供的注冊、查詢、刪除和更新操作進行原子化,形成注冊原子服務、查詢原子服務、刪除原子服務和更新原子服務,并基于Spring/Spring MVC框架實現微服務化。
微服務的優勢在于通過彈性擴展支持大量并發訪問。在編碼系統提供的四個原子服務中,查詢服務是無狀態的,可以直接進行擴展。而注冊服務、刪除服務和更新服務是有狀態的,必須要保證這些有狀態的服務能夠按照服務調用的順序先后執行。為了解決這一問題,在實現過程中,本文基于Redis的SETNX命令實現了一個分布式鎖。通過分布式鎖的獲取和釋放,解決了有狀態服務調用的串行化。
全局編碼重用指當某個對象刪除后,同樣全局命名的對象再次編碼時重用原有的全局編碼。這就要求在編碼系統在處理對象刪除時,對象全局名和全局編碼的對應關系必須被保留。因此,編碼系統引入一個狀態標記位,用來標記對象是否為停用狀態。當對象被編碼時,狀態標記位被置為“啟用”;當對象被刪除后,狀態標記位被置為“停用”。
狀態標記位作為一個新屬性,存儲于鍵值對存儲的對象數據中。
基于上述研究,本文依托開源軟件Redis作為鍵值對存儲,基于Spring/Spring MVC框架實現了一個水電數據中心的編碼系統。
3.1.1 存儲設計
根據1.2和2.1的內容所述,以電廠設備對象“中國長江電力股份有限公司成都梯級調度向家壩水電廠1號機組”為例,設計如下的鍵值對存儲方案:
全局命名的鍵值對
鍵:字符串“GlobalName/長江電力/成都梯調/向家壩水電廠/#1機”
值:字符串“026301170000401126”
全局編碼的鍵值對
鍵:字符串“GlobalID/026301170000401126”

表2 全局編碼鍵值對的值中哈希表的內容Tab.2 Contents of the hash table as the value of the KV pair
值:哈希表,其內容如表2所示例,對象數據中的屬性并不限于表中所示的哈希鍵值。
通過在鍵的字符串中增加“GlobalName”和“GlobaID”的前綴,可以避免命名和編碼在極端情況下重復,引發系統異常。
3.1.2 高可用設計和備份機制
在高可用方面,鍵值對存儲通過Redis集群方式進行部署。Redis集群存在多個實例和數據端口,客戶端請求對應的數據,如果被請求的實例中沒有對應的數據,該請求會轉發給對應的實例來處理。Redis集群通過Gossip協議同步節點信息。
為了提高編碼系統的可用性,編碼系統通過自定義腳本的方式實現定時數據備份,備份方式默認按照最近三天、最近一周、最近一月的方式進行數據全備份。備份的數據通過JSON文件的方式存放在磁盤上,可用于編碼系統的數據恢復和數據遷移。
采用模擬某水電站的水電監控系統、水情水調系統的對象作為數據來源進行測試。水電數據中心模擬編碼系統運行在華為FusionCube云平臺的兩臺虛擬機上,配置均為8核2.4G,內存32G,操作系統為RHEL7.3,測試程序運行在一臺HPZ400工作站上,機器配置為雙核2.4G,內存8G,操作系統RHEL7.3。
3.2.1 功能測試
功能測試主要驗證水電數據中心編碼系統的功能是否達到預期目標。通過分別對水電監控系統、水情水調系統的對象進行編碼、查詢、更改、刪除等一系列測試,證實基于鍵值對存儲的水電數據中心編碼系統可以根據對象的信息進行統一命名和編碼,并提供相應的接口供不同業務系統進行編碼、查詢等功能,解決多業務系統的數據互操作問題。
3.2.2 性能測試
理論上,基于鍵值對存儲構建的編碼系統,其查詢速度比傳統的關系數據庫要快上幾個數量級。為便于性能對比,本文以相同的數據來源,基于MySQL實現了一個編碼系統原型。該原型系統使用關系數據庫的外鍵機制來描述對象的層次關系,通過視圖的方式進行多表訪問。
模擬某水電站的水電監控系統、水情水調系統共約100萬對象數據的存儲條件下,進行10萬次查詢重復實驗,求得平均時間對比如表3所示。

表3 編碼系統的性能測試Tab.3 Performance of the encoding system
為了精準測試編碼系統存儲的性能,微服務相關的額外時間開銷均未計入測試結果。實驗證明,基于鍵值對存儲的編碼系統比基于MySQL的編碼系統查詢操作快了大約1個數量級以上。
本文提出并實現了一種基于鍵值對存儲的水電廠一體化數據中心全局編碼系統,解決水電廠建立一體化數據中心時,各類業務應用的自動化系統由于設備命名和編碼方式差異大,造成數據集成與互相操作困難的問題。水電廠一體化數據中心全局編碼系統通過對各業務系統的對象進行全局命名和全局編碼,為一體化數據中心和各系統提供統一的微服務接口,從技術上保證數據中心內對象命名和編碼的標準化和一致性,為后續基于數據中心的大數據分析和智能化決策提供了先決條件。