Apache Ignite內(nèi)存數(shù)據(jù)組織
1.Ignite是什么?
Apache Ignite是一個(gè)支持水平擴(kuò)展和容錯(cuò)的分布式內(nèi)存計(jì)算平臺(tái),面向數(shù)據(jù)密集型應(yīng)用,可以在TB級(jí)的數(shù)據(jù)上以內(nèi)存級(jí)的速度構(gòu)建實(shí)時(shí)應(yīng)用。
1.1.Ignite定位
Ignite是不是內(nèi)存數(shù)據(jù)庫?
是,雖然Ignite的固化內(nèi)存在內(nèi)存和磁盤中都工作得很好,但是磁盤持久化可以禁用從而成為一個(gè)純粹的內(nèi)存數(shù)據(jù)庫,支持SQL和分布式關(guān)聯(lián)。
Ignite是不是內(nèi)存數(shù)據(jù)網(wǎng)格(IMDG)?
是,Ignite是一個(gè)全功能的分布式鍵-值數(shù)據(jù)網(wǎng)格,它既可以用于純內(nèi)存模式,也可以帶有Ignite的原生持久化,它也可以與任何第三方數(shù)據(jù)庫集成,包括RDBMS和NoSQL。
Ignite是不是一個(gè)分布式緩存?
是,如果禁用原生持久化,Ignite就是一個(gè)分布式緩存,它實(shí)現(xiàn)了JCache規(guī)范(JSR107),并且提供了比規(guī)范更多的功能,包括分區(qū)和復(fù)制分布式模式、分布式ACID事務(wù)、SQL查詢、原生持久化等等。
Ignite是不是分布式數(shù)據(jù)庫?
是,在整個(gè)集群的多個(gè)節(jié)點(diǎn)中,Ignite中的數(shù)據(jù)要么是分區(qū)模式的,要么是復(fù)制模式的,這給系統(tǒng)帶來了伸縮性,增加了彈性。Ignite可以自動(dòng)地控制數(shù)據(jù)如何分區(qū),另外,開發(fā)者也可以插入自定義(關(guān)系)函數(shù),以及為了提高效率將部分?jǐn)?shù)據(jù)并置在一起。
Ignite是不是關(guān)系型SQL數(shù)據(jù)庫?
不完整,盡管Ignite的目標(biāo)是和其他的關(guān)系型SQL數(shù)據(jù)庫具有類似的行為,但是在處理約束和索引方面還是有不同的。Ignite支持一級(jí)和二級(jí)索引,但是只有一級(jí)索引支持唯一性,Ignite還不支持外鍵約束。
Ignite是不是磁盤或者只有內(nèi)存的存儲(chǔ)?
都是,Ignite中的原生持久化是可以開關(guān)的,這使得Ignite可以持有比可用內(nèi)存量大得多的數(shù)據(jù)。尤其是,少量的操作型數(shù)據(jù)集可以只保存在內(nèi)存中,而更大的無法放在內(nèi)存中的數(shù)據(jù)集,可以放在磁盤上,將內(nèi)存作為一個(gè)緩存層,可以獲得更好的性能。
Ignite是不是一個(gè)NoSQL數(shù)據(jù)庫?
不確切,和其他的NoSQL數(shù)據(jù)庫一樣,Ignite支持高可用和水平伸縮,但是,和其它的NoSQL數(shù)據(jù)庫不同,Ignite支持跨越整個(gè)集群的ACID事務(wù)和SQL。
Ignite是不是事務(wù)型數(shù)據(jù)庫?
不完整,ACID事務(wù)是支持的,但是僅僅在鍵-值A(chǔ)PI級(jí)別,Ignite還支持跨分區(qū)的事務(wù),這意味著事務(wù)可以跨越不同服務(wù)器不同分區(qū)中的鍵。
在SQL層,Ignite支持原子性,還不是事務(wù)型一致性,社區(qū)計(jì)劃在未來的版本中實(shí)現(xiàn)SQL事務(wù)。
Ignite是不是一個(gè)多模型數(shù)據(jù)庫?
是,Ignite數(shù)據(jù)的建模和訪問,同時(shí)支持鍵值和SQL,另外,Ignite還為在分布式數(shù)據(jù)上的計(jì)算處理,提供了強(qiáng)大的API。
Ignite是不是一個(gè)鍵-值存儲(chǔ)?
是,Ignite提供了豐富的鍵-值A(chǔ)PI,兼容于JCache (JSR-107),并且支持Java,C++和.NET。
2.關(guān)鍵特性
2.1.分布式內(nèi)存級(jí)SQL數(shù)據(jù)庫
Ignite帶來了一個(gè)兼容于ANSI-99、支持水平擴(kuò)展和容錯(cuò)的分布式SQL數(shù)據(jù)庫,根據(jù)需要,分布模式既可以是跨整個(gè)集群的分區(qū)模式,也可以是全復(fù)制模式。
和其它的分布式SQL數(shù)據(jù)庫不同,Ignite的持久化存儲(chǔ)將內(nèi)存和磁盤都視為有效的存儲(chǔ)層,磁盤層,即原生持久化存儲(chǔ),默認(rèn)是禁用的,這時(shí)Ignite就是一個(gè)純粹的內(nèi)存數(shù)據(jù)庫(IMjDB)。
和其他的SQL存儲(chǔ)一樣,也可以使用JDBC或者ODBC與Ignite進(jìn)行交互,Ignite還為Java、.NET和C++開發(fā)者提供了原生的SQL API,并且性能更好。
Ignite的一個(gè)顯著優(yōu)勢(shì)是,完全支持分布式SQL關(guān)聯(lián),Ignite的數(shù)據(jù)關(guān)聯(lián)支持并置模式和非并置模式。如果是并置模式,關(guān)聯(lián)是在每個(gè)節(jié)點(diǎn)的本地可用數(shù)據(jù)集上執(zhí)行,而不需要在網(wǎng)絡(luò)間移動(dòng)大量的數(shù)據(jù),在分布式數(shù)據(jù)庫中,這樣的方式提供了最好的擴(kuò)展性和性能。
除了標(biāo)準(zhǔn)的SQL,Ignite還提供了強(qiáng)大的處理API。
-
鍵值A(chǔ)PI:Ignite的鍵值A(chǔ)PI可以使用戶以鍵值存儲(chǔ)的方式與Ignite交互,除了JCache規(guī)范(JSR107)支持的標(biāo)準(zhǔn)鍵值操作,Ignite還提供了分布式ACID事務(wù)、持續(xù)查詢、掃描查詢這樣的擴(kuò)展支持;
-
并置處理:這個(gè)方式允許直接在數(shù)據(jù)所在的節(jié)點(diǎn)直接執(zhí)行分布式SQL關(guān)聯(lián)或者自定義業(yè)務(wù)邏輯,避免了昂貴的序列化和網(wǎng)絡(luò)開銷。
2.2.鍵-值內(nèi)存數(shù)據(jù)網(wǎng)格
Ignite提供了廣泛的鍵-值A(chǔ)PI,可以作為一個(gè)內(nèi)存數(shù)據(jù)網(wǎng)格,可以將Ignite視為一個(gè)分布式分區(qū)化的哈希映射,每個(gè)節(jié)點(diǎn)持有整個(gè)數(shù)據(jù)集的一部分,和其他的內(nèi)存數(shù)據(jù)網(wǎng)格(IMDG)不同,Ignite可以同時(shí)將數(shù)據(jù)保存在內(nèi)存和磁盤上,因此也就可以存儲(chǔ)比可用物理內(nèi)存多得多的數(shù)據(jù)。
目前,Ignite數(shù)據(jù)網(wǎng)格是分布式架構(gòu)支持ACID事務(wù)或者原子化數(shù)據(jù)更新最快的實(shí)現(xiàn)之一。
第三方數(shù)據(jù)庫
通過在應(yīng)用和數(shù)據(jù)庫層之間嵌入一個(gè)分布式緩存,Ignite會(huì)改進(jìn)已有第三方數(shù)據(jù)庫的性能和可擴(kuò)展性,比如RDBMS、NoSQL或者基于Hadoop的存儲(chǔ),這種做法不需要對(duì)已有的數(shù)據(jù)進(jìn)行替換,通過通讀和通寫,會(huì)保持與底層數(shù)據(jù)庫的同步,Ignite會(huì)自動(dòng)地與底層數(shù)據(jù)庫事務(wù)進(jìn)行合并,向用戶透明地提供事務(wù)保證。
但是,這種方法也有限制,比如,SQL和掃描查詢只能處理保存在緩存中的數(shù)據(jù),不包括外部數(shù)據(jù)庫,因?yàn)镮gnite無法索引外部數(shù)據(jù),如果希望磁盤上的數(shù)據(jù)也應(yīng)該被索引到并且可以通過SQL訪問,建議使用Ignite的原生持久化。
JCache API
Ignite的鍵-值A(chǔ)PI符合JCache規(guī)范(JSR107),支持如下功能:
-
內(nèi)存鍵值存儲(chǔ);
-
基本的緩存操作;
-
ConcurrentMap API;
-
并置處理(EntryProcessor);
-
事件和指標(biāo);
-
可插拔的持久化。
擴(kuò)展鍵-值A(chǔ)PI
除了標(biāo)準(zhǔn)的JCache API,Ignite還支持分布式的ACID事務(wù)、持續(xù)查詢、并置處理等等。
Ignite數(shù)據(jù)網(wǎng)格甚至可以線性地增長(zhǎng)到幾百個(gè)節(jié)點(diǎn),它通過強(qiáng)語義的數(shù)據(jù)位置和關(guān)系數(shù)據(jù)路由,來降低冗余數(shù)據(jù)噪聲。它可以被視為一個(gè)分布式分區(qū)化的哈希映射,每個(gè)節(jié)點(diǎn)可以持有整個(gè)數(shù)據(jù)集的一部分,這意味著節(jié)點(diǎn)越多,緩存的數(shù)據(jù)也可以越多。
2.3.ACID事務(wù)
Ignite是一個(gè)強(qiáng)一致的平臺(tái),完全支持分布式ACID事務(wù),內(nèi)存和磁盤層,都提供一樣的一致性保證。
Ignite的事務(wù),可以跨越多個(gè)節(jié)點(diǎn),多個(gè)緩存(或者說表)以及多個(gè)分區(qū)。對(duì)于應(yīng)用來說,樂觀鎖和悲觀鎖都是可用的,樂觀模式還支持無死鎖事務(wù),可以在業(yè)務(wù)代碼層面避免分布式死鎖。
二階段提交協(xié)議
在分布式系統(tǒng)中,事務(wù)可能跨越多個(gè)節(jié)點(diǎn),顯然,要保證所有參與節(jié)點(diǎn)的數(shù)據(jù)一致性是一個(gè)很大的挑戰(zhàn)。比如,如果一個(gè)節(jié)點(diǎn)故障,故障節(jié)點(diǎn)的事務(wù)就不能完整提交,在這類場(chǎng)景中,要保證數(shù)據(jù)一致性,一個(gè)廣泛使用的方法是二階段提交協(xié)議(2PC)。
Ignite帶來了二階段提交協(xié)議的最快實(shí)現(xiàn),另外,如果事務(wù)只涉及一個(gè)分區(qū)或者一個(gè)節(jié)點(diǎn),Ignite會(huì)使用一個(gè)更快的一階段提交協(xié)議。在一個(gè)事務(wù)中,如果數(shù)據(jù)發(fā)生了變化,那么在變化提交之前,Ignite會(huì)在本地事務(wù)映射中保存一個(gè)事務(wù)的狀態(tài),提交時(shí),數(shù)據(jù)會(huì)被發(fā)送到相關(guān)的遠(yuǎn)程節(jié)點(diǎn),其中只有持有相關(guān)數(shù)據(jù)主副本的節(jié)點(diǎn),才會(huì)參與事務(wù)。
一致性和Ignite持久化
如果使用了Ignite的原生持久化,那么所有的更新都會(huì)寫入預(yù)寫日志(WAL)文件中來保證一致性,即使事務(wù)執(zhí)行期間集群或者某個(gè)節(jié)點(diǎn)故障,也沒有問題。
WAL的目的是,以附加模式將更新傳播到磁盤,這是將數(shù)據(jù)持久化到磁盤的最快方式,如果集群或者某個(gè)節(jié)點(diǎn)故障,WAL提供了一個(gè)故障場(chǎng)景的恢復(fù)機(jī)制,集群總是可以恢復(fù)到最近成功提交的事務(wù)狀態(tài)。
一致性和第三方持久化
如果Ignite作為緩存層運(yùn)行于第三方數(shù)據(jù)庫之上,比如RDBMS,Ignite仍然會(huì)保證緩存數(shù)據(jù)和外部數(shù)據(jù)的事務(wù)一致性。比如,如果RDBMS作為持久化層,Ignite會(huì)在將提交消息發(fā)給相關(guān)的集群節(jié)點(diǎn)之前,將事務(wù)寫入數(shù)據(jù)庫,這樣的話,如果在數(shù)據(jù)庫層發(fā)生事務(wù)故障,Ignite仍然會(huì)將回滾消息發(fā)給所有的相關(guān)節(jié)點(diǎn),從而保持兩者之間的數(shù)據(jù)一致性。
2.4.并置處理
基于磁盤的系統(tǒng),比如RDBMS以及NoSQL,通常使用傳統(tǒng)的C/S模式,這時(shí)數(shù)據(jù)是要從服務(wù)端傳輸?shù)娇蛻舳说模诳蛻舳诉M(jìn)行處理,然后可能被丟棄。這個(gè)方法無法擴(kuò)展,因?yàn)樵诜植际较到y(tǒng)中通過網(wǎng)絡(luò)移動(dòng)大量數(shù)據(jù)是非常昂貴的操作。
一個(gè)擴(kuò)展性更好的方法是并置處理,它會(huì)反過來將計(jì)算帶到數(shù)據(jù)實(shí)際駐留的服務(wù)端節(jié)點(diǎn),它會(huì)在數(shù)據(jù)實(shí)際存儲(chǔ)的地方執(zhí)行高級(jí)的業(yè)務(wù)邏輯或者分布式SQL,甚至關(guān)聯(lián),避免了昂貴的序列化和網(wǎng)絡(luò)開銷。
2.5.機(jī)器學(xué)習(xí)
Ignite的機(jī)器學(xué)習(xí)(ML)是一套簡(jiǎn)單、可擴(kuò)展以及高效的工具,可以構(gòu)建可預(yù)測(cè)的機(jī)器學(xué)習(xí)模型,而不需要昂貴的數(shù)據(jù)傳輸。
將機(jī)器和深度學(xué)習(xí)加入Ignite的原理是很簡(jiǎn)單的,當(dāng)前,如果要想讓機(jī)器學(xué)習(xí)成為主流,數(shù)據(jù)科學(xué)家要解決兩個(gè)主要的問題:
問題#1:常規(guī)數(shù)據(jù)遷移(ETL)
首先,模型是在不同的系統(tǒng)中訓(xùn)練和部署(訓(xùn)練結(jié)束之后)的,數(shù)據(jù)科學(xué)家需要等待ETL或者其他的數(shù)據(jù)傳輸過程,來將數(shù)據(jù)移至比如Apache Mahout或者Apache Spark這樣的系統(tǒng)進(jìn)行訓(xùn)練,然后還要等待這個(gè)過程結(jié)束并且將模型部署到生產(chǎn)環(huán)境。在系統(tǒng)間移動(dòng)TB級(jí)的數(shù)據(jù)可能花費(fèi)數(shù)小時(shí)的時(shí)間,此外,訓(xùn)練部分通常發(fā)生在舊的數(shù)據(jù)集上。
問題#2:水平擴(kuò)展能力缺乏
第二個(gè)問題和擴(kuò)展性有關(guān)。機(jī)器學(xué)習(xí)和深度學(xué)習(xí)需要處理的數(shù)據(jù)量不斷增長(zhǎng),已經(jīng)無法放在單一的服務(wù)器上。這促使數(shù)據(jù)科學(xué)家要么提出更復(fù)雜的解決方案,要么切換到比如Spark或者TensorFlow這樣的分布式計(jì)算平臺(tái)上。但是這些平臺(tái)通常只能解決模型訓(xùn)練的一部分問題,這給開發(fā)者之后的生產(chǎn)部署帶來了很多的困難。
無ETL和大規(guī)模擴(kuò)展性
Ignite的機(jī)器學(xué)習(xí)依賴于Ignite基于內(nèi)存的存儲(chǔ),這給機(jī)器學(xué)習(xí)和深度學(xué)習(xí)任務(wù)帶來了大規(guī)模的擴(kuò)展性,并且取消了在不同系統(tǒng)間進(jìn)行ETL產(chǎn)生的等待。比如,在Ignite集群的內(nèi)存和磁盤中存儲(chǔ)的數(shù)據(jù)上,開發(fā)者可以直接進(jìn)行深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的訓(xùn)練和推理,然后,Ignite提供了一系列的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)算法,對(duì)Ignite的分布式并置處理進(jìn)行優(yōu)化,這樣在處理大規(guī)模的數(shù)據(jù)集或者不斷增長(zhǎng)的輸入數(shù)據(jù)流時(shí),這樣的實(shí)現(xiàn)提供了內(nèi)存級(jí)的速度和近乎無限的擴(kuò)展性,而不需要將數(shù)據(jù)移到另外的存儲(chǔ)。通過消除數(shù)據(jù)的移動(dòng)以及長(zhǎng)時(shí)間的處理等待,Ignite的機(jī)器學(xué)習(xí)可以持續(xù)地進(jìn)行學(xué)習(xí),可以在最新數(shù)據(jù)到來之時(shí)實(shí)時(shí)地對(duì)決策進(jìn)行改進(jìn)。
容錯(cuò)和持續(xù)學(xué)習(xí)
Ignite的機(jī)器學(xué)習(xí)能夠?qū)?jié)點(diǎn)的故障容錯(cuò)。這意味著如果在學(xué)習(xí)期間節(jié)點(diǎn)出現(xiàn)故障,所有的恢復(fù)過程對(duì)用戶是透明的,學(xué)習(xí)過程不會(huì)被中斷,就像所有節(jié)點(diǎn)都正常那樣獲得結(jié)果。
2.6.多語言支持
Ignite是以Java語言為主進(jìn)行開發(fā)的,因此可以在JVM支持的任何操作系統(tǒng)和架構(gòu)上部署和運(yùn)行,比如,Ignite可以部署在Linux、Windows、MacOS、Oracle Solaris等操作系統(tǒng)上,支持x86、x64、SPARC、PowerPC指令集架構(gòu)。
Java的API支持Ignite的所有功能,使用Java或者Scala開發(fā)的應(yīng)用,相關(guān)的邏輯可以直接嵌入Ignite,然后借助于SQL以及鍵-值操作與集群進(jìn)行交互,執(zhí)行分布式計(jì)算和機(jī)器學(xué)習(xí)算法等等。
除了Java,Ignite還支持.NET平臺(tái),Ignite.NET和Ignite C++使用JNI,會(huì)把大部分的調(diào)用轉(zhuǎn)發(fā)給Java,這里需要注意的是,JNI的負(fù)載非常小,不會(huì)導(dǎo)致性能的下降,尤其是在分布式環(huán)境,整體的應(yīng)用性能中網(wǎng)絡(luò)是主要的開銷。
使用標(biāo)準(zhǔn)的JDBC或者ODBC連接,可以像其他的SQL存儲(chǔ)一樣與Ignite進(jìn)行交互。Ignite還為Java、.NET和C++開發(fā)者提供原生的SQL API,性能更好。
要使用其他的語言訪問Ignite,比如Python、Ruby、PHP或者NodeJS,可以考慮使用Ignite的二進(jìn)制客戶端協(xié)議,JDBC或者ODBC驅(qū)動(dòng),或者文檔中提到的其他客戶端協(xié)議。
3.擴(kuò)展特性
3.1.服務(wù)網(wǎng)格
服務(wù)網(wǎng)格可以在集群中任意部署自定義的服務(wù),可以實(shí)現(xiàn)和部署任意服務(wù),比如自定義計(jì)數(shù)器,ID生成器,分級(jí)映射等。
服務(wù)網(wǎng)格的主要應(yīng)用場(chǎng)景是提供了在集群中部署各種單例服務(wù)的能力。但是,如果需要一個(gè)服務(wù)的多實(shí)例,Ignite也能保證所有服務(wù)實(shí)例的正確部署和容錯(cuò)。
3.2.數(shù)據(jù)注入和流計(jì)算
Ignite流式計(jì)算允許以可擴(kuò)展和容錯(cuò)的方式處理連續(xù)不中斷的數(shù)據(jù)流。在一個(gè)中等規(guī)模的集群中,數(shù)據(jù)注入Ignite的比例會(huì)很高,很容易達(dá)到每秒百萬級(jí)的規(guī)模。
Ignite可以與主要的流處理技術(shù)和框架進(jìn)行集成,比如Kafka、Camel、Storm或者JMS,他們可以為基于Ignite的架構(gòu)帶來非常強(qiáng)大的功能。
數(shù)據(jù)加載
Ignite提供了若干種技術(shù)來對(duì)數(shù)據(jù)進(jìn)行預(yù)加載,比如,開啟原生持久化后,Ignite的流處理API就是一個(gè)好的選擇,如果使用第三方存儲(chǔ),那么使用CacheStoreAPI可以直接接入。
工作方式:
-
客戶端將流式數(shù)據(jù)注入Ignite;
-
數(shù)據(jù)在Ignite數(shù)據(jù)節(jié)點(diǎn)中自動(dòng)分區(qū);
-
數(shù)據(jù)在
滑動(dòng)窗口中并發(fā)處理; -
客戶端在流式數(shù)據(jù)中執(zhí)行并發(fā)
SQL查詢; -
客戶端訂閱數(shù)據(jù)變化的
持續(xù)查詢。
3.3.RDBMS集成
Ignite支持與各種持久化存儲(chǔ)進(jìn)行集成,它可以接入數(shù)據(jù)庫、導(dǎo)入模式、配置索引類型、以及自動(dòng)化地生成所有必要的XML OR映射配置和Java領(lǐng)域模型POJO,他們可以很容易地導(dǎo)入自己的開發(fā)工程。
Ignite可以與任何支持JDBC驅(qū)動(dòng)的關(guān)系型數(shù)據(jù)庫(RDBMS)進(jìn)行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和MySQL。
RDBMS集成向?qū)?/strong>
通過Web控制臺(tái),Ignite支持自動(dòng)化的RDBMS集成,它是一個(gè)交互式的配置向?qū)?、管理和監(jiān)控工具,功能包括:
-
創(chuàng)建和下載各種集群的配置文件;
-
從任何RDBMS模式中自動(dòng)化地構(gòu)建Ignite的SQL元數(shù)據(jù);
-
在內(nèi)存緩存中執(zhí)行SQL查詢;
-
查看查詢的執(zhí)行計(jì)劃、內(nèi)存模式和流化圖表。
這個(gè)Web控制臺(tái)是一個(gè)創(chuàng)新的工具,它提供了豐富的功能來管理集群,并不限于上述提到的這些功能。
3.4.分布式數(shù)據(jù)結(jié)構(gòu)
Ignite以分布式的形式支持基于java.util.concurrent框架的大部分?jǐn)?shù)據(jù)結(jié)構(gòu)。比如,可以在一個(gè)節(jié)點(diǎn)上使用java.util.concurrent.BlockingQeque加入一些東西,然后再另一個(gè)節(jié)點(diǎn)上獲取它?;蛘哂幸粋€(gè)分布式的ID生成器,他可以保證所有節(jié)點(diǎn)上的ID唯一性。
支持的數(shù)據(jù)結(jié)構(gòu)包括:
-
Concurrent Map (Cache)
-
分布式隊(duì)列和集合
-
AtomicLong
-
AtomicReference
-
AtomicSequence (ID生成器)
-
CountDownLatch
-
ExecutorService
3.5.消息和事件
Ignite提供了集群范圍的高性能的消息功能,支持基于發(fā)布-訂閱以及直接點(diǎn)對(duì)點(diǎn)通信模型的數(shù)據(jù)交換。消息可以以有序的,也可以以無序的方式進(jìn)行交換。有序消息會(huì)稍微有點(diǎn)慢,但是如果使用的話,Ignite會(huì)保證收到消息的順序和發(fā)送消息的順序一致。
當(dāng)在分布式網(wǎng)格環(huán)境中發(fā)生各種事件時(shí),Ignite的分布式事件功能可以使應(yīng)用收到通知??梢宰詣?dòng)地收到集群內(nèi)的本地和遠(yuǎn)程節(jié)點(diǎn)上發(fā)生的任務(wù)執(zhí)行、讀寫和查詢操作的通知,事件通知也可以分組在一起然后分批或者定期地發(fā)送。
4.架構(gòu)
4.1.集群和部署
Ignite集群基于無共享架構(gòu),所有的集群節(jié)點(diǎn)都是平等的,獨(dú)立的,整個(gè)集群不存在單點(diǎn)故障。
通過靈活的Discovery SPI組件,Ignite節(jié)點(diǎn)可以自動(dòng)地發(fā)現(xiàn)對(duì)方,因此只要需要,可以輕易地對(duì)集群進(jìn)行縮放。
Ignite可以獨(dú)立運(yùn)行,可以組成集群,可以運(yùn)行于Kubernetes和Docker容器中,也可以運(yùn)行在Apache Mesos以及Hadoop Yarn上,可以運(yùn)行于虛擬機(jī)和云環(huán)境,也可以運(yùn)行于物理機(jī),從技術(shù)上來說,集群部署在哪里,是沒有限制的。
服務(wù)端、客戶端和協(xié)議
Ignite中定義有兩種類型的節(jié)點(diǎn),客戶端和服務(wù)端節(jié)點(diǎn),分別有不同的用途。
服務(wù)端節(jié)點(diǎn)作為數(shù)據(jù)和計(jì)算的容器,一旦接入,Ignite就會(huì)作為分布式數(shù)據(jù)庫(或者叫數(shù)據(jù)網(wǎng)格)存儲(chǔ)數(shù)據(jù),然后參與查詢的處理、計(jì)算的執(zhí)行、數(shù)據(jù)流處理等等。
而對(duì)于客戶端節(jié)點(diǎn),提供了遠(yuǎn)程接入分布式數(shù)據(jù)庫(一組服務(wù)端節(jié)點(diǎn))的功能,Ignite的原生客戶端可以使用完整的Ignite API,包括SQL、事務(wù)、計(jì)算、數(shù)據(jù)流、服務(wù)等等。
除了客戶端節(jié)點(diǎn),還可以通過Ignite的二進(jìn)制客戶端協(xié)議、JDBC/ODBC驅(qū)動(dòng)、REST API接入集群。
公有云
對(duì)于公共云環(huán)境,Ignite原生集成了Amazon AWS以及Google Compute Engine,對(duì)于其他的云環(huán)境,Ignite集成了JCloud,它支持了大部分的已有云服務(wù)商。
容器
Ignite完全支持容器環(huán)境,Ignite與Docker的集成可以在服務(wù)啟動(dòng)之前,自動(dòng)地將業(yè)務(wù)代碼構(gòu)建并且部署進(jìn)Ignite。
Ignite也可以部署在Kubernetes中,可以自動(dòng)地部署和管理容器化的應(yīng)用。
資源管理器
Ignite提供了對(duì)Hadoop Yarn,Kubernetes和Apache Mesos的原生支持,可以很容易地部署到這些環(huán)境。
4.2.基于內(nèi)存的存儲(chǔ)
Ignite基于分布式的內(nèi)存架構(gòu),它將內(nèi)存計(jì)算的性能和擴(kuò)展性,與磁盤持久化和強(qiáng)一致性整合到一個(gè)系統(tǒng)中。
基于內(nèi)存的方式和傳統(tǒng)的基于磁盤的方式的主要不同是,Ignite將內(nèi)存視為全功能的存儲(chǔ),而不是像傳統(tǒng)大多數(shù)數(shù)據(jù)庫那樣僅僅是一個(gè)緩存層。比如,Ignite可以運(yùn)行于純內(nèi)存模式,這時(shí)它就是一個(gè)內(nèi)存數(shù)據(jù)庫(IMDB)和內(nèi)存數(shù)據(jù)網(wǎng)格(IMDG)。
另一方面,如果打開了持久化,Ignite就變成了一個(gè)處理是在內(nèi)存中進(jìn)行的基于內(nèi)存的系統(tǒng),但是數(shù)據(jù)和索引又持久化到磁盤上。這里與傳統(tǒng)的基于磁盤的RDBMS或NoSQL系統(tǒng)的主要區(qū)別是,Ignite支持強(qiáng)一致、水平擴(kuò)展、并且同時(shí)支持SQL和鍵-值處理API。
并置和C/S處理
基于磁盤的系統(tǒng),比如RDBMS或者NoSQL,通常采用傳統(tǒng)的C/S模式,數(shù)據(jù)需要從服務(wù)端傳輸?shù)揭幚淼目蛻舳耍ǔW罱K又被廢棄,這種方法不可擴(kuò)展,因?yàn)樵诜植际较到y(tǒng)中,通過網(wǎng)絡(luò)移動(dòng)大量數(shù)據(jù)是非常昂貴的開銷。
一個(gè)更有擴(kuò)展性的方式是,通過將計(jì)算放在數(shù)據(jù)實(shí)際存儲(chǔ)的服務(wù)端上,反過來實(shí)現(xiàn)并置處理,這個(gè)方法可以直接在數(shù)據(jù)實(shí)際存放的地方直接執(zhí)行業(yè)務(wù)邏輯或者分布式SQL關(guān)聯(lián),避免了昂貴的序列化和網(wǎng)絡(luò)開銷。
分區(qū)和復(fù)制
根據(jù)配置,Ignite在內(nèi)存存儲(chǔ)中,可以是分區(qū)模式,也可以是復(fù)制模式,復(fù)制模式中,數(shù)據(jù)在集群中的每個(gè)節(jié)點(diǎn)都有一份副本,而分區(qū)模式,Ignite會(huì)在多個(gè)集群節(jié)點(diǎn)上對(duì)數(shù)據(jù)進(jìn)行平均拆分,因此可以在內(nèi)存及磁盤上存儲(chǔ)TB級(jí)的數(shù)據(jù)。
冗余
Ignite可以配置多個(gè)副本,來保證故障時(shí)的數(shù)據(jù)彈性。
一致性
不管使用哪種復(fù)制方案,Ignite都會(huì)保證整個(gè)集群的數(shù)據(jù)一致性。
Ignite作為內(nèi)存存儲(chǔ)
持久化對(duì)Ignite來說是可選的,這時(shí)整個(gè)集群就會(huì)工作于純內(nèi)存模式,所有的數(shù)據(jù)和索引都會(huì)只存儲(chǔ)于內(nèi)存中,這樣會(huì)得到最高的性能,因?yàn)閿?shù)據(jù)不需要寫入磁盤。為了避免可能的節(jié)點(diǎn)故障導(dǎo)致數(shù)據(jù)丟失,建議適當(dāng)?shù)嘏渲靡恍﹤浞荩ɑ蛘呓袕?fù)制因子)。
Ignite持久化
可以有兩種方式開啟持久化,第一個(gè)方式是,使用它自己的分布式、ACID以及兼容SQL的持久化,這可以透明地與所有的內(nèi)存架構(gòu)透明且高效地集成。
如果開啟了原生持久化,Ignite會(huì)在磁盤上存儲(chǔ)數(shù)據(jù)的超集,然后在內(nèi)存中存儲(chǔ)盡可能多的數(shù)據(jù)。比如,一共有100條數(shù)據(jù),內(nèi)存有能力存儲(chǔ)20條,那么磁盤會(huì)存儲(chǔ)所有的100條,而為了高性能,內(nèi)存可以只緩存20條。
Ignite與第三方數(shù)據(jù)庫
第二個(gè)開啟持久化的方式,是將Ignite部署在已有的第三方數(shù)據(jù)庫之上,比如RDBMS、Apache Cassandra或者M(jìn)ongoDB。這種方式通過將部分?jǐn)?shù)據(jù)的副本放在內(nèi)存中,用于對(duì)底層數(shù)據(jù)庫進(jìn)行加速。Ignite支持通讀和通寫模式,確保數(shù)據(jù)一致性以及兩者之間的同步。
4.3.固化內(nèi)存
Ignite基于固化內(nèi)存架構(gòu),如果開啟了原生持久化,可以同時(shí)處理存儲(chǔ)于內(nèi)存和磁盤上的數(shù)據(jù)和索引。
固化內(nèi)存架構(gòu),它將內(nèi)存計(jì)算的性能和擴(kuò)展性,與磁盤持久化和強(qiáng)一致性整合到一個(gè)系統(tǒng)中。
Ignite固化內(nèi)存的操作方式,類似于比如Linux這樣的操作系統(tǒng)的虛擬內(nèi)存。但是兩者的顯著區(qū)別是,如果開啟了持久化存儲(chǔ),除了將整個(gè)或者部分?jǐn)?shù)據(jù)保存在內(nèi)存中,還會(huì)將整個(gè)數(shù)據(jù)集加上索引放在磁盤上,而虛擬內(nèi)存只是在內(nèi)存用盡時(shí)才使用磁盤,磁盤只是用于交換用途。
Ignite原生持久化
Ignite原生持久化是數(shù)據(jù)持久化的一個(gè)非常靈活、可擴(kuò)展以及方便的方式,它廣泛應(yīng)用于應(yīng)用需要一個(gè)分布式內(nèi)存數(shù)據(jù)庫的場(chǎng)景中。
Ignite的原生持久化是一個(gè)分布式的、ACID、兼容SQL的磁盤存儲(chǔ),它可以與Ignite的固化內(nèi)存無縫地集成,Ignite原生持久化是可選的,可以打開和關(guān)閉,如果關(guān)閉,Ignite就是一個(gè)純內(nèi)存存儲(chǔ)。
下面是Ignite作為一個(gè)平臺(tái),如果固化內(nèi)存和原生持久化同時(shí)使用的優(yōu)勢(shì)和特點(diǎn):
內(nèi)存
-
堆外內(nèi)存
-
避免明顯的GC暫停
-
自動(dòng)碎片整理
-
可預(yù)測(cè)的內(nèi)存消耗
-
高SQL性能
磁盤
-
可選的持久化
-
支持閃存、SSD以及Intel的3D Xpoint
-
存儲(chǔ)數(shù)據(jù)的超集
-
全事務(wù)化(預(yù)寫日志W(wǎng)AL)
-
集群瞬時(shí)啟動(dòng)
第三方持久化
Ignite可以用于已有第三方數(shù)據(jù)庫的緩存層,包括RDBMS、NoSQL或者HDFS。該方式用于對(duì)保存數(shù)據(jù)的底層數(shù)據(jù)庫進(jìn)行加速,Ignite將數(shù)據(jù)保存在內(nèi)存中,在多個(gè)節(jié)點(diǎn)中進(jìn)行分布,提供了更快的數(shù)據(jù)訪問,它減少了應(yīng)用和數(shù)據(jù)庫之間因?yàn)閿?shù)據(jù)移動(dòng)導(dǎo)致的網(wǎng)絡(luò)負(fù)載。但是與原生持久化相比,是有很多限制的,比如,SQL查詢只能在內(nèi)存中保存的數(shù)據(jù)上執(zhí)行,因此,首先需要將數(shù)據(jù)預(yù)先從磁盤加載到內(nèi)存中。
交換空間
如果不希望使用原生持久化或者第三方持久化,還可以開啟交換,這時(shí),如果內(nèi)存過載,內(nèi)存中的數(shù)據(jù)會(huì)被移動(dòng)到磁盤上的交換空間中,如果開啟了交換空間,Ignite將數(shù)據(jù)存儲(chǔ)于內(nèi)存映射文件(MMF)中,根據(jù)當(dāng)前的內(nèi)存使用量,操作系統(tǒng)會(huì)將MMF的內(nèi)容交換到磁盤。交換空間通常用于避免由于內(nèi)存過載導(dǎo)致的內(nèi)存溢出錯(cuò)誤(OOME),以及需要更多時(shí)間來對(duì)集群進(jìn)行縮放,從而對(duì)數(shù)據(jù)集進(jìn)行更平均的分布的場(chǎng)景。
5.數(shù)據(jù)可視化
Ignite可以與很多數(shù)據(jù)可視化工具集成,通過圖表或者豐富的圖形,協(xié)助對(duì)存儲(chǔ)在分布式緩存中的數(shù)據(jù)進(jìn)行分析和解釋,甚至提供可操作的建議。
IgniteWeb控制臺(tái)
Ignite的Web控制臺(tái)是一個(gè)基于Web的交互式管理工具, 功能包括:
-
創(chuàng)建、下載Ignite的各種配置;
-
從RDBMS中自動(dòng)加載SQL元數(shù)據(jù);
-
接入Ignite集群然后執(zhí)行SQL;
-
管理和監(jiān)控Ignite節(jié)點(diǎn)和緩存;
-
查看堆、CPU以及其它有用的節(jié)點(diǎn)和緩存的指標(biāo);
Tableau
Tableau是一個(gè)聚焦于商業(yè)智能的交互式數(shù)據(jù)可視化工具,通過Ignite的ODBC驅(qū)動(dòng),Tableau就可以接入Ignite集群,功能包括:
-
查詢集群中存儲(chǔ)的分布式數(shù)據(jù);
-
緩存數(shù)據(jù)的表格或者圖形展示;
-
使用Tableau支持的各種方式對(duì)數(shù)據(jù)進(jìn)行分析;
Zeppelin
Apache Zeppelin是一個(gè)基于Web的記事本,可以交互式地對(duì)數(shù)據(jù)進(jìn)行分析,通過Ignite的JDBC驅(qū)動(dòng),Zeppelin就可以接入集群,功能包括:
- 通過Ignite的SQL解釋器獲取分布式數(shù)據(jù); - 緩存數(shù)據(jù)的表格或者圖形展示; - 通過Scala執(zhí)行分布式的計(jì)算。
6.Ignite & Spark
6.1.Spark共享內(nèi)存層
Ignite共享RDD
Apache Ignite提供了一個(gè)Spark RDD抽象的實(shí)現(xiàn),他允許跨越多個(gè)Spark作業(yè)時(shí)方便地在內(nèi)存內(nèi)共享狀態(tài),在不同的Spark作業(yè)、worker或者應(yīng)用之間,IgniteRDD為內(nèi)存中的相同數(shù)據(jù)提供了一個(gè)共享、可變的視圖,原生的SparkRDD無法在多個(gè)Spark作業(yè)或者應(yīng)用之間進(jìn)行共享。
IgniteRDD作為Ignite分布式緩存的視圖,既可以在Spark作業(yè)執(zhí)行進(jìn)程中部署,也可以在Spark worker中部署,也可以在它自己的集群中部署。根據(jù)預(yù)配置的部署模型,狀態(tài)共享既可以只存在于一個(gè)Spark應(yīng)用的生命周期的內(nèi)部(嵌入式模式),或者也可以存在于Spark應(yīng)用的外部(獨(dú)立模式)。
雖然SparkSQL支持豐富的SQL語法,但是它沒有實(shí)現(xiàn)索引。這樣即使在一個(gè)不太大的數(shù)據(jù)集上執(zhí)行查詢,也可能花費(fèi)比較長(zhǎng)的時(shí)間,因?yàn)樾枰獙?duì)數(shù)據(jù)進(jìn)行全部掃描。如果使用Ignite,開發(fā)者可以配置一級(jí)和二級(jí)索引,帶來上千倍的性能提升。
Ignite DataFrames
Spark的DataFrame API引入了模式的概念來描述數(shù)據(jù),這樣Spark就可以以表格的形式管理模式和組織數(shù)據(jù)。簡(jiǎn)而言之,DataFrame就是組織成命名列的分布式數(shù)據(jù)集合。它從概念上來說,等價(jià)于關(guān)系數(shù)據(jù)庫的表,會(huì)促使Spark執(zhí)行查詢優(yōu)化器,產(chǎn)生比RDD更高效的執(zhí)行計(jì)劃,而RDD僅僅是集群中的一個(gè)分區(qū)化的元素集合。
Ignite擴(kuò)展了DataFrame,如果將Ignite作為Spark的內(nèi)存層,會(huì)簡(jiǎn)化開發(fā)以及提高性能,好處包括:
-
通過向Ignite讀寫DataFrames,可以在Spark作業(yè)之間共享數(shù)據(jù)和狀態(tài);
-
通過高級(jí)的索引以及避免數(shù)據(jù)在網(wǎng)絡(luò)中的移動(dòng),優(yōu)化Spark的查詢執(zhí)行計(jì)劃,使Spark查詢速度更快。
