翟桂锋,徐 丹,钱 锋,夏 晨
(南京南瑞继保电气有限公司,江苏省南京市 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个数量级以上。
本文提出并实现了一种基于键值对存储的水电厂一体化数据中心全局编码系统,解决水电厂建立一体化数据中心时,各类业务应用的自动化系统由于设备命名和编码方式差异大,造成数据集成与互相操作困难的问题。水电厂一体化数据中心全局编码系统通过对各业务系统的对象进行全局命名和全局编码,为一体化数据中心和各系统提供统一的微服务接口,从技术上保证数据中心内对象命名和编码的标准化和一致性,为后续基于数据中心的大数据分析和智能化决策提供了先决条件。