馮利虎,易永輝,時(shí) 誼,陳海龍,張玉寶,張 倩,王 剛
(許繼集團(tuán)有限公司,河南 許昌 461000)
隨著傳統(tǒng)石化能源危機(jī)和環(huán)境污染兩大問(wèn)題日益嚴(yán)重,大力發(fā)展清潔、可再生新能源已成為世界各國(guó)共識(shí)。風(fēng)電、光伏作為新型綠色無(wú)污染的能源也越來(lái)越受到人們的青睞,裝機(jī)規(guī)模及占比在不斷增大[1-4]。
新能源電站建設(shè)規(guī)模不斷擴(kuò)大,特別是大型光伏、分布式光伏電站加速發(fā)展,接入新能源監(jiān)控/集控系統(tǒng)的數(shù)據(jù)量及終端數(shù)量也在不斷增多[5]。如100 MW大型地面光伏電站考慮到光伏區(qū)匯流箱設(shè)備的通信接入,全站設(shè)備數(shù)量將超過(guò)2 000臺(tái);同樣監(jiān)控?cái)?shù)百個(gè)分布式光伏站點(diǎn)的遠(yuǎn)程監(jiān)控/集控中心,終端設(shè)備的數(shù)量也數(shù)以千計(jì)。常規(guī)監(jiān)控系統(tǒng)的容量及架構(gòu)設(shè)計(jì)已無(wú)法滿足新能源領(lǐng)域大量終端的接入需求。
本文介紹了監(jiān)控系統(tǒng)海量終端接入的關(guān)鍵技術(shù),并給出了具體的實(shí)現(xiàn)方案。
針對(duì)新能源監(jiān)控系統(tǒng)海量終端接入的需求,必須解決以下兩個(gè)關(guān)鍵問(wèn)題。
①海量終端接入系統(tǒng)的網(wǎng)絡(luò)負(fù)載均衡策略[6-8]。
為了更好地解決因海量終端接入而帶來(lái)的一系列高并發(fā)、潮涌式堵塞等問(wèn)題,需要一種新的網(wǎng)絡(luò)負(fù)載均衡算法處理網(wǎng)絡(luò)連接問(wèn)題。在前置服務(wù)器上搭建EPOLL模型,對(duì)交互數(shù)據(jù)進(jìn)行處理[9-10];增加前置機(jī)調(diào)度模塊,負(fù)責(zé)前置機(jī)和后臺(tái)應(yīng)用的數(shù)據(jù)處理。
②海量終端通信連接管理方法研究。
為了更好地解決目前大量終端接入而帶來(lái)的通信連接管理和前置機(jī)模塊資源消耗等問(wèn)題,研究采用一種新的Socket管理方法。在通信管理機(jī)模塊上采用多線程管理終端以及業(yè)務(wù)服務(wù)器連接,線程內(nèi)以循環(huán)方式管理多個(gè)Socket。
利用現(xiàn)有的集群服務(wù)器技術(shù),修改針對(duì)網(wǎng)絡(luò)連接的網(wǎng)絡(luò)負(fù)載均衡算法,對(duì)并發(fā)連接進(jìn)行合適的分流,在網(wǎng)絡(luò)負(fù)載均衡器上增加客戶端連接的遷移算法,實(shí)現(xiàn)前置機(jī)服務(wù)器的故障遷移和柔性擴(kuò)容;增加前置機(jī)調(diào)度模塊完成報(bào)文準(zhǔn)確下發(fā)到終端,分擔(dān)和緩解前置機(jī)服務(wù)器負(fù)載;在前置機(jī)服務(wù)器搭建EPOLL模塊進(jìn)行數(shù)據(jù)流處理。該方案可解決海量終端連接時(shí)的高并發(fā)和擁堵的“瓶頸”。
①前置機(jī)調(diào)度模塊。該模塊用于連接后臺(tái)應(yīng)用模塊和前置機(jī)集群,主要作用是把前置機(jī)的解析數(shù)據(jù)發(fā)送到相應(yīng)的后臺(tái)應(yīng)用模塊中;同時(shí)根據(jù)關(guān)聯(lián)關(guān)系,把下行數(shù)據(jù)準(zhǔn)確發(fā)送至終端。在本模塊中,保存終端網(wǎng)絡(luò)信息和前置機(jī)服務(wù)器網(wǎng)絡(luò)信息的關(guān)聯(lián)結(jié)構(gòu)圖,并響應(yīng)前置機(jī)的關(guān)聯(lián)修改請(qǐng)求。
②前置機(jī)集群。它由N臺(tái)相互獨(dú)立、通過(guò)高速網(wǎng)絡(luò)互聯(lián)的計(jì)算機(jī)構(gòu)成一個(gè)組,并對(duì)單一系統(tǒng)模式加以管理,可以提高服務(wù)器性能、降低成本、提高可擴(kuò)展性、增強(qiáng)可靠性。本方案中采用的是負(fù)載均衡集群。
③網(wǎng)絡(luò)負(fù)載均衡器。網(wǎng)絡(luò)負(fù)載均衡器對(duì)終端連接按現(xiàn)有前置機(jī)集群的處理能力進(jìn)行分流,負(fù)載均衡策略按照“閾值輪循+動(dòng)態(tài)負(fù)載反饋”的方法,擴(kuò)展網(wǎng)絡(luò)連接吞吐量,加強(qiáng)前置機(jī)數(shù)據(jù)處理能力。在本方案中,網(wǎng)絡(luò)負(fù)載均衡器中運(yùn)行狀態(tài)機(jī)和前置機(jī)服務(wù)器的狀態(tài)機(jī)進(jìn)行呼應(yīng);處理故障時(shí),Socket的遷移及擴(kuò)容時(shí)前置機(jī)服務(wù)器的負(fù)載分流。
終端數(shù)據(jù)連接如圖1所示。
圖1 終端數(shù)據(jù)連接圖
本方案涉及以下三個(gè)關(guān)鍵點(diǎn)。
其一,網(wǎng)絡(luò)負(fù)載均衡器的實(shí)現(xiàn)算法。針對(duì)客戶端連接分流均衡算法,先設(shè)定前置服務(wù)器上可連接的客戶端個(gè)數(shù),將連接請(qǐng)求依次順序循環(huán)地連接到每個(gè)允許連接的服務(wù)器上;當(dāng)連接數(shù)達(dá)到設(shè)定的閾值時(shí),根據(jù)各個(gè)前置服務(wù)器的實(shí)時(shí)負(fù)載情況進(jìn)行適當(dāng)?shù)姆峙洹G爸梅?wù)器的實(shí)時(shí)負(fù)載由位于前置服務(wù)器的性能監(jiān)測(cè)軟件經(jīng)過(guò)集群間的“心跳”專用線傳輸。另外,采用一定的算法處理故障遷移和擴(kuò)容時(shí)的負(fù)載均衡。
其二,前置服務(wù)器的數(shù)據(jù)處理算法。在前置機(jī)對(duì)數(shù)據(jù)流進(jìn)行處理時(shí),采用EPOLL模型。EPOLL模型主要負(fù)責(zé)對(duì)大量并發(fā)用戶的請(qǐng)求進(jìn)行及時(shí)處理,完成服務(wù)器與客戶端的數(shù)據(jù)交互。其具體的實(shí)現(xiàn)步驟如下。
①使用EPOLL_create()函數(shù)創(chuàng)建文件描述,設(shè)定可管理的最大Socket描述符數(shù)目。
②創(chuàng)建與EPOLL關(guān)聯(lián)的接收線程,應(yīng)用程序可以創(chuàng)建多個(gè)接收線程來(lái)處理Epoll上的讀通知事件,線程的數(shù)量依賴于程序的具體需要和設(shè)備環(huán)境。
③創(chuàng)建一個(gè)偵聽(tīng)Socket描述符ListenSock;將該描述符設(shè)定為非阻塞模式,調(diào)用Listen()函數(shù)在套接字上偵聽(tīng)有無(wú)新的連接請(qǐng)求。在 epoll_event結(jié)構(gòu)中設(shè)置要處理的事件類型EPOLLIN,工作方式為epoll_ET,以提高工作效率,同時(shí)使用epoll_ctl()注冊(cè)事件,最后啟動(dòng)網(wǎng)絡(luò)監(jiān)視線程。
④創(chuàng)建本地文件,對(duì)數(shù)據(jù)接收鏈表溢出數(shù)據(jù)進(jìn)行本地緩存。
⑤網(wǎng)絡(luò)監(jiān)視線程啟動(dòng)循環(huán),epoll_wait()等待epoll事件發(fā)生。
⑥如果Epoll事件表明有新的連接請(qǐng)求,則調(diào)用accept()函數(shù),將客戶端Socket描述符添加到epoll_data聯(lián)合體,同時(shí)設(shè)定該描述符為非阻塞,并在epoll_event結(jié)構(gòu)中設(shè)置要處理的事件類型為讀和寫,工作方式為epoll_ET。
⑦如果Epoll事件表明Socket描述符上有數(shù)據(jù)可讀,則將該Socket描述符加入可讀隊(duì)列,通知接收線程讀入數(shù)據(jù),并將接收到的數(shù)據(jù)放入到接收數(shù)據(jù)的鏈表中。經(jīng)邏輯處理后,將反饋的數(shù)據(jù)包放入到發(fā)送數(shù)據(jù)鏈表中,等待由發(fā)送線程發(fā)送。
其三,前置機(jī)調(diào)度模塊。前置機(jī)調(diào)度模塊保存前置機(jī)攜帶終端IP信息和本機(jī)IP地址的注冊(cè)關(guān)聯(lián)表,在下行數(shù)據(jù)傳輸時(shí),前置機(jī)調(diào)度模塊根據(jù)終端信息,在注冊(cè)關(guān)聯(lián)表中找到對(duì)應(yīng)的前置服務(wù)器,并把下行數(shù)據(jù)傳輸?shù)皆撉爸梅?wù)器上進(jìn)行報(bào)文組裝和下發(fā)。當(dāng)發(fā)生Socket遷移時(shí),前置機(jī)調(diào)度模塊接收上行的更改命令對(duì)注冊(cè)關(guān)聯(lián)表進(jìn)行修改。 基于IP的終端設(shè)備發(fā)起連接請(qǐng)求到網(wǎng)絡(luò)負(fù)載均衡器,由網(wǎng)絡(luò)負(fù)載均衡器根據(jù)“閾值輪循+動(dòng)態(tài)負(fù)載反饋”算法將所有的連接請(qǐng)求分發(fā)到前置集群中的各個(gè)前置服務(wù)器,客戶端TCP連接至前置機(jī)分配如圖2所示。
圖2 客戶端TCP連接至前置機(jī)分配圖
分發(fā)的原則是依據(jù)前置服務(wù)器的連接數(shù)據(jù)和實(shí)時(shí)負(fù)載情況,并由各個(gè)前置服務(wù)器和終端建立通信鏈路。Socket客戶端建立后的數(shù)據(jù)流如圖3所示。此時(shí),網(wǎng)絡(luò)負(fù)載均衡器保存各個(gè)終端的連接信息,并只對(duì)鏈路的連接情況進(jìn)行監(jiān)測(cè)。
前置服務(wù)器每建立一個(gè)客戶端請(qǐng)求連接,則要在前置機(jī)調(diào)度模塊上注冊(cè)相應(yīng)的連接信息。假如終端IP地址為10.100.100.202,經(jīng)網(wǎng)絡(luò)負(fù)載均衡器分配到IP地址為10.100.100.104的前置服務(wù)器上。在連接請(qǐng)求建立后,前置服務(wù)器把連接信息注冊(cè)到前置機(jī)調(diào)度模塊上,即在前置機(jī)調(diào)度模塊上新增IP地址為10.100.100.104和10.100.100.202的關(guān)系對(duì)。當(dāng)有上行數(shù)據(jù)傳輸時(shí),經(jīng)前置服務(wù)器解析處理后直接上傳到后臺(tái)應(yīng)用模塊;當(dāng)有下行數(shù)據(jù)時(shí)傳輸,由后臺(tái)應(yīng)用模塊把待發(fā)送的數(shù)據(jù)和終端信息發(fā)送到前置機(jī)調(diào)度模塊。前置機(jī)調(diào)度模塊根據(jù)終端信息查找到該終端通信的前置服務(wù)器,并經(jīng)由查找到的前置服務(wù)器對(duì)數(shù)據(jù)組裝格式化后下發(fā)到相應(yīng)終端。
圖3 客戶端SOCKET建立后的數(shù)據(jù)流向圖
前置服務(wù)器處理連接和數(shù)據(jù)流的具體步驟如下。
①在前置服務(wù)器上建立一定數(shù)量的線程,并由線程池統(tǒng)一管理。
②當(dāng)客戶端進(jìn)行連接時(shí),由主線程對(duì)此連接建立通信并把該客戶端加入到EPOLL監(jiān)視事件中。
③當(dāng)EPOLL監(jiān)測(cè)到某連接有可讀事件時(shí),通知接收線程進(jìn)行數(shù)據(jù)讀取,并判斷數(shù)據(jù)接收鏈表長(zhǎng)度是否到達(dá)最大值。如果未達(dá)到最大值,把讀到的數(shù)據(jù)插入到鏈表中;否則把讀到的數(shù)據(jù)以本地文件的形式進(jìn)行緩存,并等待文件操作線程處理本地文件。
④數(shù)據(jù)處理線程不斷地從數(shù)據(jù)接收鏈表中取出數(shù)據(jù)進(jìn)行解析、處理;當(dāng)有下行數(shù)據(jù)命令時(shí),數(shù)據(jù)處理線程直接把數(shù)據(jù)保存到數(shù)據(jù)發(fā)送鏈表中等待處理。
⑤數(shù)據(jù)發(fā)送線程檢測(cè)到待發(fā)送鏈表中有數(shù)據(jù)時(shí),從中取出數(shù)據(jù),經(jīng)由數(shù)據(jù)處理線程組裝格式化處理后,下發(fā)到前置機(jī)調(diào)度模塊進(jìn)行分發(fā)。
本方案針對(duì)基于IP端點(diǎn)的海量終端數(shù)據(jù)通信時(shí)的接入“瓶頸”,改進(jìn)采集系統(tǒng)的框架模塊,解決了大規(guī)模連接時(shí)的高并發(fā)和擁堵問(wèn)題。
目前,終端與主站系統(tǒng)的通信建立機(jī)制一般為:主站系統(tǒng)的前置機(jī)模塊與終端建立Socket連接,新建與之對(duì)應(yīng)的線程用于Socket的維護(hù)、管理,并處理Socket數(shù)據(jù)收發(fā);終端斷開(kāi)連接時(shí),銷毀與之對(duì)應(yīng)的管理線程,回收系統(tǒng)資源。在本方案中,由于每個(gè)終端具有獨(dú)立的IP地址,應(yīng)用服務(wù)平臺(tái)和終端將進(jìn)行端到端直接通信,因此前置機(jī)模塊將面臨更大的接入壓力,前置機(jī)模塊管理海量通信鏈路連接的能力和穩(wěn)定性,將嚴(yán)重影響整個(gè)系統(tǒng)的可靠性、實(shí)時(shí)性和擴(kuò)展性。
為解決該問(wèn)題,本文采用如下方案。
①終端的多線程分類管理。
通信管理機(jī)每個(gè)線程內(nèi)包含兩個(gè)動(dòng)態(tài)數(shù)組連界棧(預(yù)登陸連接棧和已登錄連接棧)。前置機(jī)模塊采用多線程方式來(lái)分類管理所接入的不同類型終端以及其他業(yè)務(wù)服務(wù)器的Socket連接。每個(gè)管理線程可以管理多個(gè)Socket連接。
②管理線程內(nèi)對(duì)Socket連接采用循環(huán)管理方式。
登錄成功的終端,依據(jù)終端類型和管理線程的負(fù)載情況分配Socket至最優(yōu)管理線程,存放于預(yù)登陸連接棧中;單個(gè)線程最多能夠管理64個(gè)Socket。若現(xiàn)有線程的Socket管理數(shù)已滿,則新建管理線程;若登錄失敗或是斷開(kāi)連接,則判定為無(wú)效Socket被剔除。各管理線程把Socket信息從預(yù)登陸連接棧取出,并存入已登錄連接棧進(jìn)行處理,檢測(cè)各個(gè)Socket是否有事件(數(shù)據(jù)接收、數(shù)據(jù)發(fā)送)發(fā)生,然后循環(huán)處理各Socket的事件。其關(guān)鍵點(diǎn)在于管理線程內(nèi)循環(huán)處理各個(gè)Socket的事件。
③無(wú)效Socket的檢測(cè)和剔除。
當(dāng)終端接入時(shí),首先分配至未注冊(cè)管理線程,在規(guī)定時(shí)限內(nèi)完成登錄過(guò)程后,依據(jù)終端類型分配Socket至最優(yōu)管理線程,未能完成登錄過(guò)程的Socket則視為無(wú)效Socket被剔除;前置系統(tǒng)與Socket建立連接后,在各分類管理線程檢測(cè)已登錄連接棧中存放的Socket是否正常,剔除無(wú)效的Socket(退出登錄或斷線)。
這種連接管理方法的優(yōu)點(diǎn)如下。
①采用終端的多線程分類管理,使得后臺(tái)應(yīng)用系統(tǒng)能夠依據(jù)不同類型的終端(其數(shù)據(jù)類型、采集周期、報(bào)文數(shù)據(jù)格式等不同),采取相應(yīng)的數(shù)據(jù)處理策略,簡(jiǎn)化后臺(tái)應(yīng)用系統(tǒng)數(shù)據(jù)處理過(guò)程。這樣便于后臺(tái)應(yīng)用系統(tǒng)的升級(jí)和改造。
②每個(gè)線程管理多個(gè)Socket,在線程內(nèi)循環(huán)處理數(shù)據(jù),相比于現(xiàn)有后臺(tái)應(yīng)用系統(tǒng)一個(gè)線程對(duì)應(yīng)一個(gè)Socket,節(jié)省了系統(tǒng)資源消耗,提升了前置機(jī)模塊在現(xiàn)有后臺(tái)應(yīng)用系統(tǒng)下的接入能力。該方法使前置機(jī)模塊更適應(yīng)由于IP通信技術(shù)的發(fā)展而產(chǎn)生的終端與前置機(jī)模塊直接相連的情況,使得前置機(jī)模塊具有海量終端接入的能力。
在復(fù)雜和惡劣的現(xiàn)場(chǎng)環(huán)境下,終端經(jīng)常發(fā)生斷線等情況,導(dǎo)致Socket失效或斷開(kāi)。未注冊(cè)服務(wù)器管理線程的引入能夠有效篩除無(wú)效的Socket,提升系統(tǒng)資源利用率;在終端的分類管理線程內(nèi)檢測(cè)到無(wú)效Socket需要剔除時(shí),無(wú)需銷毀管理線程,而是從線程已登錄連界棧中刪除對(duì)應(yīng)的Socket信息,釋放Socket所占用的資源。這就避免了額外的新建和銷毀管理線程所帶來(lái)的資源消耗,提高了終端管理線程的管理效率。
本文介紹了針對(duì)新能源監(jiān)控系統(tǒng)海量終端接入的兩項(xiàng)關(guān)鍵技術(shù),即網(wǎng)絡(luò)負(fù)載均衡策略及通信連接管理方法,并在實(shí)際項(xiàng)目中對(duì)該方法進(jìn)行了驗(yàn)證。該方法處理數(shù)千數(shù)萬(wàn)級(jí)別終端接入效果很好,可解決新能源監(jiān)控/集控系統(tǒng)的需求,同時(shí)對(duì)具有類似需求的配網(wǎng)自動(dòng)化等領(lǐng)域系統(tǒng)設(shè)計(jì)具有參考價(jià)值。