周 淳,李賢慧
(南瑞集團(tuán)有限公司(國(guó)網(wǎng)電力科學(xué)研究院有限公司),江蘇瑞中數(shù)據(jù)股份有限公司,南京 211106)
數(shù)據(jù)庫(kù)技術(shù)產(chǎn)生于20 世紀(jì)年代后期,其理論與技術(shù)發(fā)展極為迅速,應(yīng)用也日益廣泛,數(shù)據(jù)庫(kù)技術(shù)的一個(gè)重要分支:實(shí)時(shí)數(shù)據(jù)庫(kù)是采用實(shí)時(shí)數(shù)據(jù)模型建立起來(lái)的數(shù)據(jù)庫(kù),實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)是實(shí)時(shí)系統(tǒng)和數(shù)據(jù)庫(kù)技術(shù)相結(jié)合的產(chǎn)物[1],作為解決關(guān)系型數(shù)據(jù)庫(kù)實(shí)時(shí)處理能力等問(wèn)題而產(chǎn)生的一種數(shù)據(jù)庫(kù)技術(shù),實(shí)時(shí)、高效、穩(wěn)定是實(shí)時(shí)數(shù)據(jù)庫(kù)最關(guān)鍵的指標(biāo).
實(shí)時(shí)數(shù)據(jù)庫(kù)在數(shù)據(jù)通信、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)檢索、數(shù)據(jù)訪問(wèn)、數(shù)據(jù)處理、數(shù)據(jù)展現(xiàn)等方面的專業(yè)化及產(chǎn)品化,為構(gòu)建基于大容量實(shí)時(shí)歷史數(shù)據(jù)之上的分析應(yīng)用提供了便捷穩(wěn)定的數(shù)據(jù)支撐,使應(yīng)用系統(tǒng)可以從更高更深層次充分利用寶貴的生產(chǎn)實(shí)時(shí)歷史數(shù)據(jù).而隨著網(wǎng)絡(luò)技術(shù)迅速發(fā)展,實(shí)時(shí)系統(tǒng)產(chǎn)生的數(shù)據(jù)量呈指數(shù)級(jí)增長(zhǎng),且各業(yè)務(wù)應(yīng)用對(duì)海量數(shù)據(jù)的管理和應(yīng)用的實(shí)時(shí)性提出了越來(lái)越高的要求,現(xiàn)有的單機(jī)實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)不論在理論還是實(shí)際應(yīng)用中都存在很大的局限性,已不能完全適應(yīng)當(dāng)前需求.
目前業(yè)界使用實(shí)時(shí)數(shù)據(jù)庫(kù)基本仍使用單核心集中部署[2,3],分布式計(jì)算和存儲(chǔ)技術(shù)思想的引入則可以很好的解決單機(jī)實(shí)時(shí)數(shù)據(jù)庫(kù)遇到的這些瓶頸,但如何設(shè)計(jì)一個(gè)滿足事務(wù)應(yīng)用處理時(shí)效性以及事務(wù)吞吐率的需求的分布式實(shí)時(shí)數(shù)據(jù)庫(kù)是一個(gè)難點(diǎn),本文通過(guò)對(duì)分布式實(shí)時(shí)數(shù)據(jù)庫(kù)部分關(guān)鍵技術(shù)(數(shù)據(jù)分布、數(shù)據(jù)一致性、數(shù)據(jù)重分布)的研究,設(shè)計(jì)了一種分布式實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng),可以為實(shí)時(shí)數(shù)據(jù)庫(kù)應(yīng)用發(fā)展提供技術(shù)支撐.
分布式實(shí)時(shí)數(shù)據(jù)庫(kù)部署架構(gòu)如圖1所示.
圖1 分布式實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)部署架構(gòu)
在部署架構(gòu)中,管理節(jié)點(diǎn)是整個(gè)分布式實(shí)時(shí)數(shù)據(jù)庫(kù)的管理者,主要存儲(chǔ)系統(tǒng)元數(shù)據(jù)信息,包括數(shù)據(jù)分布方式、各節(jié)點(diǎn)狀態(tài)、主備節(jié)點(diǎn)一致性狀態(tài)等關(guān)鍵信息.
調(diào)度節(jié)點(diǎn)屬于分布式訪問(wèn)層,統(tǒng)一的訪問(wèn)接口使得應(yīng)用能夠?qū)⒎植际降膶?shí)時(shí)數(shù)據(jù)庫(kù)視為一個(gè)完整的邏輯整體進(jìn)行訪問(wèn);同時(shí)調(diào)度節(jié)點(diǎn)也屬于分布式定位層,是數(shù)據(jù)的分布和收集者,主要負(fù)責(zé)數(shù)據(jù)的分發(fā),查詢結(jié)果的收集匯總以及任務(wù)調(diào)度.在分布式查詢?cè)L問(wèn)多個(gè)節(jié)點(diǎn)上的數(shù)據(jù)時(shí),并發(fā)式的訪問(wèn)處理能夠?qū)崿F(xiàn)多路數(shù)據(jù)請(qǐng)求在多個(gè)存儲(chǔ)節(jié)點(diǎn)上的并行處理,從而實(shí)現(xiàn)了高效的分布式數(shù)據(jù)訪問(wèn).
數(shù)據(jù)節(jié)點(diǎn)屬于分布式存儲(chǔ)層.每一個(gè)數(shù)據(jù)節(jié)點(diǎn)運(yùn)行和管理一個(gè)數(shù)據(jù)庫(kù)實(shí)例.數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)數(shù)據(jù)的實(shí)際存儲(chǔ),接收來(lái)自調(diào)度節(jié)點(diǎn)的數(shù)據(jù),執(zhí)行經(jīng)分解的查詢?nèi)蝿?wù),執(zhí)行結(jié)果通過(guò)調(diào)度節(jié)點(diǎn)返回給應(yīng)用程序.數(shù)據(jù)節(jié)點(diǎn)的數(shù)量?jī)H受限于以太網(wǎng)帶寬、機(jī)房物理?xiàng)l件等硬性條件.各數(shù)據(jù)節(jié)點(diǎn)只存儲(chǔ)屬于相應(yīng)分區(qū)的數(shù)據(jù),邏輯上是對(duì)等的.主備數(shù)據(jù)節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)在節(jié)點(diǎn)間的冗余互備.
實(shí)時(shí)數(shù)據(jù)庫(kù)可以簡(jiǎn)單地理解為由標(biāo)簽點(diǎn)信息庫(kù)、值數(shù)據(jù)庫(kù)兩個(gè)部分組成[4].如圖2所示.
標(biāo)簽點(diǎn)信息庫(kù)含有測(cè)點(diǎn)基本信息的一張表,以標(biāo)簽點(diǎn)標(biāo)簽(point_name)作為關(guān)鍵字,一條記錄包含一個(gè)標(biāo)簽點(diǎn)的基本配置信息,如標(biāo)簽點(diǎn)描述、壓縮算法等.用戶可從此標(biāo)簽點(diǎn)信息庫(kù)中查詢標(biāo)簽點(diǎn)的基本信息.值數(shù)據(jù)庫(kù)包含了實(shí)時(shí)值緩存和歷史數(shù)據(jù)存儲(chǔ),每條記錄反映了某標(biāo)簽點(diǎn)產(chǎn)生的實(shí)時(shí)數(shù)據(jù)的時(shí)間戳、數(shù)值、質(zhì)量等信息.用戶可從值數(shù)據(jù)庫(kù)中查詢實(shí)時(shí)數(shù)據(jù)值.因此實(shí)時(shí)數(shù)據(jù)庫(kù)最主要的兩個(gè)維度即標(biāo)簽點(diǎn)和數(shù)據(jù)時(shí)間.若需要將實(shí)時(shí)數(shù)據(jù)庫(kù)所有數(shù)據(jù)分布到多個(gè)節(jié)點(diǎn)中,則應(yīng)該從這兩個(gè)維度入手.
圖2 標(biāo)簽點(diǎn)表和數(shù)據(jù)值表
元數(shù)據(jù)存儲(chǔ):標(biāo)簽點(diǎn)表作為元數(shù)據(jù)表,存儲(chǔ)在調(diào)度節(jié)點(diǎn),每個(gè)調(diào)度節(jié)點(diǎn)擁有一份完整的標(biāo)簽點(diǎn)信息,多個(gè)調(diào)度節(jié)點(diǎn)互為備份,通過(guò)管理節(jié)點(diǎn)控制調(diào)度節(jié)點(diǎn)狀態(tài),使用同步線程做異常恢復(fù).
數(shù)據(jù)接入數(shù)據(jù)流如圖3,數(shù)據(jù)由應(yīng)用服務(wù)器或客戶端發(fā)往調(diào)度節(jié)點(diǎn),由調(diào)度節(jié)點(diǎn)根據(jù)分布規(guī)則,將數(shù)據(jù)發(fā)送到不同數(shù)據(jù)主節(jié)點(diǎn),數(shù)據(jù)主節(jié)點(diǎn)在存儲(chǔ)過(guò)程中會(huì)將數(shù)據(jù)轉(zhuǎn)發(fā)給對(duì)應(yīng)備份節(jié)點(diǎn).
數(shù)據(jù)查詢數(shù)據(jù)流如圖4,查詢請(qǐng)求和查詢條件由應(yīng)用服務(wù)器或客戶端發(fā)往調(diào)度節(jié)點(diǎn),由調(diào)度節(jié)點(diǎn)根據(jù)查詢條件中涉及到的標(biāo)簽點(diǎn)和時(shí)間范圍,通過(guò)分布規(guī)則,篩選相關(guān)的數(shù)據(jù)節(jié)點(diǎn),拆分并重新組織多個(gè)子查詢請(qǐng)求分配到多個(gè)數(shù)據(jù)節(jié)點(diǎn),多個(gè)數(shù)據(jù)節(jié)點(diǎn)并行處理查詢,完成后將結(jié)果返回調(diào)度節(jié)點(diǎn),調(diào)度節(jié)點(diǎn)待所有已分配的子查詢返回結(jié)果后做聚集處理.將結(jié)果反饋到應(yīng)用服務(wù)器或客戶端.
這里涉及到分配主備節(jié)點(diǎn)的問(wèn)題,每一個(gè)子查詢只可能被發(fā)送到某一個(gè)數(shù)據(jù)主節(jié)點(diǎn)或者備份節(jié)點(diǎn),除非查詢異常才會(huì)繼續(xù)由調(diào)度節(jié)點(diǎn)發(fā)往另一個(gè)節(jié)點(diǎn)做查詢(同時(shí)需要向管理節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)狀態(tài)),調(diào)度節(jié)點(diǎn)可以通過(guò)判斷主備節(jié)點(diǎn)的繁忙程度來(lái)選擇分配節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)定時(shí)向管理節(jié)點(diǎn)匯報(bào)當(dāng)前活動(dòng)狀態(tài)以及繁忙程度,調(diào)度節(jié)點(diǎn)也會(huì)定時(shí)從管理節(jié)點(diǎn)同步所有數(shù)據(jù)節(jié)點(diǎn)狀態(tài),繁忙程度的度量[5]可以從CPU 平均使用率、平均網(wǎng)絡(luò)使用率、當(dāng)前磁盤使用率、當(dāng)前內(nèi)存占用率等方便綜合測(cè)算.
圖3 數(shù)據(jù)接入的數(shù)據(jù)流
圖4 數(shù)據(jù)查詢的數(shù)據(jù)流
設(shè)計(jì)分布規(guī)則時(shí),既要考慮到標(biāo)簽點(diǎn)數(shù)據(jù)的關(guān)聯(lián)性(如果能夠?qū)⒉糠植樵冞\(yùn)算放在數(shù)據(jù)節(jié)點(diǎn)內(nèi)部直接處理,顯然要比將數(shù)據(jù)傳輸?shù)秸{(diào)度節(jié)點(diǎn)后再集中做運(yùn)算性能要高的多),又要考慮分布式架構(gòu)并行處理帶來(lái)的效率提升.
可以考慮將連續(xù)的一批標(biāo)簽點(diǎn),一個(gè)時(shí)間段的數(shù)據(jù)分布在同一個(gè)數(shù)據(jù)節(jié)點(diǎn)中,可以考慮通過(guò)自定義的Hash 函數(shù)實(shí)現(xiàn),Hash 函數(shù)類似如下格式:其中slice_id為最后函數(shù)確定分配的分片號(hào),通過(guò)函數(shù)前部計(jì)算結(jié)果對(duì)一個(gè)設(shè)定的Hash_Bucket取模獲得,hash_str(point_name)和day_time(time)分別是對(duì)標(biāo)簽點(diǎn)名和時(shí)間段的一個(gè)量化函數(shù),考慮到標(biāo)簽點(diǎn)或時(shí)間區(qū)域內(nèi)數(shù)據(jù)的關(guān)聯(lián)性,設(shè)計(jì)b1 和b2 控制標(biāo)簽點(diǎn)或某相鄰時(shí)間段內(nèi)的數(shù)據(jù)分散程度.w1 和w2 為系數(shù),或者稱之為未標(biāo)準(zhǔn)化權(quán)重,例如極端情況下設(shè)置w2 為0,則表示完全按照標(biāo)簽點(diǎn)來(lái)分布數(shù)據(jù),每個(gè)標(biāo)簽點(diǎn)的所有時(shí)間的數(shù)據(jù)都存放在同一個(gè)數(shù)據(jù)分片或其備份分片上;同樣的,若設(shè)置w1 為0,則表示完全按照時(shí)間段來(lái)分布數(shù)據(jù),每個(gè)時(shí)間段的所有標(biāo)簽點(diǎn)的數(shù)據(jù)都存放在同一個(gè)數(shù)據(jù)分片或其備份分片上.
可以看到,該等式是以point_name和time為自變量,slice_id為因變量的函數(shù),根據(jù)函數(shù)定義,說(shuō)明任意一組已知的point_name和time,可以唯一確定一個(gè)slice_id,也就是說(shuō)根據(jù)接入的數(shù)據(jù)中的標(biāo)簽點(diǎn)名和數(shù)據(jù)時(shí)間戳,我們可以分布到一個(gè)確定的數(shù)據(jù)分片.
考慮到系統(tǒng)實(shí)際運(yùn)行中,節(jié)點(diǎn)可能會(huì)有調(diào)整變動(dòng),若Hash_Bucket設(shè)為初始節(jié)點(diǎn)數(shù),且每個(gè)slice_id對(duì)應(yīng)一個(gè)節(jié)點(diǎn),則節(jié)點(diǎn)變動(dòng)會(huì)導(dǎo)致Hash_Bucket變動(dòng),繼而會(huì)使得整個(gè)數(shù)據(jù)重分布涉及到系統(tǒng)所有數(shù)據(jù)文件,因?yàn)樾枰獙?duì)每條數(shù)據(jù)值使用新Hash 函數(shù)計(jì)算對(duì)應(yīng)數(shù)據(jù)節(jié)點(diǎn),這種方式只能通過(guò)提高Hash 運(yùn)算以及數(shù)據(jù)傳輸?shù)牟⑿卸葋?lái)提高重分布效率.
借鑒一致性Hash 算法[6]可以有效解決該問(wèn)題,管理節(jié)點(diǎn)存儲(chǔ)一個(gè)大小為Hash_Bucket的數(shù)組(分片映射表),每個(gè)元素存儲(chǔ)該元素下標(biāo)對(duì)應(yīng)數(shù)據(jù)分片所在的數(shù)據(jù)節(jié)點(diǎn),該映射關(guān)系可以通過(guò)人工設(shè)定或者按node_num(數(shù)據(jù)節(jié)點(diǎn)數(shù))取模的方式自動(dòng)分配.
圖5顯示了數(shù)據(jù)是如何根據(jù)分布規(guī)則分布到不同節(jié)點(diǎn)上的,分布規(guī)則包含自定義的Hash 函數(shù)和分片映射表,通過(guò)自定義的Hash 函數(shù)和分片映射表可以將標(biāo)簽點(diǎn)以及數(shù)據(jù)分布到不同數(shù)據(jù)節(jié)點(diǎn),分布規(guī)則需要在標(biāo)簽點(diǎn)寫入之前確定,且分布規(guī)則一旦確定后,直到數(shù)據(jù)節(jié)點(diǎn)變動(dòng)需要重分布才會(huì)改變,且只能改變分片映射表.
若整個(gè)分布式實(shí)時(shí)庫(kù)系統(tǒng)啟動(dòng)前沒(méi)有預(yù)先設(shè)置分布規(guī)則,則啟動(dòng)后分片映射表根據(jù)數(shù)據(jù)節(jié)點(diǎn)數(shù)自動(dòng)生成,接入標(biāo)簽點(diǎn)和數(shù)據(jù)前,仍需要通過(guò)管理客戶端設(shè)置Hash 函數(shù)相關(guān)參數(shù),該分布規(guī)則直接交由管理節(jié)點(diǎn)保存,調(diào)度節(jié)點(diǎn)在分配標(biāo)簽點(diǎn)和數(shù)據(jù)前需要從管理節(jié)點(diǎn)預(yù)先獲取分布規(guī)則.調(diào)度節(jié)點(diǎn)首次獲取到分布規(guī)則后會(huì)存儲(chǔ)到內(nèi)存中,無(wú)需在每次分配數(shù)據(jù)時(shí)重新獲取分配規(guī)則,若系統(tǒng)擴(kuò)容或縮容等有數(shù)據(jù)節(jié)點(diǎn)的變動(dòng),需要修改分布規(guī)則時(shí),則需要調(diào)度節(jié)點(diǎn)重新初始化并獲取分布規(guī)則.
圖5 數(shù)據(jù)分布規(guī)則
隨著數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)總量的變動(dòng),可能需要考慮數(shù)據(jù)節(jié)點(diǎn)的擴(kuò)容或縮容.數(shù)據(jù)節(jié)點(diǎn)的變動(dòng)必然需要考慮數(shù)據(jù)均衡和數(shù)據(jù)重分布.
前文設(shè)計(jì)的實(shí)時(shí)庫(kù)系統(tǒng),采用的分片映射表和Hash 分布2 層分布的方式,重分布策略可以設(shè)計(jì)為Hash 函數(shù)不做改變,而只改變分片映射表,例如重新按照新的節(jié)點(diǎn)數(shù)自動(dòng)取模生成新的映射表,調(diào)度節(jié)點(diǎn)通過(guò)對(duì)比新舊分片映射表的差異,設(shè)置每個(gè)數(shù)據(jù)節(jié)點(diǎn)相應(yīng)的分片移動(dòng)路徑并分配到各個(gè)數(shù)據(jù)節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)按完整分片目錄做數(shù)據(jù)遷移.這樣以分片為最小移動(dòng)單位,無(wú)需做數(shù)據(jù)解壓和Hash 運(yùn)算,極大減少CPU 運(yùn)算和磁盤IO 以及網(wǎng)絡(luò)IO 的開(kāi)銷.
一個(gè)更高效的做法即根據(jù)整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)總量做均分,圖6是一個(gè)擴(kuò)容過(guò)程,將數(shù)據(jù)總量大于平均數(shù)據(jù)量的數(shù)據(jù)節(jié)點(diǎn)中的部分分片向少于平均數(shù)據(jù)量的數(shù)據(jù)節(jié)點(diǎn)移動(dòng),這樣可以使得數(shù)據(jù)重分布需要移動(dòng)的總吞吐量達(dá)到最小.
實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)設(shè)計(jì)盡可能沿用已有的單機(jī)實(shí)時(shí)庫(kù)設(shè)計(jì),即設(shè)計(jì)滿足單個(gè)數(shù)據(jù)庫(kù)實(shí)例既可以作為獨(dú)立個(gè)體運(yùn)行,也可以作為分布式架構(gòu)中一個(gè)數(shù)據(jù)節(jié)點(diǎn)運(yùn)行,也就是說(shuō)單個(gè)數(shù)據(jù)節(jié)點(diǎn)需要包含實(shí)時(shí)庫(kù)所有模塊:網(wǎng)絡(luò)收發(fā)模塊、數(shù)據(jù)緩存模塊、數(shù)據(jù)處理模塊、數(shù)據(jù)存儲(chǔ)模塊(包含索引).
圖6 數(shù)據(jù)節(jié)點(diǎn)擴(kuò)容時(shí)數(shù)據(jù)分片的移動(dòng)
這里主要考慮數(shù)據(jù)存儲(chǔ)模塊,數(shù)據(jù)緩存模塊、數(shù)據(jù)處理模塊都是建立在該模塊之上,而網(wǎng)絡(luò)收發(fā)模塊只和設(shè)計(jì)的通信協(xié)議有關(guān),和數(shù)據(jù)邏輯相對(duì)獨(dú)立.
數(shù)據(jù)存儲(chǔ)按照分片管理,如圖7所示,每個(gè)分片號(hào)(slice_id)對(duì)應(yīng)一個(gè)文件目錄,若作為單獨(dú)數(shù)據(jù)庫(kù)實(shí)例運(yùn)行,該實(shí)例包含所有分片號(hào),若作為分布式架構(gòu)中一個(gè)節(jié)點(diǎn),該實(shí)例包含分片映射表中部分分片,每個(gè)分片文件目錄下按時(shí)間段區(qū)分?jǐn)?shù)據(jù)文件組存儲(chǔ)數(shù)據(jù)塊,文件組和時(shí)間段一一對(duì)應(yīng),每個(gè)文件組和分片目錄各自存儲(chǔ)一個(gè)版本號(hào)(version),每次寫和修改更新版本號(hào),查詢不做版本號(hào)更新[7].
圖7 單數(shù)據(jù)節(jié)點(diǎn)基本存儲(chǔ)結(jié)構(gòu)
從整個(gè)個(gè)分布式系統(tǒng)角度看,數(shù)據(jù)節(jié)點(diǎn)是系統(tǒng)中最基本的存儲(chǔ)和計(jì)算單元,從數(shù)據(jù)完整性角度來(lái)看,數(shù)據(jù)節(jié)點(diǎn)內(nèi)部數(shù)據(jù)文件組是最小粒度的具有自描述性的存儲(chǔ)單元,也是最基本的自恢復(fù)和同步單元.
分布式數(shù)據(jù)庫(kù)的一個(gè)難點(diǎn)就是如何處理存儲(chǔ)數(shù)據(jù)的一致性,包括元數(shù)據(jù)和數(shù)據(jù)的同步以及異常處理.
管理節(jié)點(diǎn)一般需要配置多個(gè)節(jié)點(diǎn)來(lái)保障高可用性,主要存儲(chǔ)的是分布規(guī)則等關(guān)鍵配置,以及各主備節(jié)點(diǎn)狀態(tài)等小顆粒信息,適合基于corosync 或zookeeper 類似架構(gòu)實(shí)現(xiàn),保證信息同步有序一致,對(duì)于這一類場(chǎng)景目前已經(jīng)有廣泛的應(yīng)用實(shí)踐,例如文獻(xiàn)[8].
調(diào)度節(jié)點(diǎn)除了定時(shí)從管理節(jié)點(diǎn)同步各節(jié)點(diǎn)狀態(tài)到內(nèi)存外,主要存儲(chǔ)標(biāo)簽點(diǎn)元數(shù)據(jù)信息,對(duì)標(biāo)簽點(diǎn)的增刪改查以事務(wù)方式執(zhí)行,需要保證單次操作的原子性和強(qiáng)一致性,即每次在某一調(diào)度節(jié)點(diǎn)的操作,需要保證成功同步到其他所有正常調(diào)度節(jié)點(diǎn),若低于1/2 的調(diào)度節(jié)點(diǎn)同步失敗,管理節(jié)點(diǎn)將失敗的節(jié)點(diǎn)做異常標(biāo)記,等待后續(xù)同步恢復(fù);若超過(guò)1/2 的節(jié)點(diǎn)同步失敗,則在已執(zhí)行成功節(jié)點(diǎn)上執(zhí)行撤銷操作,若撤銷失敗,同樣做異常標(biāo)記,等待后續(xù)同步恢復(fù).
調(diào)度節(jié)點(diǎn)元數(shù)據(jù)信息被劃分區(qū)塊,因?yàn)樗胁僮骶哂袕?qiáng)一致性,因此正常節(jié)點(diǎn)每個(gè)區(qū)塊以及區(qū)塊順序都應(yīng)該是完全一致的.管理節(jié)點(diǎn)定時(shí)檢測(cè)異常的調(diào)度節(jié)點(diǎn)并進(jìn)行同步恢復(fù)操作.
通過(guò)冗余的鏡像機(jī)制來(lái)保證集群的高可用特性,設(shè)計(jì)需要考慮實(shí)時(shí)性和容錯(cuò)性,對(duì)于主備數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)一致性的選擇,最簡(jiǎn)單的做法首選強(qiáng)一致性,但CAP 理論[9]告訴我們一致性、可用性和網(wǎng)絡(luò)分區(qū)三者不可兼得,弱一致性也有其適用范圍,特別是在實(shí)時(shí)性要求較高而對(duì)及時(shí)一致性要求較低的場(chǎng)景.
主備數(shù)據(jù)節(jié)點(diǎn)的狀態(tài)由管理節(jié)點(diǎn)監(jiān)控,調(diào)度節(jié)點(diǎn)通過(guò)管理節(jié)點(diǎn)獲取主備數(shù)據(jù)節(jié)點(diǎn)的狀態(tài),可以指派數(shù)據(jù)寫入和查詢節(jié)點(diǎn),同時(shí)實(shí)時(shí)任務(wù)處理過(guò)程中數(shù)據(jù)節(jié)點(diǎn)狀態(tài)異常也實(shí)時(shí)反饋給管理節(jié)點(diǎn).前面已經(jīng)提到數(shù)據(jù)寫入和查詢的的數(shù)據(jù)流,寫入時(shí)調(diào)度節(jié)點(diǎn)數(shù)據(jù)直接寫入主節(jié)點(diǎn),由主節(jié)點(diǎn)將數(shù)據(jù)往鏡像節(jié)點(diǎn)做自動(dòng)轉(zhuǎn)發(fā)同步,不保證主備節(jié)點(diǎn)數(shù)據(jù)的強(qiáng)一致性,只保證數(shù)據(jù)的最終一致性,查詢時(shí)主庫(kù)鏡像庫(kù)分擔(dān)查詢壓力,由調(diào)度節(jié)點(diǎn)按負(fù)載情況分派查詢?nèi)蝿?wù).
主庫(kù)節(jié)點(diǎn)若發(fā)生異常,備節(jié)點(diǎn)會(huì)由管理節(jié)點(diǎn)指派升級(jí)為主節(jié)點(diǎn),異常節(jié)點(diǎn)恢復(fù)后會(huì)作為備份節(jié)點(diǎn)繼續(xù)運(yùn)行,管理節(jié)點(diǎn)會(huì)在檢測(cè)到異常數(shù)據(jù)節(jié)點(diǎn)時(shí)啟動(dòng)一致性檢測(cè),通過(guò)兩層版本號(hào)檢測(cè)和文件級(jí)同步的方式可以使恢復(fù)操作對(duì)實(shí)時(shí)處理性能影響最小化,且恢復(fù)效率高,具體檢測(cè)和恢復(fù)方式為:通過(guò)分析主備數(shù)據(jù)節(jié)點(diǎn)的各分片版本號(hào)以及分片內(nèi)文件組的版本號(hào)(version)不一致情況,確定需要同步的索引和數(shù)據(jù)文件塊并進(jìn)行數(shù)據(jù)同步,即對(duì)不同版本號(hào)文件組直接做替換操作,數(shù)據(jù)流通過(guò)底層TCP 傳輸.
為了不影響整個(gè)系統(tǒng)的實(shí)時(shí)性,主備數(shù)據(jù)異?;謴?fù)時(shí)采用在線同步模式,即同步過(guò)程中不影響數(shù)據(jù)正常讀寫,采用如下策略:數(shù)據(jù)同步過(guò)程中主節(jié)點(diǎn)產(chǎn)生的修改記錄以Log 方式記錄在主數(shù)據(jù)節(jié)點(diǎn),并在同步完成后解析Log 和更新數(shù)據(jù),解析過(guò)程中的數(shù)據(jù)修改仍然追加到Log 末尾,直到所有Log 解析完畢,管理節(jié)點(diǎn)設(shè)置該主備數(shù)據(jù)節(jié)點(diǎn)狀態(tài)為Normal.
如下是一個(gè)分布式實(shí)時(shí)數(shù)據(jù)庫(kù)的搭建和設(shè)計(jì)思路:
(1)建構(gòu)系統(tǒng)架構(gòu):創(chuàng)建管理節(jié)點(diǎn)集群,調(diào)度節(jié)點(diǎn)集群,數(shù)據(jù)節(jié)點(diǎn)集群,數(shù)據(jù)節(jié)點(diǎn)服務(wù)器的數(shù)量和數(shù)據(jù)量有關(guān),管理節(jié)點(diǎn)因?yàn)轶w量較小,可以和調(diào)度節(jié)點(diǎn)合并到同一個(gè)服務(wù)器集群.管理節(jié)點(diǎn)存儲(chǔ)節(jié)點(diǎn)元信息,包括數(shù)據(jù)分布規(guī)則、各節(jié)點(diǎn)狀態(tài)等信息,調(diào)度節(jié)點(diǎn)存儲(chǔ)測(cè)點(diǎn)信息表,數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)包含測(cè)點(diǎn)名、數(shù)據(jù)時(shí)間和數(shù)據(jù)值的數(shù)據(jù)表,每個(gè)數(shù)據(jù)節(jié)點(diǎn)通過(guò)主備節(jié)點(diǎn)實(shí)現(xiàn)冗余備份,管理節(jié)點(diǎn)、調(diào)度節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)間分別建立連接,數(shù)據(jù)和調(diào)度節(jié)點(diǎn)定時(shí)向管理節(jié)點(diǎn)匯報(bào)當(dāng)前活動(dòng)狀態(tài)及繁忙程度,調(diào)度節(jié)點(diǎn)定時(shí)從管理節(jié)點(diǎn)同步所有節(jié)點(diǎn)狀態(tài);
(2)建立分布規(guī)則:管理節(jié)點(diǎn)依據(jù)輸入?yún)?shù)確定系統(tǒng)唯一的分布規(guī)則,分布規(guī)則的設(shè)計(jì)見(jiàn)2.1 節(jié);
(3)測(cè)點(diǎn)請(qǐng)求:調(diào)度節(jié)點(diǎn)收到測(cè)點(diǎn)寫請(qǐng)求后,檢測(cè)測(cè)點(diǎn)合法性,檢測(cè)通過(guò)執(zhí)行對(duì)測(cè)點(diǎn)表的操作,并向其余所有調(diào)度節(jié)點(diǎn)做同步,一致性設(shè)計(jì)見(jiàn)4.2 節(jié);
(4)數(shù)據(jù)寫請(qǐng)求:調(diào)度節(jié)點(diǎn)收到數(shù)據(jù)寫請(qǐng)求后根據(jù)測(cè)點(diǎn)名和數(shù)據(jù)時(shí)間,依據(jù)分布規(guī)則,將數(shù)據(jù)發(fā)送到不同的數(shù)據(jù)主節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)的存儲(chǔ)方式見(jiàn)第3 節(jié),另外,如4.3 節(jié)所述,數(shù)據(jù)主節(jié)點(diǎn)在存儲(chǔ)過(guò)程中將數(shù)據(jù)轉(zhuǎn)發(fā)給對(duì)應(yīng)的備份節(jié)點(diǎn).數(shù)據(jù)存儲(chǔ)過(guò)程中發(fā)生異常會(huì)執(zhí)行恢復(fù)流程,見(jiàn)4.4 節(jié);
(5)數(shù)據(jù)讀請(qǐng)求:調(diào)度節(jié)點(diǎn)收到讀數(shù)據(jù)請(qǐng)求后,根據(jù)讀請(qǐng)求中測(cè)點(diǎn)名和數(shù)據(jù)時(shí)間,通過(guò)分布規(guī)則篩選數(shù)據(jù)節(jié)點(diǎn),拆分并重新組織多個(gè)讀取子任務(wù)分配到多個(gè)數(shù)據(jù)節(jié)點(diǎn)并行讀取數(shù)據(jù),完成后將結(jié)果返回調(diào)度節(jié)點(diǎn),調(diào)度節(jié)點(diǎn)待所有子任務(wù)返回后做聚集處理.將結(jié)果反饋到請(qǐng)求端.
為了驗(yàn)證該設(shè)計(jì)的可行性,使用C++語(yǔ)言開(kāi)發(fā)了分布式實(shí)時(shí)庫(kù)原型系統(tǒng),使用3 個(gè)管理和調(diào)度服務(wù)器的集群,5 個(gè)數(shù)據(jù)服務(wù)器的集群,執(zhí)行了數(shù)據(jù)讀寫測(cè)試,并和單機(jī)實(shí)時(shí)數(shù)據(jù)庫(kù)做對(duì)比.測(cè)試數(shù)據(jù)來(lái)源于電力調(diào)度系統(tǒng)模擬數(shù)據(jù),原始數(shù)據(jù)量均為10 TB,測(cè)點(diǎn)規(guī)模為1000 萬(wàn)級(jí)別,分別從測(cè)點(diǎn)建立,數(shù)據(jù)接入效率,數(shù)據(jù)實(shí)際存儲(chǔ)量,數(shù)據(jù)隨機(jī)查詢四個(gè)方面進(jìn)行測(cè)試對(duì)比.表1是對(duì)比結(jié)果.
表1 性能測(cè)試對(duì)比
測(cè)試結(jié)果顯示,在磁盤壓力較低的情況,單機(jī)存儲(chǔ)因?yàn)闊o(wú)需做數(shù)據(jù)分布處理和同步,性能較高;而在需要做復(fù)雜運(yùn)算或者磁盤IO 開(kāi)銷大的場(chǎng)景下,分布式存儲(chǔ)比單機(jī)存儲(chǔ)方式有幾倍的性能提升.
由于工業(yè)領(lǐng)域?qū)?shí)時(shí)數(shù)據(jù)庫(kù)的性能、可靠性、可擴(kuò)展性等要求越來(lái)越高,本文通過(guò)將分布式技術(shù)和實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)相結(jié)合,提出一種實(shí)時(shí)數(shù)據(jù)系統(tǒng)中的數(shù)據(jù)分布式存儲(chǔ)的設(shè)計(jì),同時(shí)給出了數(shù)據(jù)冗余、數(shù)據(jù)重分布以及數(shù)據(jù)一致性的一整套方案.為突破當(dāng)前實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)瓶頸提供技術(shù)支撐.