本發(fā)明屬于計(jì)算機(jī)領(lǐng)域,涉及一種數(shù)據(jù)存儲(chǔ)的高可用框架,特別是涉及單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng);此外,本發(fā)明還涉及該單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng)的實(shí)現(xiàn)方法。
背景技術(shù):
現(xiàn)有技術(shù)是由國(guó)外團(tuán)隊(duì)開發(fā)的一款單點(diǎn)部署數(shù)據(jù)儲(chǔ)存的高可用框架(見圖1)。
圖1中,各模塊說(shuō)明如下:
1.dyno:現(xiàn)有的單點(diǎn)存儲(chǔ)高可用框架。
2.dyno-client:現(xiàn)有框架的客戶端類庫(kù)。
3.dyno-proxy:現(xiàn)有框架的數(shù)據(jù)存儲(chǔ)代理服務(wù)。
4.Single Server DataStore:?jiǎn)吸c(diǎn)部署的同構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù)。
5.Rack A/B:?jiǎn)吸c(diǎn)部署存儲(chǔ)服務(wù)器,由dyno-proxy和Single Server DataStore組成。該框架可以讓只能單點(diǎn)部署的同構(gòu)數(shù)據(jù)儲(chǔ)存做到集群部署,通過(guò)該框架的客戶端(dyno-client)在對(duì)某一節(jié)點(diǎn)進(jìn)行數(shù)據(jù)寫入操作時(shí)(write request),框架的代理服務(wù)(dyno-proxy)會(huì)將寫操作同步到集群中其他節(jié)點(diǎn)完成數(shù)據(jù)同步寫入(sync write request)。寫入操作時(shí)單個(gè)節(jié)點(diǎn)出現(xiàn)故障,客戶端和代理服務(wù)會(huì)選擇其他可用節(jié)點(diǎn)完成數(shù)據(jù)寫入。單個(gè)節(jié)點(diǎn)故障不會(huì)影響其他節(jié)點(diǎn)的數(shù)據(jù)寫入,從而實(shí)現(xiàn)單點(diǎn)數(shù)據(jù)存儲(chǔ)的高可用寫入功能。
同樣,依賴現(xiàn)有框架的數(shù)據(jù)讀取節(jié)點(diǎn)選擇功能,通過(guò)框架客戶端發(fā)起數(shù)據(jù)讀取操作時(shí)(read request),該客戶端會(huì)從集群中找出一個(gè)可用節(jié)點(diǎn),并從該節(jié)點(diǎn)進(jìn)行數(shù)據(jù)讀取,如果節(jié)點(diǎn)無(wú)需要的數(shù)據(jù),代理服務(wù)會(huì)將讀取請(qǐng)求轉(zhuǎn)發(fā)到數(shù)據(jù)所在節(jié)點(diǎn)(forward read request)。讀取操作時(shí)單個(gè)節(jié)點(diǎn)出現(xiàn)故障,客戶端和代理服務(wù)會(huì)跳過(guò)該節(jié)點(diǎn)選擇下一個(gè)可用節(jié)點(diǎn)進(jìn)行數(shù)據(jù)讀取,通過(guò)這種方式實(shí)現(xiàn)了單點(diǎn)數(shù)據(jù)存儲(chǔ)的高可用讀取功能。
現(xiàn)有框架目前存在如下幾個(gè)缺點(diǎn):
1.現(xiàn)有框架僅支持兩個(gè)主流NoSQL數(shù)據(jù)庫(kù)的同構(gòu)數(shù)據(jù)同步,不支持異構(gòu)數(shù)據(jù)同步,現(xiàn)有框架在設(shè)計(jì)之初就并未將異構(gòu)數(shù)據(jù)同步納入實(shí)現(xiàn)目標(biāo)之中。
2.現(xiàn)有框架不支持故障數(shù)據(jù)恢復(fù)功能,現(xiàn)有框架是為了解決單點(diǎn)數(shù)據(jù)存儲(chǔ)的高可用問(wèn)題,故障恢復(fù)并未作為核心功能列入實(shí)現(xiàn)列表中。目前只能靠人工方式手工從其他節(jié)點(diǎn)拷貝數(shù)據(jù)到故障節(jié)點(diǎn)恢復(fù)數(shù)據(jù),每個(gè)數(shù)據(jù)存儲(chǔ)的恢復(fù)方式都有所不同,數(shù)據(jù)恢復(fù)的復(fù)雜性可見一斑。
3.現(xiàn)有框架僅支持部署在Linux/Unix操作系統(tǒng),跨平臺(tái)性稍弱。框架的所有構(gòu)建腳本使用shell命令,限制其在windows平臺(tái)上無(wú)法進(jìn)行構(gòu)建和編譯。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問(wèn)題在于提供一種單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng),可支持更多數(shù)據(jù)存儲(chǔ)類型,支持異構(gòu)數(shù)據(jù)之間的數(shù)據(jù)同步,還可支持節(jié)點(diǎn)故障時(shí)的數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)功能。為此,本發(fā)明還提供該系統(tǒng)的實(shí)現(xiàn)方法。
為解決上述技術(shù)問(wèn)題,本發(fā)明提供一種單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng),包括:
客戶端類庫(kù)ti-a59-client,提供單點(diǎn)異構(gòu)數(shù)據(jù)的高可用讀寫操作;
異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù)模塊ti-a59-builder,用于接收由客戶端類庫(kù)ti-a59-client提交的寫入數(shù)據(jù),轉(zhuǎn)換為異構(gòu)數(shù)據(jù)存儲(chǔ)支持的格式并寫入到單點(diǎn)數(shù)據(jù)存儲(chǔ)中;
數(shù)據(jù)寫操作日志服務(wù)模塊ti-a59-log-srv,用于存儲(chǔ)節(jié)點(diǎn)故障后的數(shù)據(jù)恢復(fù)和新增節(jié)點(diǎn)時(shí)的數(shù)據(jù)初始化;
數(shù)據(jù)隊(duì)列框架ti-queue,為數(shù)據(jù)寫操作提供高可用性支持;
消息隊(duì)列服務(wù)模塊MQ Server,為系統(tǒng)提供數(shù)據(jù)寫請(qǐng)求的路由、復(fù)制和持久化功能;
單點(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù)器Single Server DataStore,負(fù)責(zé)異構(gòu)數(shù)據(jù)的存儲(chǔ),并提供數(shù)據(jù)寫入和讀取接口;
寫請(qǐng)求日志服務(wù)數(shù)據(jù)存儲(chǔ)模塊Write Log DataStore,保存數(shù)據(jù)寫操作日志服務(wù)模塊ti-a59-log-srv收到的數(shù)據(jù)寫操作,用于故障后或新增a59存儲(chǔ)節(jié)點(diǎn)時(shí)的數(shù)據(jù)同步;
寫請(qǐng)求控制日志數(shù)據(jù)存儲(chǔ)模塊Ctrl Log DataStore,保存當(dāng)前a59存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)寫操作的執(zhí)行日志,確保同一個(gè)數(shù)據(jù)寫操作不會(huì)被多次執(zhí)行。
作為本發(fā)明優(yōu)選的技術(shù)方案,所述客戶端類庫(kù)ti-a59-client提供數(shù)據(jù)寫操作會(huì)將數(shù)據(jù)進(jìn)行壓縮并經(jīng)由數(shù)據(jù)隊(duì)列框架ti-queue分發(fā)到各a59存儲(chǔ)節(jié)點(diǎn),所有節(jié)點(diǎn)都會(huì)收到相同的數(shù)據(jù)并完成數(shù)據(jù)寫入;所述客戶端類庫(kù)ti-a59-client提供數(shù)據(jù)讀操作是基于單點(diǎn)數(shù)據(jù)存儲(chǔ)原生API,通過(guò)TCP/HTTP Proxy代理的負(fù)載均衡算法將讀請(qǐng)求發(fā)送至任意一個(gè)可用的a59存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)讀取。
作為本發(fā)明優(yōu)選的技術(shù)方案,所述TCP/HTTP Proxy是提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理軟件,通過(guò)配合HA軟件實(shí)現(xiàn)對(duì)于a59存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù)的高可用讀取操作;所述TCP/HTTP Proxy軟件使用HAProxy+Keepalived實(shí)現(xiàn),HAProxy是一款開源,完全免費(fèi)的TCP/HTTP Proxy代理軟件,Keepalived是集群管理中保證集群高可用的一個(gè)開源服務(wù)軟件,能避免HAProxy出現(xiàn)單點(diǎn)故障,確保HAProxy自身的高可用性;基于TCP/HTTP Proxy,業(yè)務(wù)服務(wù)便能實(shí)現(xiàn)對(duì)于a59存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù)的高可用讀取操作。
作為本發(fā)明優(yōu)選的技術(shù)方案,一個(gè)所述異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù)模塊ti-a59-builder與一個(gè)所述單點(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù)器Single Server DataStore一起構(gòu)成一個(gè)所述a59存儲(chǔ)節(jié)點(diǎn);為了確保數(shù)據(jù)讀寫的高可用性,一套環(huán)境中需要搭建2個(gè)以上的a59存儲(chǔ)節(jié)點(diǎn);所述異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù)模塊ti-a59-builder為了確保寫數(shù)據(jù)請(qǐng)求的冪等性,在每次寫數(shù)據(jù)之前會(huì)通過(guò)訪問(wèn)所述寫請(qǐng)求控制日志數(shù)據(jù)存儲(chǔ)模塊Ctrl Log DataStore確保相同的數(shù)據(jù)數(shù)據(jù)不會(huì)被重復(fù)寫入。
作為本發(fā)明優(yōu)選的技術(shù)方案,所述客戶端類庫(kù)ti-a59-client提交的數(shù)據(jù)寫請(qǐng)求通過(guò)所述數(shù)據(jù)隊(duì)列框架ti-queue復(fù)制到各a59實(shí)例存儲(chǔ)節(jié)點(diǎn)的同時(shí)也會(huì)復(fù)制一份數(shù)據(jù)到所述數(shù)據(jù)寫操作日志服務(wù)模塊ti-a59-log-srv,ti-a59-log-srv會(huì)將寫操作序列化到日志存儲(chǔ),日志數(shù)據(jù)用于后續(xù)節(jié)點(diǎn)故障或新增時(shí)的數(shù)據(jù)恢復(fù);ti-a59-log-srv默認(rèn)策略是保留7天內(nèi)的數(shù)據(jù)日志,每天會(huì)清理掉7天以前的數(shù)據(jù)。
作為本發(fā)明優(yōu)選的技術(shù)方案,所述數(shù)據(jù)隊(duì)列框架ti-queue與ti-a59集成時(shí)主要基于所述消息隊(duì)列服務(wù)模塊MQ Server完成消息復(fù)制,將所述客戶端類庫(kù)ti-a59-client提交的數(shù)據(jù)復(fù)制到每個(gè)a59存儲(chǔ)節(jié)點(diǎn)以及所述數(shù)據(jù)寫操作日志服務(wù)模塊ti-a59-log-srv日志節(jié)點(diǎn)。
作為本發(fā)明優(yōu)選的技術(shù)方案,所述消息隊(duì)列服務(wù)模塊MQ Server采用RabbitMQ服務(wù)作為a59消息中間件;當(dāng)異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù)模塊ti-a59-builder或數(shù)據(jù)寫操作日志服務(wù)模塊ti-a59-log-srv故障未正常連接時(shí),將數(shù)據(jù)存儲(chǔ)在消息隊(duì)列服務(wù)模塊中,確保消息不丟失,等到ti-a59-builder或ti-a59-log-srv重連后繼續(xù)處理隊(duì)列中的數(shù)據(jù);由多臺(tái)所述消息隊(duì)列服務(wù)模塊MQ Server組建的集群構(gòu)成MQ Server Cluster,確保MQ Server自身的高可用性。
此外,本發(fā)明還提供一種采用上述系統(tǒng)實(shí)現(xiàn)異步數(shù)據(jù)寫入的方法,包括如下步驟:
1)應(yīng)用程序在發(fā)起異步數(shù)據(jù)寫入操作時(shí),通過(guò)調(diào)用ti-a59-client的Writer將數(shù)據(jù)寫入各a59存儲(chǔ)節(jié)點(diǎn);
2)Writer為數(shù)據(jù)添加寫入時(shí)間戳和唯一標(biāo)識(shí)后調(diào)用ti-queue的Queue將數(shù)據(jù)加入隊(duì)列;
3)ti-queue將入隊(duì)數(shù)據(jù)進(jìn)行序列化并組裝成消息對(duì)象;
4)ti-queue將消息對(duì)象發(fā)送到MQ Server中對(duì)應(yīng)的MQ Broker上;ti-a59-client在初始化時(shí)需要指定a59存儲(chǔ)節(jié)點(diǎn)的組號(hào),一個(gè)組號(hào)對(duì)應(yīng)一個(gè)MQ Broker;
5)MQ Broker收到消息后,依靠消息復(fù)制分發(fā)機(jī)制,將消息寫入所有綁定的所有queue中;
6)ti-a59-builder在收到消息后,會(huì)進(jìn)行反序列化和解壓縮得到原始數(shù)據(jù);
7)ti-a59-builder會(huì)根據(jù)數(shù)據(jù)的寫入時(shí)間和唯一標(biāo)識(shí)到Ctrl Log DataStore中進(jìn)行檢查;
8)如果寫入操作并未執(zhí)行過(guò),則調(diào)用Builder發(fā)起數(shù)據(jù)寫入操作;
9)ti-a59-Builder收到數(shù)據(jù)后,調(diào)用用戶指定的數(shù)據(jù)轉(zhuǎn)換代碼并通過(guò)調(diào)用Single Server DataStore的標(biāo)準(zhǔn)API完成數(shù)據(jù)寫入;
10)寫入成功后,ti-a59-builder記錄一條寫操作日志到Ctrl Log DataStore。
為此,本發(fā)明還提供一種上述系統(tǒng)實(shí)現(xiàn)同步寫數(shù)據(jù)的方法,包括如下步驟:
1)應(yīng)用程序在發(fā)起數(shù)據(jù)同步寫入操作時(shí),需要先調(diào)用ti-a59-client的Scenario啟動(dòng)一個(gè)場(chǎng)景,場(chǎng)景的作用是用于和一個(gè)a59數(shù)據(jù)存儲(chǔ)進(jìn)行關(guān)聯(lián);
2)場(chǎng)景創(chuàng)建完畢后,通過(guò)調(diào)用ti-a59-client的Writer將數(shù)據(jù)寫入各a59存儲(chǔ)節(jié)點(diǎn);
3)Writer收到同步寫請(qǐng)求時(shí),會(huì)從Scenario中讀取當(dāng)前綁定a59存儲(chǔ)節(jié)點(diǎn),如果指定則會(huì)等待指定節(jié)點(diǎn)的寫操作返回結(jié)果,如果不指定,則等待第一個(gè)返回的寫操作結(jié)果;
4)Writer為數(shù)據(jù)添加寫入時(shí)間戳和唯一標(biāo)識(shí)后調(diào)用ti-queue的Queue將數(shù)據(jù)加入隊(duì)列;
5)ti-queue將入隊(duì)數(shù)據(jù)進(jìn)行序列化并組裝成消息對(duì)象;
6)ti-queue將消息對(duì)象發(fā)送到對(duì)應(yīng)的MQ Broker上;ti-a59-client在初始化時(shí)需要指定a59存儲(chǔ)節(jié)點(diǎn)的組號(hào),一個(gè)組號(hào)對(duì)應(yīng)一個(gè)MQ Broker;
7)MQ Broker收到消息后,依靠消息復(fù)制分發(fā)機(jī)制,將消息寫入所有綁定的所有queue中;
8)ti-a59-builder在收到消息后,會(huì)進(jìn)行反序列化和解壓縮得到原始數(shù)據(jù);
9)ti-a59-builder會(huì)根據(jù)數(shù)據(jù)的寫入時(shí)間和唯一標(biāo)識(shí)到Ctrl Log DataStore中進(jìn)行檢查;
10)如果寫入操作并未執(zhí)行過(guò),則調(diào)用Builder發(fā)起數(shù)據(jù)寫入操作;
11)ti-a59-Builder收到數(shù)據(jù)后,調(diào)用用戶指定的數(shù)據(jù)轉(zhuǎn)換代碼并通過(guò)調(diào)用Single Server DataStore的標(biāo)準(zhǔn)API完成數(shù)據(jù)寫入;
12)寫入成功后,ti-a59-builder記錄一條寫操作日志到Ctrl Log DataStore;
13)ti-a59-builder會(huì)將寫操作的結(jié)果通過(guò)MQ Server、ti-queue發(fā)送到由發(fā)起寫請(qǐng)求的ti-a59-client監(jiān)聽的指定隊(duì)列中,最終由當(dāng)時(shí)發(fā)起寫操作的Writer收到寫操作應(yīng)答;
14)如果步驟1)創(chuàng)建場(chǎng)景時(shí)未指定節(jié)點(diǎn),那么會(huì)將返回的節(jié)點(diǎn)編號(hào)更新到場(chǎng)景中,以便后續(xù)寫操作能鎖定在同一個(gè)節(jié)點(diǎn)上;
15)調(diào)用Scenario整個(gè)同步調(diào)用過(guò)程。
為此,本發(fā)明還提供一種上述系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)讀取的方法,ti-a59的數(shù)據(jù)讀取是基于單點(diǎn)數(shù)據(jù)存儲(chǔ)原生API,通過(guò)TCP/HTTP Proxy代理的負(fù)載均衡算法將讀請(qǐng)求發(fā)送至任意一個(gè)可用的a59存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)讀取,具體包括如下步驟:
1)應(yīng)用程序調(diào)用Single Server DataStore的原生API發(fā)起數(shù)據(jù)讀取操作;原生API指向ti-a59的TCP/HTTP Proxy所在地址;
2)TCP/HTTP Proxy根據(jù)負(fù)載均衡算法,將讀取請(qǐng)求轉(zhuǎn)發(fā)到一臺(tái)可用的單點(diǎn)數(shù)據(jù)存儲(chǔ)服務(wù)器上完成讀取操作,并原路將讀取結(jié)果返回給應(yīng)用程序。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果在于:
1、本發(fā)明除了包含現(xiàn)有框架的單點(diǎn)部署存儲(chǔ)的高可用性支持的特性之外,還有具備了更強(qiáng)的跨平臺(tái)部署能力,以及異構(gòu)數(shù)據(jù)同步和故障數(shù)據(jù)恢復(fù)等現(xiàn)有框架無(wú)法支持的重要特性。提供了一套更為完善,數(shù)據(jù)可靠性更高,框架可擴(kuò)展性更強(qiáng)的單點(diǎn)部署數(shù)據(jù)存儲(chǔ)高可用化實(shí)現(xiàn)方案。
2.本發(fā)明為單點(diǎn)數(shù)據(jù)存儲(chǔ)提供通用的高可用性支持,支持多節(jié)點(diǎn)同時(shí)寫入、負(fù)載均衡策略下的數(shù)據(jù)讀取和并保證數(shù)據(jù)的一致性。相比現(xiàn)有技術(shù)僅支持Linux/Unix操作系統(tǒng),而本發(fā)明的框架可以部署在幾乎所有主流操作系統(tǒng)上?,F(xiàn)有技術(shù)支持2種數(shù)據(jù)存儲(chǔ)類型,本發(fā)明的框架則支持更多數(shù)據(jù)存儲(chǔ)類型。
3.支持異構(gòu)數(shù)據(jù)之間的數(shù)據(jù)同步,比如將關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)同步到圖數(shù)據(jù)庫(kù)中,或?qū)㈥P(guān)系數(shù)據(jù)同時(shí)寫入NoSQL數(shù)據(jù)庫(kù)中,現(xiàn)有技術(shù)目前不支持異構(gòu)數(shù)據(jù)之間的同步。
4.支持節(jié)點(diǎn)故障時(shí)的數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)功能,現(xiàn)有技術(shù)目前不具備故障后數(shù)據(jù)恢復(fù)功能。
附圖說(shuō)明
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明進(jìn)一步說(shuō)明。
圖1是現(xiàn)有單點(diǎn)部署數(shù)據(jù)儲(chǔ)存的高可用框架的結(jié)構(gòu)示意圖;其中,dyno:現(xiàn)行的單點(diǎn)存儲(chǔ)高可用框架;dyno-client:現(xiàn)行框架的客戶端類庫(kù);dyno-proxy:現(xiàn)行框架的數(shù)據(jù)存儲(chǔ)代理服務(wù);Single Server DataStore:?jiǎn)吸c(diǎn)部署的同構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù);Rack A/B:?jiǎn)吸c(diǎn)部署存儲(chǔ)服務(wù)器,由dyno-proxy和Single Server DataStore組成。
圖2是本發(fā)明單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng)的結(jié)構(gòu)示意圖;其中,ti-a59:本專利申請(qǐng)的單點(diǎn)異構(gòu)存儲(chǔ)高可用框架;ti-a59-client:ti-a59的客戶端類庫(kù);ti-a59-builder:ti-a59的異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù);ti-a59-log-srv:ti-a59的數(shù)據(jù)寫操作日志服務(wù);ti-queue:ti-59內(nèi)置通用的數(shù)據(jù)隊(duì)列框架;MQ Server:消息隊(duì)列服務(wù);MQ Server Cluster:由多臺(tái)MQ Server組建的集群;TCP/HTTP Proxy(HA):提供高可用性、負(fù)載均衡以及基于TCP/HTTP的代理軟件,并通過(guò)集群管理軟件保證代理軟件的高可用;Single Server DataStore:?jiǎn)吸c(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù);Write Log DataStore(HA):ti-a59的寫請(qǐng)求日志服務(wù)數(shù)據(jù)存儲(chǔ);Ctrl Log DataStore(HA):ti-a59的寫請(qǐng)求控制日志數(shù)據(jù)存儲(chǔ);A59Log Server:a59日志服務(wù)器,由ti-a59-log-srv與Write Log DataStore組成;A59Instance A/B:a59存儲(chǔ)節(jié)點(diǎn),由ti-a59-builder與Single Server DataStore組成。
圖3是本發(fā)明中異步寫數(shù)據(jù)的流程圖;其中,Application:應(yīng)用程序,調(diào)用ti-a59框架完成數(shù)據(jù)寫入;ti-a59-client.Writer:ti-a59-client中提供的Writer接口;ti-queue.AmqpQueue:基于AMQP高級(jí)消息隊(duì)列協(xié)議的ti-a59實(shí)現(xiàn)類;MQ Broker:消息隊(duì)列的消息控制器;ti-a59-builder.QueueWithReplyListener:ti-a59-builder的消息隊(duì)列監(jiān)聽器;Ctrl Log DataStore:保存寫操作控制日志的數(shù)據(jù)存儲(chǔ);ti-a59-builder.Builder:ti-a59-builder的內(nèi)置數(shù)據(jù)構(gòu)建器;Single Server DataStore:?jiǎn)吸c(diǎn)部署的數(shù)據(jù)存儲(chǔ)。
圖4是本發(fā)明中同步寫數(shù)據(jù)的流程圖;其中,Application:應(yīng)用程序,調(diào)用ti-a59框架完成數(shù)據(jù)寫入;ti-a59-client.Scenairo:ti-a59-client中調(diào)用場(chǎng)景,同步調(diào)用時(shí)需要開啟和關(guān)閉場(chǎng)景;ti-a59-client.Writer:ti-a59-client中提供的Writer接口;ti-queue.AmqpQueue:基于AMQP高級(jí)消息隊(duì)列協(xié)議的ti-a59實(shí)現(xiàn)類;MQ Broker:消息隊(duì)列的消息控制器;ti-a59-builder.QueueWithReplyListener:ti-a59-builder的消息隊(duì)列監(jiān)聽器;Ctrl Log DataStore:保存寫操作控制日志的數(shù)據(jù)存儲(chǔ);ti-a59-builder.Builder:ti-a59-builder的內(nèi)置數(shù)據(jù)構(gòu)建器;Single Server DataStore:?jiǎn)吸c(diǎn)部署的數(shù)據(jù)存儲(chǔ)。
圖5是本發(fā)明中數(shù)據(jù)讀取的流程圖;其中,Application:應(yīng)用程序,調(diào)用ti-a59框架的TCP/HTTP Proxy組件完成數(shù)據(jù)讀?。籇ataStore Native API:?jiǎn)吸c(diǎn)數(shù)據(jù)存儲(chǔ)提供的標(biāo)準(zhǔn)數(shù)據(jù)訪問(wèn)接口;TCP/HTTP Proxy:提供高可用性、負(fù)載均衡以及基于TCP/HTTP應(yīng)用代理軟件;Single Server DataStore:?jiǎn)吸c(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)。
具體實(shí)施方式
現(xiàn)在結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。這些附圖均為簡(jiǎn)化的示意圖,僅以示意方式說(shuō)明本發(fā)明的基本結(jié)構(gòu),因此其僅顯示與本發(fā)明有關(guān)的構(gòu)成。
一、如圖2所示,本發(fā)明單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng)的內(nèi)部組件介紹如下:
本發(fā)明的單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng)名為ti-a59。
ti-a59框架包含四個(gè)子項(xiàng)目ti-a59-client、ti-a59-builder、ti-a59-log-srv、ti-a59-share以及一個(gè)通用數(shù)據(jù)隊(duì)列實(shí)現(xiàn)框架ti-queue,所有項(xiàng)目代碼采用Java語(yǔ)言實(shí)現(xiàn)。
依賴Java語(yǔ)言的跨平臺(tái)性,本框架系統(tǒng)可以部署在幾乎所有主流操作系統(tǒng)中,而現(xiàn)有技術(shù)框架只能部署在Linux/Unix平臺(tái)之上。
1.下面對(duì)ti-a59整體方案中涉及的各組件和模塊進(jìn)行介紹(請(qǐng)參考圖2)。
1.1 ti-a59-client
ti-a59的客戶端類庫(kù),提供單點(diǎn)異構(gòu)數(shù)據(jù)的高可用讀寫操作。
數(shù)據(jù)寫操作會(huì)將數(shù)據(jù)進(jìn)行壓縮并經(jīng)由ti-queue框架分發(fā)到各a59存儲(chǔ)節(jié)點(diǎn),所有節(jié)點(diǎn)都會(huì)收到相同的數(shù)據(jù)并完成數(shù)據(jù)寫入。
數(shù)據(jù)讀操作是基于單點(diǎn)數(shù)據(jù)存儲(chǔ)原生API,通過(guò)TCP/HTTP Proxy代理的負(fù)載均衡算法將讀請(qǐng)求發(fā)送至任意一個(gè)可用的a59存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)讀取。
TCP/HTTP Proxy代理支持的復(fù)雜均衡算法一般有如下幾種:
1)RoundRobin:簡(jiǎn)單的輪詢,每個(gè)服務(wù)器根據(jù)權(quán)重輪流使用,在服務(wù)器的處理時(shí)間平均分配的情況下這是最流暢和公平的算法。
2)LeastConn:連接數(shù)最少的服務(wù)器優(yōu)先接收連接。
3)Source:對(duì)請(qǐng)求源IP地址進(jìn)行哈希,用可用服務(wù)器的權(quán)重總數(shù)除以哈希值,根據(jù)結(jié)果進(jìn)行分配。只要服務(wù)器正常,同一個(gè)客戶端IP地址總是訪問(wèn)同一個(gè)服務(wù)器。如果哈希的結(jié)果隨可用服務(wù)器數(shù)量而變化,那么客戶端會(huì)定向到不同的服務(wù)器。
1.2 ti-a59-builder
ti-a59的異構(gòu)數(shù)據(jù)轉(zhuǎn)換和存儲(chǔ)服務(wù)模塊,負(fù)責(zé)接收由ti-a59-client提交的寫入數(shù)據(jù),轉(zhuǎn)換為異構(gòu)數(shù)據(jù)存儲(chǔ)支持的格式并寫入到單點(diǎn)數(shù)據(jù)存儲(chǔ)中。
一個(gè)ti-a59-builder與單點(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)(Single Server DataStore)一起構(gòu)成一個(gè)a59存儲(chǔ)節(jié)點(diǎn)(Instance)。為了確保數(shù)據(jù)讀寫的高可用性,一套環(huán)境中至少需要搭建2個(gè)或以上的a59存儲(chǔ)節(jié)點(diǎn)。
ti-a59-builder為了確保寫數(shù)據(jù)請(qǐng)求的冪等性,在每次寫數(shù)據(jù)之前會(huì)通過(guò)訪問(wèn)控制日志(CtrlLog)確保相同的數(shù)據(jù)數(shù)據(jù)不會(huì)被重復(fù)寫入。
1.3 ti-a59-log-srv
ti-a59的數(shù)據(jù)寫操作日志服務(wù)模塊,用于a59存儲(chǔ)節(jié)點(diǎn)故障后的數(shù)據(jù)恢復(fù)和新增節(jié)點(diǎn)時(shí)的數(shù)據(jù)初始化。
ti-a59-client提交的數(shù)據(jù)寫請(qǐng)求通過(guò)ti-queue復(fù)制到各a59實(shí)例存儲(chǔ)節(jié)點(diǎn)的同時(shí)也會(huì)復(fù)制一份數(shù)據(jù)到ti-a59-log-srv,ti-a59-log-srv會(huì)將寫操作序列化到日志存儲(chǔ),日志數(shù)據(jù)可以用于后續(xù)節(jié)點(diǎn)故障或新增時(shí)的數(shù)據(jù)恢復(fù)。
ti-a59-log-srv默認(rèn)策略是保留7天內(nèi)的數(shù)據(jù)日志,每天會(huì)清理掉7天以前的數(shù)據(jù)。
1.4 ti-queue
ti-queue是一個(gè)通用的數(shù)據(jù)隊(duì)列框架,為ti-a59數(shù)據(jù)寫操作提供高可用性支持。與ti-a59集成時(shí)主要基于MQ Server完成消息復(fù)制,將ti-a59-client提交的數(shù)據(jù)復(fù)制到每個(gè)a59存儲(chǔ)節(jié)點(diǎn)以及ti-a59-log-srv日志節(jié)點(diǎn)。
2.ti-a59框架搭建時(shí)使用的中間件:
2.1 MQ Server
MQ Server是消息隊(duì)列服務(wù)模塊,為a59框架提供數(shù)據(jù)寫請(qǐng)求的路由、復(fù)制和持久化等功能。MQ Server有很多可選的開源實(shí)現(xiàn),作者比較推薦RabbitMQ服務(wù)作為a59消息中間件。
RabbitMQ是一個(gè)開源的消息隊(duì)列系統(tǒng),用elrang語(yǔ)言開發(fā),是AMQP(高級(jí)消息隊(duì)列協(xié)議)的標(biāo)準(zhǔn)實(shí)現(xiàn),支持消息的持久化。
當(dāng)ti-a59-builder或ti-a59-log-srv故障未正常連接時(shí),可將數(shù)據(jù)可以存儲(chǔ)在消息隊(duì)列服務(wù)模塊MQ Server中,確保消息不丟失,等到ti-a59-builder或ti-a59-log-srv重連后可繼續(xù)處理隊(duì)列中的數(shù)據(jù)。
MQ Server Cluster(圖2中采用RabbitMQ Cluster)是由多臺(tái)MQ Server組建的集群,確保MQ Server自身的高可用性。
2.2 TCP/HTTP Proxy(HA)
TCP/HTTP Proxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理軟件,通過(guò)配合HA軟件實(shí)現(xiàn)代理服務(wù)高可用性。
本實(shí)施例優(yōu)選使用HAProxy+Keepalived作為TCP/HTTP Proxy(HA)的實(shí)現(xiàn)。
HAProxy是一款開源,完全免費(fèi)的TCP/HTTP Proxy代理軟件。
Keepalived是集群管理中保證集群高可用的一個(gè)開源服務(wù)軟件,可避免HAProxy出現(xiàn)單點(diǎn)故障,確保HAProxy自身的高可用性。、
基于TCP/HTTP Proxy,業(yè)務(wù)服務(wù)便可實(shí)現(xiàn)對(duì)于a59存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù)的高可用讀取操作。
3.ti-a59框架涉及的數(shù)據(jù)存儲(chǔ):
3.1 Single Server DataStore
單點(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù)器,負(fù)責(zé)異構(gòu)數(shù)據(jù)的存儲(chǔ),并提供數(shù)據(jù)寫入和讀取接口。這些數(shù)據(jù)存儲(chǔ)自身沒有高可用的支持,也不支持異構(gòu)數(shù)據(jù)的同步功能。
ti-a59的目標(biāo)就是為了提供高可用的數(shù)據(jù)訪問(wèn)以及異構(gòu)數(shù)據(jù)同步功能。
在一個(gè)a59存儲(chǔ)節(jié)點(diǎn)集群中,可以同時(shí)部署不同類型的異構(gòu)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn),而現(xiàn)有框架的一個(gè)集群中所有存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)類型必須相同。
3.2 Write Log DataStore(HA)
ti-a59的寫請(qǐng)求日志服務(wù)數(shù)據(jù)存儲(chǔ),保存ti-a59-log-srv收到的數(shù)據(jù)寫操作,用于故障后或新增a59存儲(chǔ)節(jié)點(diǎn)時(shí)的數(shù)據(jù)同步。
本實(shí)施例優(yōu)選采用MySQL數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ),并采用Master+Slave+Keepalived部署方式確保日志存儲(chǔ)的高可用性(HA)。
3.3 Ctrl Log DataStore(HA)
ti-a59的寫請(qǐng)求控制日志數(shù)據(jù)存儲(chǔ),保存當(dāng)前a59存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)寫操作的執(zhí)行日志,確保同一個(gè)數(shù)據(jù)寫操作不會(huì)被多次執(zhí)行。
本實(shí)施例優(yōu)選采用MySQL數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ),并采用Master+Slave+Keepalived部署方式確保日志存儲(chǔ)的高可用性(HA)。
4.ti-a59的高可用數(shù)據(jù)讀寫支持
可以為單點(diǎn)部署的數(shù)據(jù)存儲(chǔ)提供高可用讀寫的能力,是ti-a59的主要特色和創(chuàng)新點(diǎn)之一。
應(yīng)用程序調(diào)用ti-a59-client發(fā)起的一次數(shù)據(jù)寫操作,這份數(shù)據(jù)會(huì)被同時(shí)寫入一組a59存儲(chǔ)節(jié)點(diǎn)的所有可用節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)都會(huì)寫入相同的數(shù)據(jù)。這些可用節(jié)點(diǎn)的數(shù)據(jù)類型可以相同,也可以不相同,依靠a59的異構(gòu)數(shù)據(jù)同步的功能,ti-a59-client的一次數(shù)據(jù)寫操作可以同時(shí)寫入不同類型的數(shù)據(jù)存儲(chǔ)中。
即使當(dāng)時(shí)有一個(gè)節(jié)點(diǎn)出現(xiàn)故障無(wú)法寫入時(shí),只要有至少一個(gè)可用節(jié)點(diǎn),可以保證本次寫入操作能正確執(zhí)行。
應(yīng)用程序發(fā)起的一次數(shù)據(jù)讀操作時(shí),ti-a59框架中的TCP/HTTP Proxy組件可以為本次讀取選擇一個(gè)可用a59存儲(chǔ)節(jié)點(diǎn),如果存在多個(gè)可用節(jié)點(diǎn),則會(huì)根據(jù)負(fù)載均衡算法選擇一個(gè)最佳訪問(wèn)節(jié)點(diǎn)。所以即使發(fā)起讀取操作某個(gè)節(jié)點(diǎn)出現(xiàn)故障,只要有至少一個(gè)可用節(jié)點(diǎn),就不會(huì)影響本次數(shù)據(jù)讀取操作。
對(duì)于寫操作,ti-a59支持異步和同步兩種不同的數(shù)據(jù)高可用數(shù)據(jù)寫入方式。對(duì)于讀操作,ti-a59提供了支持負(fù)載均衡方式的高可用數(shù)據(jù)讀取方式。
5.異構(gòu)數(shù)據(jù)同步
異構(gòu)數(shù)據(jù)同步作為ti-a59的重要特性之一,是現(xiàn)有技術(shù)目前所不支持的。
一組a59存儲(chǔ)節(jié)點(diǎn)集群支持部署不同數(shù)據(jù)類型的單點(diǎn)數(shù)據(jù)存儲(chǔ)服務(wù),支持異構(gòu)數(shù)據(jù)同步正是a59框架的特色之一,而現(xiàn)有框架的一個(gè)存儲(chǔ)集群中只支持部署相同類型的數(shù)據(jù)存儲(chǔ)。
ti-a59在進(jìn)行數(shù)據(jù)寫入的過(guò)程中(參考圖3和圖4),可以通過(guò)ti-a59-builder.Builder(ti-a59-builder的內(nèi)置數(shù)據(jù)構(gòu)建器)類完成異構(gòu)數(shù)據(jù)轉(zhuǎn)換和組裝。
不同的Builder實(shí)現(xiàn)了從Java類型數(shù)據(jù)到不同數(shù)據(jù)類型的轉(zhuǎn)換和數(shù)據(jù)寫入操作,通過(guò)在ti-a59-builder中配置不同的Builder實(shí)現(xiàn),就可以完成諸如在Neo4j、MemSQL、Redis,MemSQL、MySQL等各類數(shù)據(jù)庫(kù)之間的異構(gòu)數(shù)據(jù)同步。
6.存儲(chǔ)節(jié)點(diǎn)的故障數(shù)據(jù)恢復(fù)
ti-a59支持對(duì)于存儲(chǔ)節(jié)點(diǎn)故障數(shù)據(jù)恢復(fù)功能,這是現(xiàn)有框架所不支持的另一個(gè)重要特性。
由ti-a59-log-srv和Write Log DataStore一起構(gòu)建的數(shù)據(jù)寫入操作備份服務(wù),在每次數(shù)據(jù)寫入時(shí)會(huì)從MQ Server隊(duì)列中復(fù)制一份數(shù)據(jù)并進(jìn)行備份。
當(dāng)某個(gè)a59存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障重啟后,未寫入的數(shù)據(jù)請(qǐng)求會(huì)持久化保存在組件隊(duì)列中,當(dāng)節(jié)點(diǎn)重啟之后會(huì)自動(dòng)從隊(duì)列中獲取從故障時(shí)點(diǎn)之后的所有數(shù)據(jù)。
如果組件隊(duì)列中的數(shù)據(jù)意外丟失,還可以通過(guò)ti-a59-log-srv將故障時(shí)間點(diǎn)至今所有的數(shù)據(jù)批量導(dǎo)入至故障節(jié)點(diǎn)的ti-a59-builder中,ti-a59-builder會(huì)在保證數(shù)據(jù)寫入一致性的情況下,將所有節(jié)點(diǎn)未執(zhí)行過(guò)的數(shù)據(jù)變更操作全部重放一遍,以達(dá)到故障后數(shù)據(jù)恢復(fù)的目的。
同樣,故障數(shù)據(jù)恢復(fù)功能也可用于新增節(jié)點(diǎn)的數(shù)據(jù)初始化,新增節(jié)點(diǎn)加入a59存儲(chǔ)節(jié)點(diǎn)組時(shí)包含近7天內(nèi)的某一次數(shù)據(jù)全量備份,通過(guò)指定數(shù)據(jù)備份時(shí)間,ti-a59-log-srv會(huì)自動(dòng)將該時(shí)間點(diǎn)以后至今的所有數(shù)據(jù)批量同步到新增節(jié)點(diǎn)中。
二、本發(fā)明還提供上述單點(diǎn)異構(gòu)數(shù)據(jù)存儲(chǔ)的高可用框架系統(tǒng)的實(shí)現(xiàn)方法,具體參見圖3-圖5。
1、ti-a59的高可用數(shù)據(jù)讀寫支持,對(duì)于寫操作,ti-a59支持異步和同步兩種不同的數(shù)據(jù)高可用數(shù)據(jù)寫入方式。對(duì)于讀操作,ti-a59提供了支持負(fù)載均衡方式的高可用數(shù)據(jù)讀取方式。
1.1異步數(shù)據(jù)寫入
下面是一次異步數(shù)據(jù)寫入請(qǐng)求的調(diào)用的時(shí)序圖和內(nèi)部實(shí)現(xiàn)細(xì)節(jié)說(shuō)明(參見圖3):
1)應(yīng)用程序在發(fā)起異步數(shù)據(jù)寫入操作時(shí),通過(guò)調(diào)用ti-a59-client的Writer將數(shù)據(jù)寫入各a59存儲(chǔ)節(jié)點(diǎn),因?yàn)槭钱惒秸{(diào)用,應(yīng)用程序無(wú)需等待寫入操作應(yīng)答,直接可以執(zhí)行后續(xù)代碼。
2)Writer(ti-a59-client.Writer,ti-a59-client中提供的Writer接口)為數(shù)據(jù)添加寫入時(shí)間戳和唯一標(biāo)識(shí)后調(diào)用ti-queue將數(shù)據(jù)加入隊(duì)列。
3)ti-queue將入隊(duì)數(shù)據(jù)進(jìn)行序列化并組裝成消息對(duì)象,當(dāng)數(shù)據(jù)超過(guò)指定大小時(shí)會(huì)進(jìn)行壓縮操作。
4)ti-queue將消息對(duì)象發(fā)送到MQ Server中對(duì)應(yīng)的MQ Broker(消息隊(duì)列的消息控制器)上。ti-a59-client在初始化時(shí)需要指定a59存儲(chǔ)節(jié)點(diǎn)的組號(hào),一個(gè)組號(hào)對(duì)應(yīng)一個(gè)MQ Broker。
5)MQ Broker收到消息后,依靠消息復(fù)制分發(fā)機(jī)制,將消息寫入所有綁定的所有queue中,每個(gè)queue被一個(gè)a59存儲(chǔ)節(jié)點(diǎn)的ti-a59-builder服務(wù)監(jiān)聽。只要有消息進(jìn)入queue,就會(huì)被ti-a59-builder的QueueWithReplyListener接收并進(jìn)行處理。
6)ti-a59-builder在收到消息后,會(huì)進(jìn)行反序列化和解壓縮得到原始數(shù)據(jù)。
7)ti-a59-builder會(huì)根據(jù)數(shù)據(jù)的寫入時(shí)間和唯一標(biāo)識(shí)到Ctrl Log DataStore中進(jìn)行檢查,如果寫入操作已存在則忽略本次寫操作。
8)如果寫入操作并未執(zhí)行過(guò),則調(diào)用Builder發(fā)起數(shù)據(jù)寫入操作。
9)ti-a59-Builder收到數(shù)據(jù)后,調(diào)用用戶指定的數(shù)據(jù)轉(zhuǎn)換代碼并通過(guò)調(diào)用單點(diǎn)部署的異構(gòu)數(shù)據(jù)存儲(chǔ)服務(wù)器Single Server DataStore的標(biāo)準(zhǔn)API完成數(shù)據(jù)寫入。
10)寫入成功后,ti-a59-builder記錄一條寫操作日志到Ctrl Log DataStore。
到此為止,一次異步數(shù)據(jù)寫入流程全部結(jié)束。
1.2同步寫數(shù)據(jù)流程
同步寫操作和異步寫操作主要的區(qū)別體現(xiàn)在ti-a59-client調(diào)用的方式上(時(shí)序圖請(qǐng)參見圖4)。
1)應(yīng)用程序在發(fā)起數(shù)據(jù)同步寫入操作時(shí),需要先調(diào)用ti-a59-client.Scenario啟動(dòng)一個(gè)場(chǎng)景,場(chǎng)景的作用是用于和一個(gè)a59數(shù)據(jù)存儲(chǔ)進(jìn)行關(guān)聯(lián),創(chuàng)建場(chǎng)景時(shí)可以指定一個(gè)a59存儲(chǔ)節(jié)點(diǎn),也可以由系統(tǒng)自動(dòng)選擇一個(gè)寫入速度最快的節(jié)點(diǎn)。
2)場(chǎng)景創(chuàng)建完畢后,通過(guò)調(diào)用ti-a59-client的Writer將數(shù)據(jù)寫入各a59存儲(chǔ)節(jié)點(diǎn),因?yàn)槭峭秸{(diào)用,應(yīng)用程序需要等待寫入操作的應(yīng)答。
3)Writer收到同步寫請(qǐng)求時(shí),會(huì)從Scenario中讀取當(dāng)前綁定a59存儲(chǔ)節(jié)點(diǎn),如果指定則會(huì)等待指定節(jié)點(diǎn)的寫操作返回結(jié)果,如果不指定,則等待第一個(gè)返回的寫操作結(jié)果。
4)第4到第12步與異步寫數(shù)據(jù)請(qǐng)求類似,不同的是ti-a59-client會(huì)監(jiān)聽ti-queue的應(yīng)答隊(duì)列,接收寫操作的返回?cái)?shù)據(jù)。
5)第13到第15步,ti-a59-builder會(huì)將寫操作的結(jié)果通過(guò)MQ Server(圖4中RabbitMQ)、ti-queue發(fā)送到由發(fā)起寫請(qǐng)求的ti-a59-client監(jiān)聽的指定隊(duì)列中,最終由當(dāng)時(shí)發(fā)起寫操作的Writer收到寫操作應(yīng)答。因?yàn)槊恳粋€(gè)ti-a59-builder完成數(shù)據(jù)寫入并返回自己的寫操作應(yīng)答,當(dāng)時(shí)創(chuàng)建場(chǎng)景時(shí)如果指定a59存儲(chǔ)節(jié)點(diǎn),那么Writer只會(huì)處理指定節(jié)點(diǎn)返回的數(shù)據(jù),否則處理第一個(gè)返回到ti-a59-client的數(shù)據(jù)。
6)第16步,如果創(chuàng)建場(chǎng)景時(shí)未指定節(jié)點(diǎn),那么會(huì)將返回的節(jié)點(diǎn)編號(hào)更新到場(chǎng)景中,以便后續(xù)寫操作能鎖定在同一個(gè)節(jié)點(diǎn)上。需要注意的是雖然鎖定了寫入節(jié)點(diǎn),但后續(xù)的數(shù)據(jù)寫操作還是在所有a59節(jié)點(diǎn)上執(zhí)行,只是返回結(jié)果從指定節(jié)點(diǎn)接收。
7)第17步,調(diào)用Scenario完成整個(gè)同步調(diào)用過(guò)程。如果程序需要順序發(fā)起多次同步寫數(shù)據(jù),只需在所有寫操作完畢后再調(diào)用Scenario。
到此為止,一次同步數(shù)據(jù)寫入流程全部結(jié)束。
1.3數(shù)據(jù)讀取流程
ti-a59的數(shù)據(jù)讀取是基于單點(diǎn)數(shù)據(jù)存儲(chǔ)原生API,通過(guò)TCP/HTTP Proxy代理的負(fù)載均衡算法將讀請(qǐng)求發(fā)送至任意一個(gè)可用的a59存儲(chǔ)節(jié)點(diǎn)完成數(shù)據(jù)讀取。參見圖5,具體包括如下:
1)應(yīng)用程序調(diào)用單點(diǎn)數(shù)據(jù)存儲(chǔ)的原生API發(fā)起數(shù)據(jù)讀取操作;原生API指向的目標(biāo)地址不是單點(diǎn)數(shù)據(jù)存儲(chǔ)所在地址,而是指向ti-a59的TCP/HTTP Proxy所在地址。
2)TCP/HTTP Proxy根據(jù)負(fù)載均衡算法,將讀取請(qǐng)求轉(zhuǎn)發(fā)到一臺(tái)可用的單點(diǎn)數(shù)據(jù)存儲(chǔ)服務(wù)器(Single Server DataStore)上完成讀取操作,并原路將讀取結(jié)果返回給應(yīng)用程序。
到此為止,一次數(shù)據(jù)讀取流程全部結(jié)束。
2.異構(gòu)數(shù)據(jù)同步
通過(guò)實(shí)現(xiàn)ti-a59-builder的Builder接口,用戶可以自行擴(kuò)展各類異構(gòu)數(shù)據(jù)類型之間的數(shù)據(jù)同步功能。
ti-a59-builder對(duì)于Builder的提供了原生的事務(wù)支持,基于Spring的申明式事務(wù)定義,保證數(shù)據(jù)寫操作的ACID屬性(原子性、一致性、隔離性和持久性)。當(dāng)數(shù)據(jù)寫入操作出現(xiàn)異常時(shí),會(huì)自動(dòng)觸發(fā)事務(wù)回滾,保證數(shù)據(jù)寫操作不會(huì)被持久化到存儲(chǔ)中。
用戶可以將一次數(shù)據(jù)寫操作,根據(jù)實(shí)際需求轉(zhuǎn)化為一次甚至多次不同數(shù)據(jù)的寫操作,ti-a59-builder原生的事務(wù)支持會(huì)保證多次寫操作的原子性和一致性。
基于組件的消息復(fù)制功能,ti-a59可以支持將一次數(shù)據(jù)寫請(qǐng)求復(fù)制到不同類型的異構(gòu)數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)組,同時(shí)完成不同異構(gòu)數(shù)據(jù)的寫入操作。
2.存儲(chǔ)節(jié)點(diǎn)的故障數(shù)據(jù)恢復(fù)
當(dāng)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障時(shí),正在寫入的數(shù)據(jù)因?yàn)槭聞?wù)機(jī)制的保證所以不會(huì)被持久化到存儲(chǔ)中。同樣因?yàn)镸Q Server消息隊(duì)列的事務(wù)特性,本次寫請(qǐng)求的消息仍然會(huì)保留在消息隊(duì)列中,同后續(xù)到達(dá)的所有寫請(qǐng)求一起持久化在消息隊(duì)列中。
因?yàn)镸Q Server Cluster的存在,即使當(dāng)時(shí)負(fù)責(zé)存儲(chǔ)消息的MQ Server節(jié)點(diǎn)出現(xiàn)故障,a59存儲(chǔ)節(jié)點(diǎn)仍可以通過(guò)其他可用的MQ Server節(jié)點(diǎn)獲取到所有保存再隊(duì)列中的待寫入數(shù)據(jù)。
如果MQ Server隊(duì)列中待寫入數(shù)據(jù)被意外清除,用戶仍可通過(guò)ti-a59-log-srv服務(wù)通過(guò)文件方式將數(shù)據(jù)批量同步到待恢復(fù)的a59存儲(chǔ)節(jié)點(diǎn),由ti-a59-builder負(fù)責(zé)按順序重新導(dǎo)入所有未處理數(shù)據(jù)。這種批量數(shù)據(jù)恢復(fù)方式避免了用戶通過(guò)人工恢復(fù)故障節(jié)點(diǎn)的數(shù)據(jù),解決了不同異構(gòu)數(shù)據(jù)類型的恢復(fù)方式不同的問(wèn)題。
ti-a59-builder在數(shù)據(jù)恢復(fù)時(shí)同樣會(huì)進(jìn)行數(shù)據(jù)寫入控制檢查,已經(jīng)執(zhí)行過(guò)的寫入操作不會(huì)被重復(fù)執(zhí)行,保證了當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)一致性。
故障數(shù)據(jù)恢復(fù)功能同樣適用于新增節(jié)點(diǎn)的數(shù)據(jù)初始化,通過(guò)指定數(shù)據(jù)同步的起始時(shí)間,采用全備恢復(fù)+增量同步的方式保證新增節(jié)點(diǎn)能夠快速與其他存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)保持同步。
以上述依據(jù)本發(fā)明的理想實(shí)施例為啟示,通過(guò)上述的說(shuō)明內(nèi)容,相關(guān)工作人員完全可以在不偏離本項(xiàng)發(fā)明技術(shù)思想的范圍內(nèi),進(jìn)行多樣的變更以及修改。本項(xiàng)發(fā)明的技術(shù)性范圍并不局限于說(shuō)明書上的內(nèi)容,必須要根據(jù)權(quán)利要求范圍來(lái)確定其技術(shù)性范圍。