胡世昊,连志鹏
(国网江西省电力公司九江供电分公司,江西九江 332000)
随着各行业对电能质量的重视程度越来越高和电能质量监测系统逐步普及,电能质量监测技术已经逐步向网络化、信息化、标准化方面发展,国内外电能质量监测系统发展十分迅速,在美国,电力士和美国电科院共同开发了PQView系统;新加坡也建立了十分成熟全国性的电能质量监测系统;在国内,江苏、广东、云南、河南等地也建立了多个监测点的电能质量监测系统,随着不同厂家设备不断加入,各种地市小监测系统、专题电能质量分析系统、省级主站系统都纷纷建立,实时数据的共享和传输出现瓶颈。例如让PMIS、GIS可视化系统快速获取电能质量实时数据或者不同电能质量厂家互相读取实时数据,面对快速更新和波形数据时响应速度是最大问题,目前很难达到同一地区所有电能质量分析平台的实时数据快速传输共享的要求。国内解决此类问题的主要方法是制定区域范围内的标准来规范系统,利用基于WebService的服务来完成,对于早期已经安装的系统重新执行新的规范,升级系统需要大量的资金和人力物力,而且重新开发新的规约需要很长时间的规范和调试,对于非电能质量系统需要读取电能质量系统数据的时候,制定的标准往往又很难满足响应时间和内容要求。本文提出了描述采用Memcached高性能的分布式的内存对象缓存系统,将电能质量常规的实时数据通过Memecached 进行内存映射和,快速的实现不同系统间的数据共享。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web 应用和快速交换的实时数据以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动系统的速度。Memcached基于一个存储键/值对的hashmap。并通过memcached 协议与守护进程通信。为了提高性能,memcached中保存的数据都存储在memcached 内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
memcached 是一套分布式的快取系统,memcached API 使用三十二位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached 通常只是当作快取系统使用,一般只用来接口快速变化的实时数据接口,memcached通信是基于文本行简单协议,在电能质量系统间通信时,可以使用web 调用、telnet 迅速读取数据。
许多分布式系统应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、系统显示延迟等重大影响。memcached一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态应用的速度、提高可扩展性。Memcached 目前已经广泛应用于具有国外mixi、hatena、Facebook、Vox等大型web系统中。随着Web和WebService服务等在电力系统中的广泛应用,系统间通讯、实时数据的快速交换无法避免。例如,电能质量监测系统中,当几百个监测点的三相电压、电流、谐波、功率、10周波实时波形等数据在系统间实现每3 s 实时交换,数据量十分庞大,势必引起通讯前置机、系统服务器的延迟,造成实时数据滞后。利用memcached 如何解决电能质量系统间大数据量实时交换问题是本文研究的主要内容。
如图1,采用memcache 映射固定的内存空间存储实时数据,并且按照固定周期如3 s 进行快速更新,不同厂家可以快速获取各自的时时数据。
图1 基于memcache电能质量系统架构
如图2,相对于各个厂家而言,自身系统既是客户端也是服务器端,自身利用分布式算法映射自身系统的数据,满足其它系统进行数据共享的要求。同时具有客户端,具备读取其它系统数据的功能。从而满足不同厂家、不同应用程序能快速交换和共享实时数据的要求。
图2 各厂家系统memcached的应用
memcached采取的内存映射来存储,在实际过程中与平台和开发语言无关,所有数据只需要知道键值和在内存大小即可。表1列举了部分电能质量数据的的信息,不同平台可以通过操作键值来快速交换数据。
表1 部分常规稳态数据定义
memcached 采取的内存映射来存储,在实际使用过程中与平台和开发语言无关,所有数据我们只需要知道键值和在映射内存占位大小即可,同时,所有电能质量数据在计算机系统中都不可能用整数来完整描述,必须用浮点数或浮点数序列来描述,如表1 中举例,A 相电压有效值,任何平台和开发语言直接读取32 位内存可以直接转换为实际的浮点数据。
如图3 体系结构相当容易理解。建立了一个Web 层,例如假设其中包括一些Apache 实例。下一层是应用程序本身。这一层通常运行于Apache Tomcat 或其他开源应用服务器之上。再下面一层是配置memcached 实例的地方,即应用服务器与数据库服务器之间。在使用这种配置时,需要采用稍微不同的方式来执行数据库的读取和写入操作。
图3 基于memcache应用程序体系架构
2.4.1 读操作
执行读取操作的顺序是从服务交互层如WEB层获取请求(需要执行一次数据库查询)并检查之前在缓存中存储的查询结果。如果我找到所需的值,则返回它。如果未找到,则执行查询并将结果存储在缓存中,然后再将结果返回给服务交互层。
2.4.2 写操作
将数据写入到数据库中时,首先需要执行数据库写入操作,然后将之前缓存的任何受此写入操作影响的结果设定为无效。此过程有助于防止缓存和数据库之间出现数据不一致性。
2.4.3 安装操作
Memcached相对而言安装非常简单,源文件也非常小比如我们获取版本为1.4.1 的版本文件,将其放入应用程序目录下,在代码中嵌入如下命令即可:
2.4.4 连接操作
上文已经简单描述过,所有不同系统既是客户端也是服务器端,不同系统之间都可以简单的通过telnet命令连接后,即可进行其他所有操作。
2.4.5 启动操作
会以守护程序的形式启动memcached,为其分配2GB 内存,并指定监听localhost,即端口11211(默认),实际操作过程中可以根据需要修改这些值。
2.4.6 常见命令
set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
add 命令仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。
replace命令仅当键已经存在时,replace 命令才会替换缓存中的键。
get 命令用于检索与之前添加的键值对相关的值。您将使用get 执行大多数检索操作。
delete 命令是delete。delete 命令用于删除memcached 中的任何现有值。
在某厂家系统中使用了memcached,现在需要将A相电压实时数据通过memcached共享其它系统:
如果使用set 命令正确设定了键值对,服务器将使用单词STORED 进行响应。示例向缓存中添加了一个键值对,其键为RMSVoltagePhaseA,如表1中描述,为A 相电压有效值,其值为5 948 V。并将过期时间设置为0,这将向memcached 通知希望将此值存储在缓存中直到删除它为止。
其它厂家系统需要读取此数据时,只需要连接memcached,通过命令get RMSVoltagePhaseA,若此值存在,不同开发平台将会返回不同约定的32位内存值,如本例中的5.948 kV电压有效值。
电能质量实时数据的浏览和共享在实际应用比较普遍,本文研究分布式缓存系统memcached 对实时数据快速共享和传输的作用,通过对比传统的WebService 服务等,memcached 具有响应速度快、减轻服务器负载、内存直接共享等优点,在电能质量监测系统中结合memcacahed 与通讯规约、数据库、操作系统、网络通讯的联系进行了深入研究并给出操作方案介绍,可直接应用于系统的开发和扩展中。
[1]南铁,李先国.基于.NET Cache+Memcached Web 缓存技术的研究与应用[J].科学技术与工程,2011,11(31)
[2]张志生,孔德红.PQDIF 规范在电能质量监测中的应用[J].南方电网技术,2009,3(S1):178-180.
[3]何秀月.电能质量在线监控技术的探讨[J].科技创新导报,2011,29(S1):178-180.
[4]许中,陈雁,李丝媛.广州电网电能质量在线监测系统及其高级应用[J].供用电,2012,29(S4).
[5]赵逸众,基于Web 的电能质量监测与诊断分析系统的研究[d].北京:华北电力大学电力系统及自动化200601(01).
[6]薛献鹏,彭明田,贺怀清.基于Memcached 的日历搜索引擎系统优化设计与实现[j].计算机应用2011,31(3).