ignite学习笔记
1、一個Ignite節(jié)點可以從命令行啟動,可以用默認的配置也可以傳遞一個配置文件。可以啟動很多很多的節(jié)點然后他們會自動地發(fā)現(xiàn)對方。
2、Ignite只需要一個ignite-core強依賴,通常你還需要添加ignite-spring,來做基于spring的XML配置,還有ignite-indexing,來做SQL查詢。
3、由于Ignite的零部署特性,當從IDE運行上面的程序時,遠程節(jié)點沒有經(jīng)過顯示的部署,就獲得了計算作業(yè)。
4、導入獨立模塊。
ignite-spring:基于Spring的配置支持
ignite-indexing:SQL查詢和索引
ignite-geospatial:地理位置索引
ignite-hibernate:Hibernate集成
ignite-web:Web Session集群化
ignite-schedule:基于Cron的計劃任務(wù)
ignite-log4j:Log4j日志
ignite-jcl:Apache Commons logging日志
ignite-jta:XA集成
ignite-hadoop2-integration:HDFS2.0集成
ignite-rest-http:HTTP REST請求
ignite-scalar:Ignite Scalar API
ignite-slf4j:SLF4J日志
ignite-ssh;SSH支持,遠程機器上啟動網(wǎng)格節(jié)點
ignite-urideploy:基于URI的部署
ignite-aws:AWS S3上的無縫集群發(fā)現(xiàn)
ignite-aop:網(wǎng)格支持AOP
ignite-visor-console:開源的命令行管理和監(jiān)控工具
5、有時可能希望在Ignite節(jié)點啟動和停止的之前和之后執(zhí)行特定的操作,這個可以通過實現(xiàn)LifecycleBean接口實現(xiàn),然后在spring的配置文件中通過指定IgniteConfiguration的lifecycleBeans屬性實現(xiàn)。
6、支持的事件(這些事件也是可以被監(jiān)聽的)
BEFORE_NODE_START:Ignite節(jié)點的啟動程序初始化之前調(diào)用
AFTER_NODE_START:Ignite節(jié)點啟動之后調(diào)用
BEFORE_NODE_STOP:Ignite節(jié)點的停止程序初始化之前調(diào)用
AFTER_NODE_STOP:Ignite節(jié)點停止之后調(diào)用
7、Ignite API中的所有分布式方法都既可以同步執(zhí)行也可以異步執(zhí)行。
8、IgniteAsyncSupport接口為很多Ignite API提供了異步模型,比如,IgniteCompute,IgniteServices,IgniteCache以及IgniteTransactions,都實現(xiàn)了IgniteAsyncSupport接口。
要啟用異步模式,需要調(diào)用withAsync()方法,他會返回同樣API的實例,這樣的話,異步功能就啟用了。
如果異步功能啟用了,實際的同步方法的返回值就被忽略了,異步操作中獲得返回值的唯一方式是通過future()方法。
9、Ignite有一個可選的概念,就是客戶端節(jié)點和服務(wù)器端節(jié)點,服務(wù)器節(jié)點參與緩存,計算,流式處理等等,而原生的客戶端節(jié)點提供了遠程連接服務(wù)器的能力。
10、當在Ignite中創(chuàng)建緩存時,不管是通過XML方式,還是通過Ignite.createCache(...)或者Ignite.getOrCreateCache(...)方法,Ignite會自動地在所有的服務(wù)端節(jié)點中部署分布式緩存。
11、IgniteCompute默認會在所有的服務(wù)端節(jié)點上執(zhí)行作業(yè),然而,也可以通過創(chuàng)建相應(yīng)的集群組來選擇是只在服務(wù)端節(jié)點還是只在客戶端節(jié)點上執(zhí)行作業(yè)。
12、要管理這些狀況(客戶端卡慢),可以配置允許向客戶端節(jié)點輸出消息的最大值,如果輸出隊列的大小超過此值,該客戶端節(jié)點會從集群斷開以防止拖慢整個集群。
13、Ignite的唯一特點是所有節(jié)點都是平等的。沒有master節(jié)點或者server節(jié)點,也沒有worker節(jié)點或者client節(jié)點,按照Ignite的觀點所有節(jié)點都是平等的。但是,開發(fā)者可以將節(jié)點配置成master,worker,或者client以及data節(jié)點。
所有集群節(jié)點啟動時都會自動將所有的環(huán)境和系統(tǒng)屬性注冊為節(jié)點的屬性,開發(fā)者也可以通過配置自定義節(jié)點屬性。
14、可以基于一些謂詞定義動態(tài)集群組,這個集群組只會包含符合該謂詞的節(jié)點。
下面是一個例子,一個集群組只會包括CPU利用率小于50%的節(jié)點,注意這個組里面的節(jié)點會隨著CPU負載的變化而改變。
15、很多系統(tǒng)選舉領(lǐng)導者通常要處理數(shù)據(jù)一致性,然后通常是通過收集集群成員的選票處理的。而在Ignite中,數(shù)據(jù)一致性是通過數(shù)據(jù)網(wǎng)格的類似功能處理的(Rendezvous Hashing或者HRW哈希),選擇領(lǐng)導者在傳統(tǒng)意義上的數(shù)據(jù)一致性,在數(shù)據(jù)網(wǎng)格以外就不是真的需要了。
然而,可能還是希望有一個協(xié)調(diào)員節(jié)點來處理某些任務(wù),為了這個,Ignite允許在集群中自動地選擇最老的或者最新的節(jié)點。
16、Ignite中,通過DiscoverySpi節(jié)點可以彼此發(fā)現(xiàn)對方,Ignite提供了TcpDiscoverySpi作為DiscoverySpi的默認實現(xiàn),它使用TCP/IP來作為節(jié)點發(fā)現(xiàn)的實現(xiàn),可以配置成基于多播的或者基于靜態(tài)IP的。
17、Docker允許將Ignite應(yīng)用及其所有的依賴打包進一個標準的容器,Docker會自動下載Ignite發(fā)布版,將代碼部署進Ignite以及配置節(jié)點,他還可以自動啟動配置好的Ignite節(jié)點,這樣的集成使只需要簡單地重啟Ignite Docker容器就可以部署新的節(jié)點。
18、Ignite數(shù)據(jù)網(wǎng)格支持本地、復制的、分區(qū)化的數(shù)據(jù)集,允許使用標準SQL語法方便地進行跨數(shù)據(jù)集查詢,同時還支持在內(nèi)存數(shù)據(jù)中進行分布式SQL關(guān)聯(lián)。
19、Ignite實現(xiàn)了JCache(JSR107)規(guī)范(持久化存儲)。
20、Ignite提供了三種不同的緩存操作模式,分區(qū)、復制和本地。(三種各有優(yōu)劣)
21、CacheWriteSynchronizationMode枚舉可以用來配置主節(jié)點和備份部分的同步和異步更新。
21、對于SQL查詢,Ignite提供了內(nèi)存內(nèi)的索引,因此所有的數(shù)據(jù)檢索都是非??斓?#xff0c;如果是在堆外內(nèi)存中緩存數(shù)據(jù)的,那么查詢索引也會緩存在堆外內(nèi)存中。
22、Ignite對SQL查詢的支持幾乎沒有任何限制,語法兼容于ANSI-99,可以使用任何SQL函數(shù),聚合以及分組,Ignite會找出從哪里獲得查詢結(jié)果。(可以跨緩存查詢)
23、持續(xù)查詢對于當執(zhí)行一個查詢之后希望持續(xù)地獲得該查詢結(jié)果數(shù)據(jù)更新的通知時,是很有用的。 持續(xù)查詢是通過ContinuousQuery類實現(xiàn)的
24、鑒于分區(qū)緩存是最常見的緩存數(shù)據(jù)的方式,那么數(shù)據(jù)和計算以及數(shù)據(jù)和數(shù)據(jù)的并置就可以顯著地提升性能和應(yīng)用的可擴展性。
在許多情況下,如果不同的緩存鍵被同時訪問的話那么將他們并置在一起是很有利的。通常來說業(yè)務(wù)邏輯需要訪問不止一個的緩存鍵,通過將他們并置在一起可以確保所有的鍵具有緩存在同一個處理節(jié)點上的同一個affinityKey,從而避免從遠程節(jié)點獲取數(shù)據(jù)的昂貴網(wǎng)絡(luò)開銷。
例如,有一個Person和Company對象,然后希望將Person對象和其工作的Company對象并置在一起。對于一個鍵類型有兩種聲明關(guān)系鍵的方式。
25、雖然Ignite可以單獨地配置CacheRLoader和CacheWriter,但是在兩個單獨的類中實現(xiàn)事務(wù)化存儲是非常尷尬的,因為多個load和put操作需要在同一個事務(wù)中的同一個連接中共享狀態(tài)。為了緩解這個問題,Ignite提供了·org.apacche.ignite.cache.store.CacheStore·接口,他同時擴展了CacheLoader和CacheWriter。當希望通讀和通寫時,提供一個正常的緩存存儲的實現(xiàn)是很重要的。通讀意味著當緩存無效時會從持久化存儲中讀取,通寫意味著當緩存更新時會自動地進行持久化。所有的通讀和通寫都會參與整體的緩存事務(wù)以及作為一個整體提交或者回滾。
要配置通讀和通寫,需要實現(xiàn)CacheStore接口以及設(shè)置CacheConfiguration中cacheStoreFactory的readThrough和writeThrough屬性,下面的例子會有說明。
26、數(shù)據(jù)加載通常用于啟動時初始化緩存數(shù)據(jù),用標準的緩存put(...)和putAll(...)操作通常加載大量的數(shù)據(jù)是比較低效的。數(shù)據(jù)流處理器是通過IgniteDataStreamerAPI定義的,他可以將大量的連續(xù)數(shù)據(jù)注入Ignite緩存。數(shù)據(jù)流處理器以可擴展和容錯的方式在數(shù)據(jù)被發(fā)送到集群節(jié)點之前通過把定量數(shù)據(jù)放在一起以獲得高性能。
數(shù)據(jù)流處理器可以用于任何時候?qū)⒋罅繑?shù)據(jù)載入緩存,包括啟動時的預(yù)加載。
將大量數(shù)據(jù)載入緩存的另一個方法是通過CacheStore.loadCache()方法,他可以在不傳入要加載的所有鍵的情況下進行緩存的數(shù)據(jù)加載。
27、數(shù)據(jù)流處理器是通過IgniteDataStreamerAPI定義的,他可以往Ignite數(shù)據(jù)流緩存中注入大量的持續(xù)不斷的數(shù)據(jù)流,數(shù)據(jù)流處理器對于所有流入Ignite的數(shù)據(jù)以可擴展和容錯的方式提供了至少一次保證。
28、滑動窗口可以和任何其他Ignite緩存以同樣的方式進行查詢,可以使用基于謂詞的,基于SQL的和基于文本的查詢。
29、Ignite除了提供了標準的鍵-值的類似于Map的存儲以外,也提供了一個快速的分布式阻塞隊列和分布式集合的實現(xiàn)。
IgniteQueue和IgniteSet分別是java.util.concurrent.BlockingQueue和java.util.Set接口的實現(xiàn),也支持java.util.Collection接口的所有功能,這兩個實現(xiàn)既可以以并置模式也可以以非并置模式創(chuàng)建。
30、分布式計算是通過以并行的方式執(zhí)行來獲得高性能、低延遲和線性可擴展。Ignite計算網(wǎng)格提供了一套簡單的API,使得可以在集群內(nèi)的多臺計算機上執(zhí)行分布式計算和數(shù)據(jù)處理。分布式并行處理是基于在任何集群節(jié)點集合上進行計算和執(zhí)行然后將結(jié)果返回的能力實現(xiàn)的。
31、Ignite計算網(wǎng)格可以對集群或者集群組內(nèi)的任何閉包進行廣播和負載平衡,包括純Java的runnables和callables。
32、ComputeTask是Ignite對于簡化內(nèi)存內(nèi)MapReduce的抽象,這個也非常接近于ForkJoin范式,純粹的MapReduce從來不是為了性能而設(shè)計,只適用于處理離線的批量業(yè)務(wù)處理(比如Hadoop MapReduce)。然而,當對內(nèi)存內(nèi)的數(shù)據(jù)進行計算時,實時性低延遲和高吞吐量通常具有更高的優(yōu)先級。同樣,簡化API也變得非常重要??紤]到這一點,Ignite推出了ComputeTask API,它是一個輕量級的MapReduce(或ForkJoin)實現(xiàn)。
ComputeTask定義了要在集群內(nèi)執(zhí)行的作業(yè)以及這些作業(yè)到節(jié)點的映射,他還定義了如何處理作業(yè)的返回值(Reduce)。所有的IgniteCompute.execute(...)方法都會在集群上執(zhí)行給定的任務(wù),應(yīng)用只需要實現(xiàn)ComputeTask接口的map(...)和reduce(...)方法即可。
33、每個任務(wù)執(zhí)行時都會創(chuàng)建分布式任務(wù)會話,他是由ComputeTaskSession接口定義的。任務(wù)會話對于任務(wù)和其產(chǎn)生的所有作業(yè)都是可見的,因此一個作業(yè)或者一個任務(wù)設(shè)置的屬性也可以被其他的作業(yè)訪問。任務(wù)會話也可以在屬性設(shè)置或者等待屬性設(shè)置時接收通知。
34、通常來說在不同的計算作業(yè)或者不同的部署服務(wù)之間共享狀態(tài)是很有用的,為此Ignite在每個節(jié)點上提供了一個共享并發(fā)node-local-map。
IgniteCluster cluster = ignite.cluster();
ConcurrentMap<String, Integer> nodeLocalMap = cluster.nodeLocalMap():
35、Ignite支持作業(yè)的自動故障轉(zhuǎn)移,當一個節(jié)點崩潰時,作業(yè)會被轉(zhuǎn)移到其他可用節(jié)點再次執(zhí)行。然而在Ignite中也可以將任何作業(yè)的結(jié)果認為是失敗的。工作的節(jié)點可以仍然是存活的,但是他運行在一個很低的CPU,I/O,磁盤空間等資源上,在很多情況下會導致應(yīng)用的故障然后觸發(fā)一個故障的轉(zhuǎn)移。此外,也有選擇一個作業(yè)故障轉(zhuǎn)移到那個節(jié)點的功能,因為同一個應(yīng)用內(nèi)部不同的程序或者不同的計算也會是不同的。
36、負載平衡組件將作業(yè)在集群節(jié)點之間平衡分配。Ignite中負載平衡是通過LoadBalancingSpi獲得的。它控制所有節(jié)點的負載以及確保集群中的每個節(jié)點負載水平均衡。對于同質(zhì)化環(huán)境中的同質(zhì)化的任務(wù),負載平衡采用的是隨機或者循環(huán)的策略。然而在很多其他場景中,特別是在一些不均勻的負載下,就需要更復雜的自適應(yīng)負載平衡策略。
37、服務(wù)網(wǎng)格可以在集群上部署任意用戶定義的服務(wù),比如自定義計數(shù)器,ID生成器,分層映射等。
Ignite可以控制每個集群節(jié)點應(yīng)該部署多少個服務(wù)的實例,可以自動地確保所有的服務(wù)正確地部署和容錯。
所有的服務(wù)網(wǎng)格功能都是通過IgniteServices接口實現(xiàn)的。
38、Ignite分布式消息可以在集群內(nèi)的所有節(jié)點間進行基于主題的通信,帶有特定消息主題的消息可以分布到訂閱了該主題的所有節(jié)點或者節(jié)點的子集。
Ignite消息基于發(fā)布-訂閱范式,發(fā)布者和訂閱者通過一個通用的主題連接在一起。當一個節(jié)點針對主題T發(fā)布了一個消息A,他會被分布到所有訂閱了主題T的節(jié)點。
39、gnite分布式事件功能使得在分布式集群環(huán)境下發(fā)生各種各樣事件時應(yīng)用可以接收到通知??梢宰詣荧@得比如任務(wù)執(zhí)行、發(fā)生在本地或者遠程節(jié)點上的讀寫或者查詢操作的通知。
分布式事件功能是通過IgniteEvents接口提供的,可以通過如下方式從Ignite中獲得IgniteEvents的實例
40、Ignite會自動地對集群內(nèi)發(fā)生的,作為緩存事件的結(jié)果生成的事件通知進行分組或者分批處理。
緩存內(nèi)的每個事件都會導致一個事件通知被生成以及發(fā)送,對于緩存活動頻繁的系統(tǒng),獲取每個事件的通知都將是網(wǎng)絡(luò)密集的,可能導致集群內(nèi)緩存操作的性能下降。
Ignite中,事件通知可以被分組然后分批地或者定時地發(fā)送
41、Ignite提供了一個HTTP REST客戶端,可以以REST的方式通過HTTP或者HTTPS協(xié)議與集群進行通信。REST API可以用于執(zhí)行不同的操作,比如從/對緩存的讀/寫,執(zhí)行任務(wù),獲取各種指標等等。
42、Ignite有一個獨特的功能,叫做Ignite文件系統(tǒng)(IGFS),就是一個分布式的內(nèi)存文件系統(tǒng),IGFS提供了和Hadoop HDFS類似的功能,但是只在內(nèi)存中。事實上,除了他自己的API,IGFS還實現(xiàn)了Hadoop的文件系統(tǒng)API,可以透明地加入Hadoop或者Spark的運行環(huán)境。
43、Ignite Hadoop加速器提供了一個叫做IgniteHadoopFileSystem的Hadoop兼容IGFS實現(xiàn),Hadoop可以以即插即用的形式運行在這個文件系統(tǒng)上,然后顯著地減少了I/O和改善了延遲和吞吐量。
優(yōu)化:
1、Ignite有豐富的事件系統(tǒng)來向用戶通知各種各樣的事件,包括緩存的修改,退出,壓縮,拓撲的變化以及很多其他的。因為每秒鐘可能產(chǎn)生上千的事件,他會對系統(tǒng)產(chǎn)生額外的負載,這會導致顯著地性能下降。因此,強烈建議只有應(yīng)用邏輯必要時才啟用這些事件。默認的話,事件通知是禁用的。
2、就大小和容量而言,Ignite的內(nèi)部緩存映射行為非常像正常的Java HashMap。他有一些初始的容量(默認都非常小),是持有數(shù)據(jù)的兩倍,內(nèi)部緩存映射的大小調(diào)整過程是CPU密集以及費時的,如果往緩存中加載大量的數(shù)據(jù)集(這是正常的使用場景),這個映射就會頻繁地調(diào)整大小。要避免這個問題,可以比對預(yù)期的數(shù)據(jù)集大小指定初始的緩存映射容量,這會在加載期間節(jié)約大量的CPU資源,因為映射不需要重新調(diào)整大小了。比如如果希望在緩存中加載一億的數(shù)據(jù),可以用如下的配置:
3、如果使用了分區(qū)緩存,而且數(shù)據(jù)丟失并不是關(guān)鍵(比如,當有一個備份緩存存儲時),可以考慮禁用分區(qū)緩存的備份。當備份啟用時,緩存引擎會為每個條目維護一個遠程拷貝,這需要網(wǎng)絡(luò)交換和而且是耗時的。要禁用備份,可以使用如下的配置:
4、如果打算為了緩存數(shù)據(jù)為JVM分配大量的內(nèi)存(通常大于10G的內(nèi)存),那么應(yīng)用很可能會遭遇長時間的GC暫停,他會顯著地增加延時。要避免GC暫停可以使用堆外內(nèi)存來緩存數(shù)據(jù)-實際上數(shù)據(jù)仍然換存在內(nèi)存中,但是JVM并不知道他而且GC也不起作用。要啟用不限大小的堆外存儲,可以使用如下的配置:
5、如果需要往緩存中加載大量的數(shù)據(jù),可以使用IgniteDataStreamer來實現(xiàn),數(shù)據(jù)流處理器在將數(shù)據(jù)發(fā)送到遠程節(jié)點之前會將數(shù)據(jù)正確地形成批次然后會正確地控制發(fā)生在每個節(jié)點的并發(fā)操作的數(shù)量來避免顛簸。通常他會比一堆單線程的操作有十倍的性能提升
6、如果能發(fā)送10個比較大的作業(yè)代替100個小些的作業(yè),那么應(yīng)該選擇發(fā)送大些的作業(yè),這會降低網(wǎng)絡(luò)上傳輸作業(yè)的數(shù)量以及顯著地提升性能。對于緩存的條目也是同樣的問題-應(yīng)該一直使用API方法,他會使用鍵和值的集合,而不是一個一個地傳遞。
總結(jié)
以上是生活随笔為你收集整理的ignite学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于zxing生成与解析二维码、条形码
- 下一篇: 本地yum仓库和http方式的yum仓库