方茹慧,文正國,陳小松,王京紅
(北京中水科水電科技開發(fā)有限公司,北京 100038)
iP9000一體化平臺是北京中水科水電科技開發(fā)有限公司研發(fā)的水利水電自動化業(yè)務(wù)一體化平臺,主要為水電站監(jiān)控、水情水調(diào)、設(shè)備安全監(jiān)測、設(shè)備故障分析與診斷、水電廠培訓(xùn)仿真、監(jiān)控運(yùn)維大數(shù)據(jù)管理與分析等各種專業(yè)應(yīng)用提供運(yùn)行和管理環(huán)境[1]。
在電力系統(tǒng)二次安全防護(hù)“安全分區(qū)、網(wǎng)絡(luò)專用、橫向隔離、縱向認(rèn)證”的安全防護(hù)規(guī)定下[2],隨著一體化平臺接入的業(yè)務(wù)子系統(tǒng)越來越多、業(yè)務(wù)子系統(tǒng)間數(shù)據(jù)應(yīng)用越來越復(fù)雜,如何使數(shù)據(jù)在不同安全分區(qū)、不同應(yīng)用之間達(dá)到“互通、互聯(lián)、共享”、滿足不同專業(yè)應(yīng)用系統(tǒng)之間的跨安全分區(qū)的同步與交互,成為了水利水電工程自動化業(yè)務(wù)部署和實施中亟待解決的問題。
數(shù)據(jù)庫鏡像技術(shù),即每當(dāng)主數(shù)據(jù)庫更新時,數(shù)據(jù)庫鏡像系統(tǒng)會自動把更新后的數(shù)據(jù)復(fù)制到對側(cè)數(shù)據(jù)庫,保證鏡像數(shù)據(jù)與主數(shù)據(jù)的一致性。由于實際電站多以MySQL數(shù)據(jù)庫作為第三方商業(yè)數(shù)據(jù)庫部署數(shù)據(jù)庫鏡像功能,因此本文以MySQL數(shù)據(jù)庫的數(shù)據(jù)庫鏡像作為研究對象,主要探討如何解決MySQL數(shù)據(jù)庫作為持久化工具時的跨區(qū)數(shù)據(jù)鏡像問題。
MySQL主從復(fù)制是使用最為廣泛的一種集群架構(gòu),其原理為主數(shù)據(jù)庫(稱為master)將所有對數(shù)據(jù)庫的更新操作都記錄在二進(jìn)制日志(binlog)中,從數(shù)據(jù)庫(稱為slave)獲取到主數(shù)據(jù)庫的binlog并且順序的對所有的更新操作進(jìn)行重放,從而實現(xiàn)與主數(shù)據(jù)庫保持?jǐn)?shù)據(jù)同步。
MySQL數(shù)據(jù)庫主從復(fù)制的實現(xiàn)涉及到3個關(guān)鍵線程。主數(shù)據(jù)庫對每一個從數(shù)據(jù)庫維護(hù)一個發(fā)布線程,當(dāng)收到從數(shù)據(jù)庫的同步請求后,讀取指定位點信息之后的binlog日志信息返回給從數(shù)據(jù)庫,同時返回新的位點信息。從數(shù)據(jù)庫維護(hù)有2個線程:1個線程與主數(shù)據(jù)庫建立連接,向主數(shù)據(jù)庫發(fā)送同步請求并將獲取到的binlog寫入到中繼日志(relay log),同時更新位點信息;第2個線程用于從中繼日志中讀取內(nèi)容并進(jìn)行重放,完成數(shù)據(jù)的同步[3]。由于binlog采用多文件存儲方式,因此位點信息需要包括binlog filename(binlog文件名)以及binlog position(binlog偏移量定位)。
要實現(xiàn)MySQL的主從復(fù)制,必須打開主數(shù)據(jù)庫的binlog記錄功能,這樣主數(shù)據(jù)庫才會將之后的所有更新操作記錄到binlog文件中。同時,從數(shù)據(jù)庫只能同步啟用binlog日志功能以后的數(shù)據(jù)。為了防止主從數(shù)據(jù)庫數(shù)據(jù)不一致進(jìn)而導(dǎo)致的從數(shù)據(jù)庫同步失敗,從數(shù)據(jù)庫需要在啟用binlog日志功能前把主數(shù)據(jù)庫上已經(jīng)存在的數(shù)據(jù)全部拷貝到從數(shù)據(jù)庫上,保證主從數(shù)據(jù)庫在同一數(shù)據(jù)基礎(chǔ)上再進(jìn)行同步。
Canal是阿里開源的數(shù)據(jù)庫同步中間件,利用MySQL數(shù)據(jù)庫主從復(fù)制的實現(xiàn)原理,基于主數(shù)據(jù)庫的日志解析以獲取數(shù)據(jù)的變更,提供變化數(shù)據(jù)的訂閱與消費,主要用作跨機(jī)房數(shù)據(jù)庫同步。
Canal的工作原理如下:
(1)Canal模擬MySQL從數(shù)據(jù)庫的交互協(xié)議,偽裝自己成為MySQL從數(shù)據(jù)庫,向MySQL主數(shù)據(jù)庫發(fā)送dump協(xié)議;
(2)MySQL主數(shù)據(jù)庫收到dump請求,開始推送binlog流給從數(shù)據(jù)庫,即Canal;
(3)Canal解析binlog對象、進(jìn)行序列化、并存儲;
(4)Canal客戶端(Canal C/S框架客戶端)通過增量訂閱Canal服務(wù)端(Canal C/S框架服務(wù)端)已經(jīng)序列化的數(shù)據(jù),以獲取MySQL主數(shù)據(jù)庫的增量變更,并可根據(jù)需要對數(shù)據(jù)進(jìn)行處理。
EventParser在向MySQL發(fā)送dump命令之前會先獲取上次解析成功的位置(如果是第1次啟動,則獲取初始指定位置或者當(dāng)前數(shù)據(jù)段binlog位點)。MySQL接受到dump命令后,由EventParser從MySQL上拉取binlog數(shù)據(jù)進(jìn)行解析并傳遞給EventSink(傳遞給EventSink模塊進(jìn)行數(shù)據(jù)存儲,是一個阻塞操作,直到存儲成功 ),傳送成功之后更新binlog位點信息。
Canal客戶端與Canal服務(wù)端之間是C/S模式的通信,采用增量訂閱/消費設(shè)計,當(dāng)Canal 客戶端主動發(fā)起拉取請求,Canal服務(wù)端就會模擬MySQL從數(shù)據(jù)庫去MySQL 主數(shù)據(jù)庫拉取binlog。所以通常Canal客戶端通常是一個守護(hù)進(jìn)程,通過不斷調(diào)用get方法,實現(xiàn)對MySQL主數(shù)據(jù)庫的變更的抓取。
為解決iP9000一體化平臺面臨的數(shù)據(jù)“互聯(lián)、互通、共享”問題,設(shè)計并實現(xiàn)了跨安全分區(qū)數(shù)據(jù)庫鏡像功能,提供了部署在不同安全分區(qū)的專業(yè)應(yīng)用訪問其他安全分區(qū)專業(yè)應(yīng)用采集數(shù)據(jù)的可能性。
本文研究的跨安全分區(qū)數(shù)據(jù)庫鏡像功能的主要設(shè)計目標(biāo)如下:
(1)專業(yè)應(yīng)用子系統(tǒng)將采集到的數(shù)據(jù)持久化存儲到MySQL數(shù)據(jù)庫中;
(2)在其他安全分區(qū)部署鏡像數(shù)據(jù)庫;
(3)自動完成數(shù)據(jù)庫數(shù)據(jù)的跨安全分區(qū)的同步功能;
(4)鏡像數(shù)據(jù)庫可以是不同類型的數(shù)據(jù)庫。
iP9000一體化平臺跨安全分區(qū)數(shù)據(jù)庫鏡像功能按照數(shù)據(jù)流向,需要依次實現(xiàn)以下功能。
(1)使用開源組件Canal模擬從數(shù)據(jù)庫來實現(xiàn)MySQL主數(shù)據(jù)庫binlog的增量訂閱及消費,對數(shù)據(jù)變更進(jìn)行抓??;
(2)對抓取的binlog數(shù)據(jù)進(jìn)行解析和格式轉(zhuǎn)換;
(3)通過一體化平臺的跨安全分區(qū)數(shù)據(jù)同步機(jī)制傳送到其他安全分區(qū);
(4)其他安全分區(qū)一體化平臺接收數(shù)據(jù)并寫入鏡像數(shù)據(jù)庫;
總體實現(xiàn)方案如圖1所示。
(1)HA(Highly Available高可用性集群)機(jī)制
為了實現(xiàn)跨安全分區(qū)數(shù)據(jù)庫鏡像功能魯棒運(yùn)行,本文采用高可用性集群機(jī)制,通過多服務(wù)器的熱備部署,使跨安全分區(qū)數(shù)據(jù)庫鏡像系統(tǒng)盡可能的對外提供可用的、完整的功能。
針對Canal服務(wù)端和客戶端,數(shù)據(jù)庫鏡像系統(tǒng)使用開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù)zookeeper,實現(xiàn)集群中只有一個節(jié)點處于運(yùn)行狀態(tài),其他節(jié)點處于備份狀態(tài)。在實現(xiàn)高可用的同時,減少Canal服務(wù)端對MySQL主數(shù)據(jù)庫同步請求,實現(xiàn)Canal客戶端對數(shù)據(jù)的有序消費。
針對一體化平臺的跨安全分區(qū)數(shù)據(jù)同步相關(guān)服務(wù),數(shù)據(jù)庫鏡像系統(tǒng)使用一體化平臺的調(diào)度機(jī)制,實現(xiàn)集群中節(jié)點的熱備功能。一體化平臺調(diào)度機(jī)制能夠根據(jù)服務(wù)的心跳對集群中的服務(wù)進(jìn)行熱調(diào)度,保證在一個節(jié)點出現(xiàn)故障時能夠及時快速的啟用其他備用節(jié)點,有力的保證了跨安全分區(qū)傳輸功能以及同步寫入鏡像數(shù)據(jù)庫功能的高可用性。
(2)binlog日志數(shù)據(jù)的解析
基于MySQL主數(shù)據(jù)庫行的復(fù)制,Canal服務(wù)端抓取到MySQL主數(shù)據(jù)庫的變更信息包含每條記錄變更前及變更后的詳細(xì)信息,從而可以準(zhǔn)確地復(fù)制每一條記錄。數(shù)據(jù)庫鏡像服務(wù)根據(jù)行數(shù)據(jù)變更前和變更后的對比,從而解析數(shù)據(jù)的增、刪、改等操作,實現(xiàn)數(shù)據(jù)的解析功能。
(3)一體化平臺跨安全分區(qū)同步
跨安全分區(qū)數(shù)據(jù)同步機(jī)制由一體化平臺實現(xiàn),對應(yīng)用完全透明。應(yīng)用可以根據(jù)需要將數(shù)據(jù)傳輸至任意安全分區(qū)同時寫入一個或多個第三方商業(yè)數(shù)據(jù)庫中,并支持Oracle、MySQL、MongoDB、達(dá)夢等多種數(shù)據(jù)庫類型。數(shù)據(jù)庫鏡像服務(wù)在對binlog日志數(shù)據(jù)進(jìn)行解析和格式轉(zhuǎn)換之后,將格式化的數(shù)據(jù)交由一體化平臺即可透明傳輸、寫入部署在其他安全分區(qū)的鏡像數(shù)據(jù)庫,實現(xiàn)同構(gòu)或異構(gòu)的跨安全分區(qū)數(shù)據(jù)庫鏡像功能。
以某電站為例。某電站配備了趨勢分析系統(tǒng)以及現(xiàn)地采集系統(tǒng)(包括子系統(tǒng):機(jī)組狀態(tài)在線監(jiān)測子系統(tǒng)、主變壓器在線監(jiān)測子系統(tǒng)、GIS在線監(jiān)測子系統(tǒng)、GIL在線監(jiān)測子系統(tǒng)等)。根據(jù)安全要求,現(xiàn)地采集系統(tǒng)和趨勢分析系統(tǒng)不能運(yùn)行在同一個安全分區(qū)。為解決數(shù)據(jù)分析系統(tǒng)能夠及時準(zhǔn)確訪問到采集系統(tǒng)采集的數(shù)據(jù),該電站部署投運(yùn)了跨安全分區(qū)的數(shù)據(jù)庫鏡像功能,并可以較好地滿足實際生產(chǎn)需要。
如圖2所示,主變壓器在線監(jiān)測子系統(tǒng)和GIS/GIL在線監(jiān)測子系統(tǒng)部署在安全I(xiàn)I區(qū),趨勢分析系統(tǒng)部署在安全I(xiàn)II區(qū)。由于采集子系統(tǒng)由不同廠家進(jìn)行設(shè)計實現(xiàn),分別將采集數(shù)據(jù)存儲于部署在本安全分區(qū)的MySQL數(shù)據(jù)庫和MariaDB數(shù)據(jù)庫2個數(shù)據(jù)庫。MariaDB數(shù)據(jù)庫與MySQL數(shù)據(jù)庫強(qiáng)的兼容性為MariaDB數(shù)據(jù)庫跨安全分區(qū)同步提供了可能。為了將這2個數(shù)據(jù)庫分別跨安全分區(qū)同步到部署在安全I(xiàn)II區(qū)的鏡像數(shù)據(jù)庫,現(xiàn)場部署了如圖2所示的MySQL、MariaDB 2套數(shù)據(jù)庫鏡像系統(tǒng)。
圖2 某電站跨安全分區(qū)數(shù)據(jù)庫鏡像功能部署方式
安全I(xiàn)I區(qū) 部 署2套Canal,由Canal服務(wù)端模擬從數(shù)據(jù)庫,獲取主數(shù)據(jù)庫增量變更信息;之后,由HDBMIRROR(Canal 客戶端)服務(wù)與Canal 服務(wù)端建立連接,將增量獲取到的內(nèi)容進(jìn)行解析和格式轉(zhuǎn)換,接著提交給本安全分區(qū)的iP9000隔離通信服務(wù);最后,由部署在安全I(xiàn)I區(qū)和安全I(xiàn)II區(qū)的iP9000隔離通信服務(wù)實現(xiàn)跨隔離及寫庫功能。
為了保證系統(tǒng)的魯棒性,Canal服務(wù)端和HDBMIRROR程序均由zookeeper集群統(tǒng)一調(diào)度,HDBMIRROR通過向zookeeper詢問運(yùn)行節(jié)點主機(jī)信息,實現(xiàn)與Canal服務(wù)端的連接,完成數(shù)據(jù)的增量訂閱、解析、消費功能;iP9000隔離通信/寫庫服務(wù)由iP9000調(diào)度服務(wù)統(tǒng)一調(diào)度,由服務(wù)主節(jié)點完成數(shù)據(jù)的傳輸和寫庫功能。
本文基于iP9000一體化平臺面對多專業(yè)應(yīng)用、多類數(shù)據(jù)跨安全分區(qū)形成統(tǒng)一數(shù)據(jù)平臺的目的[4],設(shè)計并實現(xiàn)了跨安全分區(qū)的數(shù)據(jù)庫鏡像功能,為各專業(yè)應(yīng)用之間數(shù)據(jù)的互通、互聯(lián)與共享統(tǒng)一提供了支持。基于iP9000一體化平臺的跨安全分區(qū)數(shù)據(jù)庫鏡像功能,在實際項目應(yīng)用中成功地實現(xiàn)了不同專業(yè)應(yīng)用系統(tǒng)之間通過數(shù)據(jù)庫的鏡像功能實現(xiàn)的跨安全分區(qū)的數(shù)據(jù)交互,滿足了數(shù)據(jù)同步的及時性、準(zhǔn)確性和完整性,完善了iP9000一體化平臺的跨安全分區(qū)數(shù)據(jù)同步功能。