王劍冰
摘要 不同系統(tǒng)間有時(shí)需要進(jìn)行大量的數(shù)據(jù)轉(zhuǎn)換和傳輸,傳統(tǒng)方法一般采用單機(jī)作為數(shù)據(jù)傳輸接口機(jī)來(lái)處理,常會(huì)遇到性能以及單點(diǎn)故障問(wèn)題,本文設(shè)計(jì)了一種分布式的數(shù)據(jù)交換平臺(tái),通過(guò)主機(jī)節(jié)點(diǎn)集群并發(fā)處理提升數(shù)據(jù)傳輸性能,并避免任一節(jié)點(diǎn)的單點(diǎn)故障,同時(shí)數(shù)據(jù)交換的過(guò)程可以得到統(tǒng)一的監(jiān)控。
關(guān)鍵詞 分布式:數(shù)據(jù)交換
中圖分類號(hào) TP3 文獻(xiàn)標(biāo)識(shí)碼 A 文章編號(hào) 2095—6363(2016)13—0055—02
數(shù)據(jù)的轉(zhuǎn)換和傳輸在不同系統(tǒng)間的交互中比較常見(jiàn),由于系統(tǒng)的數(shù)據(jù)存儲(chǔ)形式和格式都不一樣,故而需要做轉(zhuǎn)換。一般傳統(tǒng)方式下,做這種數(shù)據(jù)轉(zhuǎn)換和傳輸,會(huì)使用一臺(tái)接口機(jī)來(lái)處理,但是當(dāng)傳輸量較大時(shí),單臺(tái)接口機(jī)的性能會(huì)成為瓶頸,而且存在單點(diǎn)故障,當(dāng)接口機(jī)出現(xiàn)故障時(shí),整個(gè)數(shù)據(jù)交換中斷。
為解決單機(jī)處理數(shù)據(jù)交換的缺點(diǎn),需要設(shè)計(jì)一個(gè)分布式數(shù)據(jù)交換平臺(tái),實(shí)現(xiàn)數(shù)據(jù)交換任務(wù)并發(fā)且負(fù)載均衡地處理,消除單點(diǎn)故障問(wèn)題,并且所有數(shù)據(jù)交換任務(wù)都可以得到有效的監(jiān)控。
1分布式數(shù)據(jù)交換平臺(tái)的設(shè)計(jì)
1.1總體架構(gòu)
平臺(tái)的總體架構(gòu)如圖1所示。
圖1各模塊功能說(shuō)明:1)配置及任務(wù)管理數(shù)據(jù)庫(kù)。采用Mysql或現(xiàn)有Oracle,存放各類配置數(shù)據(jù)、任務(wù)分配、處理狀態(tài)信息;2)數(shù)據(jù)交換集群。獲取任務(wù)并發(fā)執(zhí)行數(shù)據(jù)導(dǎo)入導(dǎo)出任務(wù),并反饋任務(wù)處理狀態(tài),任務(wù)流量控制。集群每個(gè)節(jié)點(diǎn)部署基于開源DataX改造的單機(jī)數(shù)據(jù)交換模塊;3)消息服務(wù)器。采用自主研發(fā)分布式消息平臺(tái),任務(wù)傳輸與通知、中斷任務(wù)重新分配;4)管理服務(wù)器。配置源、目標(biāo)數(shù)據(jù)對(duì)象,集群主機(jī),DataX進(jìn)程內(nèi)并發(fā)規(guī)則,任務(wù)分片規(guī)則,產(chǎn)生定時(shí)任務(wù),手工生成任務(wù),提供任務(wù)監(jiān)控服務(wù);5)ZK集群。監(jiān)控主機(jī)狀態(tài)和正在執(zhí)行的任務(wù)狀態(tài)①。
1.2處理邏輯
邏輯處理示意圖如圖2所示。
1)任務(wù)分配。用戶通過(guò)管理平臺(tái)配置源數(shù)據(jù)庫(kù)表、目標(biāo)數(shù)據(jù)庫(kù)表,不同的數(shù)據(jù)庫(kù)在DataX中處理使用的讀并發(fā)和寫并發(fā)參數(shù),并配置任務(wù)的分片方式,配置子任務(wù)的執(zhí)行方式(周期性,單次),并將子任務(wù)寫到消息隊(duì)列。
2)管理進(jìn)程。讀取本機(jī)可啟動(dòng)的最大DataX進(jìn)程數(shù)配置,根據(jù)當(dāng)前正在運(yùn)行的DataX進(jìn)程數(shù)和當(dāng)前主機(jī)的資源使用情況進(jìn)行綜合評(píng)定,當(dāng)前隊(duì)列中是否有待處理消息啟動(dòng)DataX進(jìn)程,并控制適當(dāng)?shù)倪M(jìn)程數(shù)(包括接收管理平臺(tái)發(fā)送來(lái)的指令殺死進(jìn)程)。定時(shí)更新管理進(jìn)程狀態(tài)表的最新狀態(tài)時(shí)間字段以表示管理進(jìn)程存活,如長(zhǎng)時(shí)間未更新,則管理平臺(tái)產(chǎn)生告警。實(shí)時(shí)接收命令隊(duì)列中的指令,如調(diào)整參數(shù)、殺死某DataX進(jìn)程、啟動(dòng)應(yīng)急處理任務(wù)等等,并將執(zhí)行結(jié)果發(fā)送到執(zhí)行響應(yīng)隊(duì)列。
3)DataX進(jìn)程。需對(duì)原生的DataX進(jìn)行入口和出口部分的源碼改造:(1)入口:讀取命令行參數(shù)替換為讀取消息,并使用消息中的參數(shù)執(zhí)行,沒(méi)有消息時(shí)進(jìn)行阻塞等待;(2)初始化處理:讀取到消息后在到數(shù)據(jù)庫(kù)中查詢?nèi)蝿?wù)是否曾經(jīng)執(zhí)行過(guò)的任務(wù),并在ZK集群上判斷任務(wù)狀態(tài)是否為正在處理,如果該子任務(wù)的狀態(tài)是:數(shù)據(jù)庫(kù)中為正在執(zhí)行但當(dāng)前ZK上無(wú)此任務(wù),則先將該任務(wù)對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)表的數(shù)據(jù)根據(jù)分片條件進(jìn)行清除;數(shù)據(jù)庫(kù)中為正在執(zhí)行且當(dāng)前ZK上有此任務(wù),不做處理直接退出;數(shù)據(jù)庫(kù)中為執(zhí)行失敗的任務(wù),則先將該任務(wù)對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)表的數(shù)據(jù)根據(jù)分片條件進(jìn)行清除;數(shù)據(jù)庫(kù)中狀態(tài)為成功的,不做處理直接退出;(3)出口:命令執(zhí)行完更新子任務(wù)狀態(tài)表,刪除ZK上任務(wù)記錄,如成功則簽收消息,如失敗則將消息回退至隊(duì)列或直接退出。子任務(wù)執(zhí)行成功后查詢?cè)摽側(cè)蝿?wù)的其他子任務(wù)是否都完成,如果是則將總?cè)蝿?wù)狀態(tài)更新為完成。
1.3負(fù)載均衡
由于管理進(jìn)程控制整個(gè)主機(jī)DataX進(jìn)程的數(shù)量,在資源不滿時(shí)且未達(dá)最高設(shè)置的閥值時(shí)啟動(dòng)新的DataX進(jìn)程,資源滿負(fù)荷(CPU、內(nèi)存等使用率超過(guò)設(shè)定閥值)時(shí)不再獲啟動(dòng),而DataX為主動(dòng)獲取任務(wù)模式,所以不同主機(jī)問(wèn)將自然達(dá)到負(fù)載均衡。且不同主機(jī)的性能不同可以為不同的主機(jī)配置不同DataX最大并發(fā)進(jìn)程數(shù)。
1.4高可用
1)配置與任務(wù)管理數(shù)據(jù)庫(kù)。采用主從或雙寫方式保障高可用。
2)消息平臺(tái)。在單節(jié)點(diǎn)發(fā)生故障產(chǎn)生主從切換時(shí),會(huì)造成任務(wù)消息全部退回并被重新分配,由于DataX初始化處理時(shí)會(huì)先到數(shù)據(jù)庫(kù)及ZK判斷任務(wù)狀態(tài),故可保證任務(wù)不被2個(gè)或以上的進(jìn)程同時(shí)執(zhí)行。
3)數(shù)據(jù)交換集群。(1)DataX進(jìn)程異常。會(huì)和消息服務(wù)器斷開連接,它所取走的消息因未簽收會(huì)自動(dòng)回退到隊(duì)列中(消息平臺(tái)保障),并能將次消息重新分配給其中一臺(tái)主機(jī)上的DataX;(2)管理進(jìn)程異常。不會(huì)再啟動(dòng)新的DataX,在管理重新啟動(dòng)前,DataX的所有進(jìn)程最終都會(huì)處理完任務(wù)而退出,等于該主機(jī)失去處理能力,整個(gè)集群仍然可以處理任務(wù),只是處理的性能降低;(3)主機(jī)宕機(jī)。所有DataX進(jìn)程和消息平臺(tái)連接斷開,此時(shí)該機(jī)上正在處理的子任務(wù)消息因未簽收全部自動(dòng)回退到隊(duì)列中(消息平臺(tái)保障),并能將次消息重新分配給其他主機(jī)。(4)處理機(jī)網(wǎng)絡(luò)異常。DataX的進(jìn)程會(huì)失敗并退出,任務(wù)消息退回隊(duì)列,并和ZK斷開連接,任務(wù)從ZK上消失,由于DataX初始化處理時(shí)會(huì)判斷ZK上任務(wù)狀態(tài),故可保證任務(wù)被重新分配和執(zhí)行。
綜上所述,系統(tǒng)不存在任何模塊的單點(diǎn)故障,也不會(huì)產(chǎn)生任務(wù)被2個(gè)進(jìn)程同時(shí)處理的情況。
2結(jié)論
傳統(tǒng)的數(shù)據(jù)交換系統(tǒng)存在單機(jī)不可擴(kuò)展、并發(fā)性不高、單點(diǎn)故障等問(wèn)題。采用分布式數(shù)據(jù)交換平臺(tái)后,采用集群化的架構(gòu)使得數(shù)據(jù)交換任務(wù)可以并發(fā)進(jìn)行,并可以不斷擴(kuò)展,而且消除了單獨(dú)故障問(wèn)題,任何一臺(tái)主機(jī)出現(xiàn)故障不影響正常處理,并且整個(gè)處理過(guò)程均能得到較好的監(jiān)控。endprint