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