新能源监控系统海量终端接入技术研究
2018-11-21冯利虎易永辉陈海龙张玉宝
冯利虎,易永辉,时 谊,陈海龙,张玉宝,张 倩,王 刚
(许继集团有限公司,河南 许昌 461000)
0 引言
随着传统石化能源危机和环境污染两大问题日益严重,大力发展清洁、可再生新能源已成为世界各国共识。风电、光伏作为新型绿色无污染的能源也越来越受到人们的青睐,装机规模及占比在不断增大[1-4]。
新能源电站建设规模不断扩大,特别是大型光伏、分布式光伏电站加速发展,接入新能源监控/集控系统的数据量及终端数量也在不断增多[5]。如100 MW大型地面光伏电站考虑到光伏区汇流箱设备的通信接入,全站设备数量将超过2 000台;同样监控数百个分布式光伏站点的远程监控/集控中心,终端设备的数量也数以千计。常规监控系统的容量及架构设计已无法满足新能源领域大量终端的接入需求。
本文介绍了监控系统海量终端接入的关键技术,并给出了具体的实现方案。
1 海量终端接入关键技术
针对新能源监控系统海量终端接入的需求,必须解决以下两个关键问题。
①海量终端接入系统的网络负载均衡策略[6-8]。
为了更好地解决因海量终端接入而带来的一系列高并发、潮涌式堵塞等问题,需要一种新的网络负载均衡算法处理网络连接问题。在前置服务器上搭建EPOLL模型,对交互数据进行处理[9-10];增加前置机调度模块,负责前置机和后台应用的数据处理。
②海量终端通信连接管理方法研究。
为了更好地解决目前大量终端接入而带来的通信连接管理和前置机模块资源消耗等问题,研究采用一种新的Socket管理方法。在通信管理机模块上采用多线程管理终端以及业务服务器连接,线程内以循环方式管理多个Socket。
2 实现方案
2.1 海量终端接入系统的网络负载均衡策略
利用现有的集群服务器技术,修改针对网络连接的网络负载均衡算法,对并发连接进行合适的分流,在网络负载均衡器上增加客户端连接的迁移算法,实现前置机服务器的故障迁移和柔性扩容;增加前置机调度模块完成报文准确下发到终端,分担和缓解前置机服务器负载;在前置机服务器搭建EPOLL模块进行数据流处理。该方案可解决海量终端连接时的高并发和拥堵的“瓶颈”。
①前置机调度模块。该模块用于连接后台应用模块和前置机集群,主要作用是把前置机的解析数据发送到相应的后台应用模块中;同时根据关联关系,把下行数据准确发送至终端。在本模块中,保存终端网络信息和前置机服务器网络信息的关联结构图,并响应前置机的关联修改请求。
②前置机集群。它由N台相互独立、通过高速网络互联的计算机构成一个组,并对单一系统模式加以管理,可以提高服务器性能、降低成本、提高可扩展性、增强可靠性。本方案中采用的是负载均衡集群。
③网络负载均衡器。网络负载均衡器对终端连接按现有前置机集群的处理能力进行分流,负载均衡策略按照“阈值轮循+动态负载反馈”的方法,扩展网络连接吞吐量,加强前置机数据处理能力。在本方案中,网络负载均衡器中运行状态机和前置机服务器的状态机进行呼应;处理故障时,Socket的迁移及扩容时前置机服务器的负载分流。
终端数据连接如图1所示。
图1 终端数据连接图
本方案涉及以下三个关键点。
其一,网络负载均衡器的实现算法。针对客户端连接分流均衡算法,先设定前置服务器上可连接的客户端个数,将连接请求依次顺序循环地连接到每个允许连接的服务器上;当连接数达到设定的阈值时,根据各个前置服务器的实时负载情况进行适当的分配。前置服务器的实时负载由位于前置服务器的性能监测软件经过集群间的“心跳”专用线传输。另外,采用一定的算法处理故障迁移和扩容时的负载均衡。
其二,前置服务器的数据处理算法。在前置机对数据流进行处理时,采用EPOLL模型。EPOLL模型主要负责对大量并发用户的请求进行及时处理,完成服务器与客户端的数据交互。其具体的实现步骤如下。
①使用EPOLL_create()函数创建文件描述,设定可管理的最大Socket描述符数目。
②创建与EPOLL关联的接收线程,应用程序可以创建多个接收线程来处理Epoll上的读通知事件,线程的数量依赖于程序的具体需要和设备环境。
③创建一个侦听Socket描述符ListenSock;将该描述符设定为非阻塞模式,调用Listen()函数在套接字上侦听有无新的连接请求。在 epoll_event结构中设置要处理的事件类型EPOLLIN,工作方式为epoll_ET,以提高工作效率,同时使用epoll_ctl()注册事件,最后启动网络监视线程。
④创建本地文件,对数据接收链表溢出数据进行本地缓存。
⑤网络监视线程启动循环,epoll_wait()等待epoll事件发生。
⑥如果Epoll事件表明有新的连接请求,则调用accept()函数,将客户端Socket描述符添加到epoll_data联合体,同时设定该描述符为非阻塞,并在epoll_event结构中设置要处理的事件类型为读和写,工作方式为epoll_ET。
⑦如果Epoll事件表明Socket描述符上有数据可读,则将该Socket描述符加入可读队列,通知接收线程读入数据,并将接收到的数据放入到接收数据的链表中。经逻辑处理后,将反馈的数据包放入到发送数据链表中,等待由发送线程发送。
其三,前置机调度模块。前置机调度模块保存前置机携带终端IP信息和本机IP地址的注册关联表,在下行数据传输时,前置机调度模块根据终端信息,在注册关联表中找到对应的前置服务器,并把下行数据传输到该前置服务器上进行报文组装和下发。当发生Socket迁移时,前置机调度模块接收上行的更改命令对注册关联表进行修改。 基于IP的终端设备发起连接请求到网络负载均衡器,由网络负载均衡器根据“阈值轮循+动态负载反馈”算法将所有的连接请求分发到前置集群中的各个前置服务器,客户端TCP连接至前置机分配如图2所示。
图2 客户端TCP连接至前置机分配图
分发的原则是依据前置服务器的连接数据和实时负载情况,并由各个前置服务器和终端建立通信链路。Socket客户端建立后的数据流如图3所示。此时,网络负载均衡器保存各个终端的连接信息,并只对链路的连接情况进行监测。
前置服务器每建立一个客户端请求连接,则要在前置机调度模块上注册相应的连接信息。假如终端IP地址为10.100.100.202,经网络负载均衡器分配到IP地址为10.100.100.104的前置服务器上。在连接请求建立后,前置服务器把连接信息注册到前置机调度模块上,即在前置机调度模块上新增IP地址为10.100.100.104和10.100.100.202的关系对。当有上行数据传输时,经前置服务器解析处理后直接上传到后台应用模块;当有下行数据时传输,由后台应用模块把待发送的数据和终端信息发送到前置机调度模块。前置机调度模块根据终端信息查找到该终端通信的前置服务器,并经由查找到的前置服务器对数据组装格式化后下发到相应终端。
图3 客户端SOCKET建立后的数据流向图
前置服务器处理连接和数据流的具体步骤如下。
①在前置服务器上建立一定数量的线程,并由线程池统一管理。
②当客户端进行连接时,由主线程对此连接建立通信并把该客户端加入到EPOLL监视事件中。
③当EPOLL监测到某连接有可读事件时,通知接收线程进行数据读取,并判断数据接收链表长度是否到达最大值。如果未达到最大值,把读到的数据插入到链表中;否则把读到的数据以本地文件的形式进行缓存,并等待文件操作线程处理本地文件。
④数据处理线程不断地从数据接收链表中取出数据进行解析、处理;当有下行数据命令时,数据处理线程直接把数据保存到数据发送链表中等待处理。
⑤数据发送线程检测到待发送链表中有数据时,从中取出数据,经由数据处理线程组装格式化处理后,下发到前置机调度模块进行分发。
本方案针对基于IP端点的海量终端数据通信时的接入“瓶颈”,改进采集系统的框架模块,解决了大规模连接时的高并发和拥堵问题。
2.2 海量终端通信连接管理方法
目前,终端与主站系统的通信建立机制一般为:主站系统的前置机模块与终端建立Socket连接,新建与之对应的线程用于Socket的维护、管理,并处理Socket数据收发;终端断开连接时,销毁与之对应的管理线程,回收系统资源。在本方案中,由于每个终端具有独立的IP地址,应用服务平台和终端将进行端到端直接通信,因此前置机模块将面临更大的接入压力,前置机模块管理海量通信链路连接的能力和稳定性,将严重影响整个系统的可靠性、实时性和扩展性。
为解决该问题,本文采用如下方案。
①终端的多线程分类管理。
通信管理机每个线程内包含两个动态数组连界栈(预登陆连接栈和已登录连接栈)。前置机模块采用多线程方式来分类管理所接入的不同类型终端以及其他业务服务器的Socket连接。每个管理线程可以管理多个Socket连接。
②管理线程内对Socket连接采用循环管理方式。
登录成功的终端,依据终端类型和管理线程的负载情况分配Socket至最优管理线程,存放于预登陆连接栈中;单个线程最多能够管理64个Socket。若现有线程的Socket管理数已满,则新建管理线程;若登录失败或是断开连接,则判定为无效Socket被剔除。各管理线程把Socket信息从预登陆连接栈取出,并存入已登录连接栈进行处理,检测各个Socket是否有事件(数据接收、数据发送)发生,然后循环处理各Socket的事件。其关键点在于管理线程内循环处理各个Socket的事件。
③无效Socket的检测和剔除。
当终端接入时,首先分配至未注册管理线程,在规定时限内完成登录过程后,依据终端类型分配Socket至最优管理线程,未能完成登录过程的Socket则视为无效Socket被剔除;前置系统与Socket建立连接后,在各分类管理线程检测已登录连接栈中存放的Socket是否正常,剔除无效的Socket(退出登录或断线)。
这种连接管理方法的优点如下。
①采用终端的多线程分类管理,使得后台应用系统能够依据不同类型的终端(其数据类型、采集周期、报文数据格式等不同),采取相应的数据处理策略,简化后台应用系统数据处理过程。这样便于后台应用系统的升级和改造。
②每个线程管理多个Socket,在线程内循环处理数据,相比于现有后台应用系统一个线程对应一个Socket,节省了系统资源消耗,提升了前置机模块在现有后台应用系统下的接入能力。该方法使前置机模块更适应由于IP通信技术的发展而产生的终端与前置机模块直接相连的情况,使得前置机模块具有海量终端接入的能力。
在复杂和恶劣的现场环境下,终端经常发生断线等情况,导致Socket失效或断开。未注册服务器管理线程的引入能够有效筛除无效的Socket,提升系统资源利用率;在终端的分类管理线程内检测到无效Socket需要剔除时,无需销毁管理线程,而是从线程已登录连界栈中删除对应的Socket信息,释放Socket所占用的资源。这就避免了额外的新建和销毁管理线程所带来的资源消耗,提高了终端管理线程的管理效率。
3 结束语
本文介绍了针对新能源监控系统海量终端接入的两项关键技术,即网络负载均衡策略及通信连接管理方法,并在实际项目中对该方法进行了验证。该方法处理数千数万级别终端接入效果很好,可解决新能源监控/集控系统的需求,同时对具有类似需求的配网自动化等领域系统设计具有参考价值。