(廈門安勝網(wǎng)絡(luò)科技有限公司 福建 361008)
隨著分布式系統(tǒng)及各種云系統(tǒng),大數(shù)據(jù)應(yīng)用的出現(xiàn),人們對(duì)數(shù)據(jù)的計(jì)算需求越來越高,尤其對(duì)目前機(jī)器計(jì)算能力不能滿足人們對(duì)海量數(shù)據(jù)的分析和統(tǒng)計(jì),機(jī)群計(jì)算的架構(gòu)便時(shí)興起來,如分布式集群計(jì)算,云計(jì)算,邊緣計(jì)算等。在這些分散的機(jī)器間的計(jì)算數(shù)據(jù),各計(jì)算機(jī)器分任務(wù)跑批數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行清洗、集成、變換、歸約等處理[1],急切需要協(xié)同作業(yè)任務(wù)來協(xié)調(diào)各機(jī)器間的任務(wù)管理和數(shù)據(jù)匯聚。如果機(jī)器間有了一份共享同步數(shù)據(jù)區(qū)塊的話,那么不同機(jī)器間的協(xié)同作業(yè)問題便能很好的得到解決,包括分布式系統(tǒng)間的SESSION 同步問題。本文以JAVA語言為基礎(chǔ)編程語言說明分布式機(jī)群的數(shù)據(jù)共享及同步。
圖1為機(jī)群服務(wù)網(wǎng)絡(luò)圖。S1到S10為各計(jì)算服務(wù),這里我們以一臺(tái)機(jī)器作為一個(gè)單實(shí)例進(jìn)程來說明多臺(tái)機(jī)器或多個(gè)JVM 實(shí)例間的數(shù)據(jù)共享。機(jī)群間的數(shù)據(jù)共享多以星狀架構(gòu)方案為主。其中中心服務(wù)也可以是機(jī)群服務(wù),向外暴露統(tǒng)一的服務(wù)接口,當(dāng)然也遵循CAP 定理:保證一致性Consistency,可用性[2]Availability,分區(qū)容錯(cuò)Partition tolerance。其中共享數(shù)據(jù)塊可以通過值鍵對(duì)的形式進(jìn)行傳輸存儲(chǔ),也可進(jìn)行系列化等形式進(jìn)行傳輸存儲(chǔ)。下面介紹幾種共享數(shù)據(jù)的實(shí)現(xiàn)模式。
圖1 機(jī)群服務(wù)網(wǎng)絡(luò)圖
創(chuàng)建一個(gè)(也可以是一組)專門的服務(wù),讓其他任務(wù)都能訪問。如SOCKET、WEBSERVICE、RPC 等服務(wù),通過雙方約定服務(wù)標(biāo)準(zhǔn)進(jìn)行協(xié)同作業(yè)。把要同步共享的數(shù)據(jù)都傳到這個(gè)協(xié)同服務(wù)上[3],由協(xié)同服務(wù)統(tǒng)一處理,響應(yīng)給各任務(wù)請(qǐng)求,從而實(shí)現(xiàn)數(shù)據(jù)同步及數(shù)據(jù)一致性。
圖2 機(jī)群服務(wù)星狀圖—協(xié)同服務(wù)
(1)SOCKET服務(wù)方式:服務(wù)端通過套接字服務(wù)對(duì)端口進(jìn)行監(jiān)聽,與客戶端通過字節(jié)流傳輸數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的共享。
(2)WEBSERVICE服務(wù)方式:可以通過APACHE的Axis2進(jìn)行搭建,也可以通過SPRINGBOOT微服務(wù)進(jìn)行REST服務(wù)的構(gòu)建,傳輸協(xié)議可以為XML或JSON等進(jìn)行字符串系列化[4],再用標(biāo)準(zhǔn)工具對(duì)其進(jìn)行解構(gòu)生成OO對(duì)象或是MAP值鍵,從而實(shí)現(xiàn)數(shù)據(jù)的共享。
各服務(wù)端把數(shù)據(jù)匯聚存到數(shù)據(jù)集中(結(jié)構(gòu)化數(shù)據(jù)庫MYSQL、ORACLE 等,非結(jié)構(gòu)化數(shù)據(jù)庫MONGO 等,緩存服務(wù)(REDIS,MENCACHE 等或消息隊(duì)列(如KALFKA 等)。各服務(wù)機(jī)器訪問統(tǒng)一的數(shù)據(jù)庫或訂閱主題服務(wù)從而獲取共享數(shù)據(jù)。
(1)數(shù)據(jù)庫中心方式:各服務(wù)器通過JDBC 或ODBC 等方式把數(shù)據(jù)系列化后存入結(jié)構(gòu)化數(shù)據(jù)庫表,各服務(wù)器通過和中心數(shù)據(jù)庫進(jìn)行交互通信實(shí)現(xiàn)對(duì)數(shù)據(jù)的刪除更新獲取操用,從而共享及同步數(shù)據(jù)。
(2)緩存服務(wù)中心方式:各服務(wù)器通過值鍵對(duì)數(shù)據(jù)構(gòu)造MAP數(shù)據(jù)存儲(chǔ)到緩存,各服務(wù)再通過訪問統(tǒng)一緩存服務(wù)刪除更新獲取共享數(shù)據(jù)。
(3)消息隊(duì)列方式:各服務(wù)器通過消息隊(duì)列服務(wù)把數(shù)據(jù)以值鍵對(duì)的形式存入消息隊(duì)列中,再通過消息隊(duì)列獲取共享數(shù)據(jù),以實(shí)現(xiàn)數(shù)據(jù)共享。
以KALFKA為例:
通過值鍵對(duì),進(jìn)行主題消息推送代碼如下:
對(duì)主題進(jìn)行接收:
各服務(wù)器通過對(duì)KAFKA服務(wù)中的主題信息進(jìn)行消息處理,從而實(shí)現(xiàn)數(shù)據(jù)共享。
對(duì)各實(shí)例進(jìn)程進(jìn)行通知,如Hazelcast 等。以下以Hazelcast為例:
Hazelcast是一個(gè)內(nèi)存分布式計(jì)算平臺(tái),用于管理數(shù)據(jù)并并行執(zhí)行應(yīng)用程序。它用JAVA 編寫,與其他一些內(nèi)存數(shù)據(jù)庫(如redis)不同,Hazelcast是多線程的,這意味著可從所有可用的CPU內(nèi)核中受益。與其他內(nèi)存數(shù)據(jù)網(wǎng)格不同,它設(shè)計(jì)用于分布式環(huán)境。它支持每個(gè)群集無限數(shù)量的map和緩存。根據(jù)基準(zhǔn)測(cè)試,Hazelcast在獲取數(shù)據(jù)方面比Redis 快56%,在設(shè)置數(shù)據(jù)方面比Redis 快44%。項(xiàng)目中加入只需引入JAR 包.Hazelcast是集群的,數(shù)據(jù)可以在許多應(yīng)用程序?qū)嵗g共享。
以下為Hazelcast存取數(shù)據(jù)塊的代碼:
存入:
有了共享數(shù)據(jù),在機(jī)群中就可以方便我們?cè)跈C(jī)群中進(jìn)行分布式計(jì)算。把一個(gè)大的需要高性能要求的任務(wù)進(jìn)行分解為多個(gè)的低性能要求的子任務(wù)進(jìn)程或線程進(jìn)行計(jì)算,通過共享數(shù)據(jù)塊中的置標(biāo)識(shí)值位來跟進(jìn)任務(wù)的執(zhí)行狀態(tài),當(dāng)所有的數(shù)據(jù)都計(jì)算完成后再把共享數(shù)據(jù)塊中的標(biāo)識(shí)置完結(jié)狀態(tài),各子任務(wù)把結(jié)果進(jìn)行匯聚,從而得到并行計(jì)算后的結(jié)果,大大減少計(jì)算時(shí)間,讓響應(yīng)更實(shí)時(shí)。
有了共享數(shù)據(jù)塊,SESSION的共享就方便了。把SESSION對(duì)象直接通過鍵值對(duì)存入共享數(shù)據(jù)塊,通過MapReduce模式進(jìn)行對(duì)SESSION 進(jìn)行增刪改查,從而實(shí)現(xiàn)SESSION 共享。
有了共享數(shù)據(jù)塊,各服務(wù)就不再獨(dú)立,他們互相聯(lián)系、相互協(xié)用、互補(bǔ)資源,讓服務(wù)資源得到合理應(yīng)用,也方便各服務(wù)狀態(tài)的指標(biāo)的匯聚和管理,方便各服務(wù)器間的負(fù)載分配。
分布式計(jì)算中,數(shù)據(jù)共享占據(jù)了至關(guān)重要的地位,只有通過數(shù)據(jù)共享,才能達(dá)到各機(jī)器間通信,各機(jī)器群間的協(xié)調(diào)處理,共同計(jì)算,為計(jì)算縮減時(shí)間,為計(jì)算贏取時(shí)間。