馮利虎,易永輝,時 誼,陳海龍,張玉寶,張 倩,王 剛
(許繼集團有限公司,河南 許昌 461000)
隨著傳統石化能源危機和環境污染兩大問題日益嚴重,大力發展清潔、可再生新能源已成為世界各國共識。風電、光伏作為新型綠色無污染的能源也越來越受到人們的青睞,裝機規模及占比在不斷增大[1-4]。
新能源電站建設規模不斷擴大,特別是大型光伏、分布式光伏電站加速發展,接入新能源監控/集控系統的數據量及終端數量也在不斷增多[5]。如100 MW大型地面光伏電站考慮到光伏區匯流箱設備的通信接入,全站設備數量將超過2 000臺;同樣監控數百個分布式光伏站點的遠程監控/集控中心,終端設備的數量也數以千計。常規監控系統的容量及架構設計已無法滿足新能源領域大量終端的接入需求。
本文介紹了監控系統海量終端接入的關鍵技術,并給出了具體的實現方案。
針對新能源監控系統海量終端接入的需求,必須解決以下兩個關鍵問題。
①海量終端接入系統的網絡負載均衡策略[6-8]。
為了更好地解決因海量終端接入而帶來的一系列高并發、潮涌式堵塞等問題,需要一種新的網絡負載均衡算法處理網絡連接問題。在前置服務器上搭建EPOLL模型,對交互數據進行處理[9-10];增加前置機調度模塊,負責前置機和后臺應用的數據處理。
②海量終端通信連接管理方法研究。
為了更好地解決目前大量終端接入而帶來的通信連接管理和前置機模塊資源消耗等問題,研究采用一種新的Socket管理方法。在通信管理機模塊上采用多線程管理終端以及業務服務器連接,線程內以循環方式管理多個Socket。
利用現有的集群服務器技術,修改針對網絡連接的網絡負載均衡算法,對并發連接進行合適的分流,在網絡負載均衡器上增加客戶端連接的遷移算法,實現前置機服務器的故障遷移和柔性擴容;增加前置機調度模塊完成報文準確下發到終端,分擔和緩解前置機服務器負載;在前置機服務器搭建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端點的海量終端數據通信時的接入“瓶頸”,改進采集系統的框架模塊,解決了大規模連接時的高并發和擁堵問題。
目前,終端與主站系統的通信建立機制一般為:主站系統的前置機模塊與終端建立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所占用的資源。這就避免了額外的新建和銷毀管理線程所帶來的資源消耗,提高了終端管理線程的管理效率。
本文介紹了針對新能源監控系統海量終端接入的兩項關鍵技術,即網絡負載均衡策略及通信連接管理方法,并在實際項目中對該方法進行了驗證。該方法處理數千數萬級別終端接入效果很好,可解決新能源監控/集控系統的需求,同時對具有類似需求的配網自動化等領域系統設計具有參考價值。