(三)apache ignite-架構(gòu)概述

為了更好地理解Apache Ignite和用例的功能,理解它的體系結(jié)構(gòu)和拓?fù)浣Y(jié)構(gòu)非常重要工扎。通過(guò)更好地理解Ignite的體系結(jié)構(gòu)捉兴,可以決定拓?fù)浠蚓彺婺J匠羰ぃ越鉀Q企業(yè)體系結(jié)構(gòu)場(chǎng)景中的不同問(wèn)題,并從內(nèi)存計(jì)算中獲得最大的益處魂迄。與主從設(shè)計(jì)不同粗截,Ignite使用了一個(gè)完全對(duì)等的架構(gòu)。ignite集群中的每個(gè)節(jié)點(diǎn)都可以接受讀寫(xiě)捣炬,無(wú)論數(shù)據(jù)在哪里寫(xiě)入熊昌。本章主要內(nèi)容:

  • 功能概述
  • 不同的集群拓?fù)?/li>
  • 集群拓?fù)浣Y(jié)構(gòu)
  • 緩存策略
  • 集群劃分
  • 數(shù)據(jù)模型
  • 多數(shù)據(jù)中心復(fù)制
  • 異步支持
  • SQL查詢(xún)?nèi)绾卧贗gnite中工作
  • 彈性

功能概述

Ignite體系結(jié)構(gòu)具有足夠的靈活性和高級(jí)特性,可用于大量不同的體系結(jié)構(gòu)模式和風(fēng)格湿酸。您可以將Ignite看作是一組獨(dú)立的婿屹、集成良好的內(nèi)存中組件的集合,以提高應(yīng)用程序的性能和可伸縮性推溃。下面的示意圖表示Apache Ignite的基本功能:


image.png

Ignite是以模塊化的方式進(jìn)行組織昂利,并為每個(gè)功能提供一個(gè)jar(庫(kù))。您只需將所需的庫(kù)應(yīng)用到項(xiàng)目中铁坎,就可以使用Ignite蜂奸。

集群拓?fù)?/h1>

Ignite的設(shè)計(jì)表明整個(gè)系統(tǒng)本身就具有固有的可用性和可擴(kuò)展性。ignite節(jié)點(diǎn)間通信允許所有節(jié)點(diǎn)接收更新厢呵,無(wú)需一個(gè)快速的主協(xié)調(diào)器窝撵。節(jié)點(diǎn)可以不受干擾地添加或刪除,以增加可用RAM的數(shù)量襟铭。
Ignite數(shù)據(jù)結(jié)構(gòu)具有完全的彈性碌奉,允許對(duì)單個(gè)服務(wù)器或多個(gè)服務(wù)器進(jìn)行無(wú)干擾的自動(dòng)檢測(cè)和恢復(fù)。

客戶(hù)端和服務(wù)端

Apache Ignite具有一個(gè)可選的服務(wù)概念寒砖,并提供了兩種類(lèi)型的節(jié)點(diǎn):客戶(hù)端和服務(wù)器節(jié)點(diǎn)赐劣。

  • Server 包含數(shù)據(jù)、緩存哩都、計(jì)算和流魁兼,并且可以是內(nèi)存中的Map-Reduce任務(wù)的一部分。
  • Client 提供遠(yuǎn)程連接服務(wù)器以將元素放入/獲取到緩存的能力漠嵌。它還可以存儲(chǔ)部分?jǐn)?shù)據(jù)(近緩存)咐汞,這是一個(gè)較小的本地緩存,存儲(chǔ)最近和最頻繁訪(fǎng)問(wèn)的數(shù)據(jù)儒鹿。


    image.png

    還可以將服務(wù)器節(jié)點(diǎn)分組到一個(gè)集群中執(zhí)行工作化撕。在集群中,可以限制作業(yè)執(zhí)行约炎、服務(wù)部署植阴、流和其他任務(wù)只在集群組中運(yùn)行蟹瘾。
    你可以基于任何謂詞創(chuàng)建一個(gè)集群組。例如掠手,您可以從一組節(jié)點(diǎn)創(chuàng)建一個(gè)集群組憾朴,其中所有節(jié)點(diǎn)負(fù)責(zé)為testCache緩存數(shù)據(jù)。默認(rèn)情況下喷鸽,所有節(jié)點(diǎn)都作為服務(wù)節(jié)點(diǎn)啟動(dòng)众雷。客戶(hù)端模式需要顯式啟用魁衙。注意报腔,您不能物理地將數(shù)據(jù)節(jié)點(diǎn)與計(jì)算節(jié)點(diǎn)分離。在Apache Ignite中剖淀,包含數(shù)據(jù)的服務(wù)器也用于執(zhí)行計(jì)算纯蛾。Apache Ignite客戶(hù)機(jī)節(jié)點(diǎn)也參與作業(yè)執(zhí)行。乍一看纵隔,這個(gè)概念似乎很復(fù)雜翻诉,但讓我們?cè)囍吻暹@個(gè)概念。服務(wù)器節(jié)點(diǎn)總是存儲(chǔ)數(shù)據(jù)捌刮,默認(rèn)情況下可以參與任何計(jì)算任務(wù)碰煌。另一方面,客戶(hù)端節(jié)點(diǎn)可以操作服務(wù)器緩存绅作、存儲(chǔ)本地?cái)?shù)據(jù)并參與計(jì)算任務(wù)芦圾。通常,客戶(hù)端節(jié)點(diǎn)用于從緩存中放置或檢索數(shù)據(jù)俄认。這種混合客戶(hù)端節(jié)點(diǎn)在開(kāi)發(fā)具有多個(gè)節(jié)點(diǎn)的大型Ignite網(wǎng)格時(shí)提供了靈活性个少。客戶(hù)端和服務(wù)器節(jié)點(diǎn)都位于一個(gè)網(wǎng)格中眯杏,在某些情況下(例如夜焦,數(shù)據(jù)節(jié)點(diǎn)中的大容量acid事務(wù)),您不希望在數(shù)據(jù)節(jié)點(diǎn)上執(zhí)行任何計(jì)算岂贩。在這種情況下茫经,您可以通過(guò)創(chuàng)建相應(yīng)的集群組來(lái)選擇只在客戶(hù)端節(jié)點(diǎn)上執(zhí)行作業(yè)。通過(guò)這種方式萎津,您可以在一個(gè)網(wǎng)格中將數(shù)據(jù)節(jié)點(diǎn)與計(jì)算節(jié)點(diǎn)分開(kāi)卸伞。可以使用以下偽代碼對(duì)客戶(hù)端進(jìn)行計(jì)算:

ClusterGroup clientGroup = ignite.cluster().forClients(); IgniteCompute clientCompute = ignite.compute(clientGroup);
// Execute computation on the client nodes. clientCompute.broadcast(() -> System.out.println("sum of: " + (2+2)));
image.png

這種方法有一個(gè)缺點(diǎn)锉屈。使用這種方法荤傲,數(shù)據(jù)將被分配給獨(dú)立的節(jié)點(diǎn),并且為了計(jì)算這些數(shù)據(jù)部念,所有的客戶(hù)端節(jié)點(diǎn)都需要從服務(wù)器節(jié)點(diǎn)檢索數(shù)據(jù)弃酌。它可以產(chǎn)生大量的網(wǎng)絡(luò)連接并產(chǎn)生延遲。但是儡炼,您可以在一個(gè)主機(jī)上單獨(dú)的JVM上運(yùn)行客戶(hù)機(jī)和服務(wù)器節(jié)點(diǎn)妓湘,以減少網(wǎng)絡(luò)延遲。從部署的角度來(lái)看乌询,Apache Ignite服務(wù)器可以分為以下幾個(gè)組:

  • 內(nèi)置應(yīng)用程序
  • 服務(wù)器在單獨(dú)的JVM

內(nèi)置應(yīng)用程序

使用這種方法榜贴,Apache Ignite節(jié)點(diǎn)與應(yīng)用程序在同一個(gè)JVM上運(yùn)行。它可以是運(yùn)行在應(yīng)用服務(wù)器上的任何web應(yīng)用程序妹田,也可以是獨(dú)立的Java應(yīng)用程序唬党。例如,我們的獨(dú)立HelloIgnite應(yīng)用程序是來(lái)自第一章—是一個(gè)嵌入式的Ignite鬼佣。Ignite服務(wù)器與應(yīng)用程序一起在相同的JVM中運(yùn)行驶拱,并與網(wǎng)格的其他節(jié)點(diǎn)連接。如果應(yīng)用程序宕機(jī)或被關(guān)閉晶衷,則Ignite server也將關(guān)閉蓝纲。拓?fù)淙缦聢D所示:


image.png

服務(wù)器在單獨(dú)的JVM

在這種方法中,服務(wù)器節(jié)點(diǎn)將在獨(dú)立的JVM中運(yùn)行晌纫,客戶(hù)機(jī)節(jié)點(diǎn)將遠(yuǎn)程連接到服務(wù)器税迷。服務(wù)器節(jié)點(diǎn)參與緩存、計(jì)算執(zhí)行锹漱、流等等箭养。客戶(hù)端還可以使用REST API連接到任何單獨(dú)的節(jié)點(diǎn)哥牍。默認(rèn)情況下毕泌,所有的Ignite節(jié)點(diǎn)都作為服務(wù)器節(jié)點(diǎn)啟動(dòng);客戶(hù)端節(jié)點(diǎn)需要顯式啟用。


image.png

這是最常見(jiàn)的方法砂心,因?yàn)樗诩簷C(jī)制方面提供了更大的靈活性懈词。Ignite服務(wù)器可以被離線(xiàn)并重新啟動(dòng),不會(huì)對(duì)整個(gè)應(yīng)用程序或集群產(chǎn)生任何影響辩诞。

客戶(hù)機(jī)和服務(wù)器分別位于單個(gè)主機(jī)上的JVM中

當(dāng)您的數(shù)據(jù)節(jié)點(diǎn)上有大量事務(wù)并計(jì)劃在該節(jié)點(diǎn)上執(zhí)行一些計(jì)算時(shí)坎弯,您可以考慮這種方法。您可以在一個(gè)容器(例如Docker或OpenVZ)中單獨(dú)的JVM中執(zhí)行客戶(hù)機(jī)和服務(wù)器译暂。容器可以位于單個(gè)主機(jī)中抠忘。容器將隔離資源(cpu、ram外永、網(wǎng)絡(luò)接口等)崎脉,JVM只使用分配給這個(gè)容器的獨(dú)立資源。


image.png

這種方法也有它自己的缺點(diǎn)伯顶。在執(zhí)行過(guò)程中囚灼,客戶(hù)端(compute)節(jié)點(diǎn)可以從駐留在其他主機(jī)上的任何其他數(shù)據(jù)節(jié)點(diǎn)檢索數(shù)據(jù)骆膝,并且可以增加網(wǎng)絡(luò)延遲。

緩存拓?fù)?/h1>

Ignite提供了三種不同的緩存拓?fù)涞姆椒?:分區(qū),復(fù)制和本地灶体。緩存模式分別為每個(gè)緩存配置阅签。每個(gè)緩存拓?fù)涠加衅鋬?yōu)缺點(diǎn)。默認(rèn)緩存拓?fù)涫欠謪^(qū)的蝎抽,沒(méi)有任何備份選項(xiàng)政钟。

分區(qū)緩存拓?fù)?/h2>

這種拓?fù)涞哪繕?biāo)是獲得極好的可擴(kuò)展性。在這種模式下樟结,Ignite集群透明地對(duì)緩存的數(shù)據(jù)進(jìn)行分區(qū)养交,以便在整個(gè)集群中均勻地分配負(fù)載。通過(guò)均勻地劃分?jǐn)?shù)據(jù)瓢宦,緩存的大小和處理能力隨集群的大小呈線(xiàn)性增長(zhǎng)碎连。管理數(shù)據(jù)的職責(zé)在整個(gè)集群中自動(dòng)共享。集群中的每個(gè)節(jié)點(diǎn)或服務(wù)器都包含其主數(shù)據(jù)驮履,如果定義了備份副本破花,則包含備份副本。


image.png

對(duì)于分區(qū)緩存拓?fù)淦N彺嫔系腄ML操作非匙浚快,因?yàn)槊總€(gè)鍵只需要更新一個(gè)主節(jié)點(diǎn)(可選為一個(gè)或多個(gè)備份節(jié)點(diǎn))摘悴。對(duì)于高可用性峭梳,應(yīng)該配置緩存條目的備份副本。備份副本是一個(gè)或多個(gè)主副本的冗余副本蹂喻,該副本將駐留在另一個(gè)節(jié)點(diǎn)中葱椭。有一個(gè)簡(jiǎn)單的公式可以計(jì)算,為了實(shí)現(xiàn)集群的高可用性口四,需要多少備份孵运。

備份拷貝數(shù)= N-1,其中N為集群中節(jié)點(diǎn)的總數(shù)

假設(shè)集群中總共有3個(gè)節(jié)點(diǎn)蔓彩。如果您總是希望從集群獲得響應(yīng)(當(dāng)某些節(jié)點(diǎn)不可用時(shí))治笨,備份副本的數(shù)量應(yīng)該不少于2。在這種情況下赤嚼,存在3個(gè)緩存條目副本旷赖,2個(gè)備份副本和1個(gè)主副本。當(dāng)處理大型數(shù)據(jù)集時(shí)或更新非常頻繁更卒,分區(qū)是適合的方式等孵。備份過(guò)程可以是同步的,也可以是異步的蹂空。在同步模式下俯萌,客戶(hù)端應(yīng)該在完成提交或?qū)懭胫暗却h(yuǎn)程節(jié)點(diǎn)的響應(yīng)果录。

緩存復(fù)制拓?fù)?/h2>

這種方法的目標(biāo)是獲得極高的性能。使用這種方法咐熙,緩存數(shù)據(jù)被復(fù)制到集群的所有成員雕憔。由于數(shù)據(jù)被復(fù)制到每個(gè)集群節(jié)點(diǎn),因此可以使用它而無(wú)需等待糖声。這為讀取提供了可能的最高速度。每個(gè)成員都從自己的內(nèi)存訪(fǎng)問(wèn)數(shù)據(jù)分瘦。缺點(diǎn)是頻繁的寫(xiě)操作非常昂貴蘸泻。更新復(fù)制緩存需要將新版本推給所有其他集群成員。如果更新頻率很高嘲玫,這將限制可伸縮性悦施。


image.png

在上圖中,相同的數(shù)據(jù)存儲(chǔ)在所有集群節(jié)點(diǎn)中;復(fù)制緩存的大小受每個(gè)節(jié)點(diǎn)上可用內(nèi)存大小的限制去团。這種模式適用于緩存讀取比緩存寫(xiě)入頻繁得多抡诞,而且數(shù)據(jù)集很小的場(chǎng)景。復(fù)制的可伸縮性與成員數(shù)量土陪、每個(gè)成員更新的頻率和更新的大小成反比昼汗。

本地模式

這是緩存模式的一個(gè)非常原始的版本;使用這種方法,沒(méi)有數(shù)據(jù)分布到集群中的其他節(jié)點(diǎn)鬼雀。就本地緩存而言顷窒,沒(méi)有任何復(fù)制或分區(qū)過(guò)程,數(shù)據(jù)獲取非常便捷和快速源哩。它為最近和經(jīng)常使用的數(shù)據(jù)提供零延遲訪(fǎng)問(wèn)鞋吉。本地緩存主要用于只讀操作。它對(duì)于讀/寫(xiě)傳遞行為也非常有效励烦,在這種行為中谓着,數(shù)據(jù)是在緩存丟失時(shí)從數(shù)據(jù)源中加載的。與分布式緩存不同坛掠,本地緩存仍然具有分布式緩存的所有特性;它提供查詢(xún)緩存赊锚、自動(dòng)數(shù)據(jù)刪除等功能。


image.png

緩存策略

隨著高交易量的web應(yīng)用程序和移動(dòng)應(yīng)用程序的激增屉栓,數(shù)據(jù)存儲(chǔ)已成為性能的主要瓶頸改抡。在大多數(shù)情況下,持久性存儲(chǔ)(如關(guān)系數(shù)據(jù)庫(kù))不能通過(guò)添加更多的服務(wù)器來(lái)完美地?cái)U(kuò)展系瓢。在這種情況下阿纤,內(nèi)存中的分布式緩存為解決數(shù)據(jù)存儲(chǔ)瓶頸提供了一個(gè)很好的解決方案。
它擴(kuò)展了多個(gè)服務(wù)器(稱(chēng)為網(wǎng)格)夷陋,將它們的內(nèi)存集中在一起欠拾,并在所有服務(wù)器上保持緩存的同步胰锌。在分布式內(nèi)存緩存中有兩種主要策略:

Cache-aside

在這種方法中,應(yīng)用程序負(fù)責(zé)從持久性存儲(chǔ)區(qū)進(jìn)行讀寫(xiě)藐窄。緩存根本不與數(shù)據(jù)庫(kù)交互资昧。這叫做cache-aside。緩存的行為就像一個(gè)快速擴(kuò)展的內(nèi)存數(shù)據(jù)存儲(chǔ)荆忍。應(yīng)用程序在查詢(xún)數(shù)據(jù)存儲(chǔ)之前檢查緩存中的數(shù)據(jù)格带。此外,應(yīng)用程序在對(duì)持久性存儲(chǔ)進(jìn)行任何更改后更新緩存刹枉。


image.png

然而叽唱,盡管cache-aside的速度非常快微宝,但是這種策略也有一些缺點(diǎn)棺亭。如果多個(gè)應(yīng)用程序處理相同的數(shù)據(jù)存儲(chǔ),應(yīng)用程序代碼可能變得復(fù)雜蟋软,并可能導(dǎo)致代碼重復(fù)镶摘。當(dāng)緩存數(shù)據(jù)丟失時(shí),應(yīng)用程序?qū)⒉樵?xún)數(shù)據(jù)存儲(chǔ)岳守、更新緩存并繼續(xù)處理凄敢。如果不同的應(yīng)用程序線(xiàn)程同時(shí)執(zhí)行此處理,則可能導(dǎo)致多個(gè)數(shù)據(jù)存儲(chǔ)訪(fǎng)問(wèn)湿痢。

Read-through and Write-through

這就是應(yīng)用程序?qū)?nèi)存緩存作為主要的數(shù)據(jù)存儲(chǔ),并讀取數(shù)據(jù)并將數(shù)據(jù)寫(xiě)入贡未。內(nèi)存內(nèi)緩存負(fù)責(zé)在緩存丟失時(shí)將查詢(xún)傳播到數(shù)據(jù)存儲(chǔ)。此外蒙袍,數(shù)據(jù)在緩存中更新時(shí)將自動(dòng)更新俊卤。所有通讀和寫(xiě)操作都將參與整個(gè)緩存事務(wù),并作為一個(gè)整體提交或回滾害幅。


image.png

Read-through and Write-through比cache-aside有許多優(yōu)勢(shì)消恍。首先,它簡(jiǎn)化了應(yīng)用程序代碼以现。讀入允許緩存在自動(dòng)過(guò)期時(shí)從數(shù)據(jù)庫(kù)重新加載對(duì)象狠怨。這意味著您的應(yīng)用程序不必在高峰時(shí)間訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)蕉拢,因?yàn)樽钚碌臄?shù)據(jù)總是在緩存中段审。

Write behind

也可以使用write-behind來(lái)獲得更好的寫(xiě)性能菱阵。Write-behind允許應(yīng)用程序快速更新緩存并返回沉迹。然后,它聚合更新并將其作為批量操作異步刷新到持久性存儲(chǔ)中掷豺。同樣攒巍,對(duì)于Write-behind蹦哼,您可以指定節(jié)流限制,因此數(shù)據(jù)庫(kù)寫(xiě)入速度不如緩存更新快俩檬,因此對(duì)數(shù)據(jù)庫(kù)的壓力更小萎胰。此外,您可以安排數(shù)據(jù)庫(kù)寫(xiě)操作在非高峰時(shí)間發(fā)生棚辽,這可以最小化對(duì)數(shù)據(jù)庫(kù)的壓力技竟。


image.png

Apache Ignite通過(guò)實(shí)現(xiàn)Java JCache特性提供了上述所有緩存策略。此外屈藐,Ignite提供了Ignite Cassandra模塊榔组,它通過(guò)使用Cassandra作為過(guò)期緩存條目的持久存儲(chǔ)來(lái)實(shí)現(xiàn)Ignite緩存的持久性存儲(chǔ)。

數(shù)據(jù)模型

Apache Ignite實(shí)現(xiàn)了鍵值數(shù)據(jù)模型联逻,特別是JCache (JSR 107)規(guī)范搓扯。JCache為Java應(yīng)用程序與緩存交互提供了一種常見(jiàn)的方式。
從設(shè)計(jì)的角度來(lái)看遣妥,JCache提供了一個(gè)非常簡(jiǎn)單的鍵值存儲(chǔ)。鍵值存儲(chǔ)是一個(gè)簡(jiǎn)單的Hashtable或Map攀细,主要用于通過(guò)主鍵訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)表箫踩。您可以將鍵值作為傳統(tǒng)RDBMS中的一個(gè)簡(jiǎn)單表,其中包含兩個(gè)列谭贪,如鍵和值境钟。值列的數(shù)據(jù)類(lèi)型可以是任何原始數(shù)據(jù)類(lèi)型,如字符串俭识、整數(shù)或任何復(fù)雜的Java對(duì)象(或Blob - in Oracle術(shù)語(yǔ))慨削。應(yīng)用程序可以提供一個(gè)鍵和值并將它們持久化。如果鍵已經(jīng)存在套媚,將覆蓋該值缚态,否則將創(chuàng)建一個(gè)新值。為了清晰起見(jiàn)堤瘤,我們可以將鍵值存儲(chǔ)與Oracle術(shù)語(yǔ)進(jìn)行比較:


image.png

它有非常原始的操作玫芦,比如從存儲(chǔ)中放置、獲取或刪除值本辐。因?yàn)樗偸鞘褂弥麈I訪(fǎng)問(wèn)桥帆,所以它們通常有很好的性能和可擴(kuò)展性。Java緩存API定義了五個(gè)核心接口:CachingProvider慎皱、CacheManager老虫、Cache、Entry和Expire茫多。

  • CachingProvider定義了建立祈匙、配置、獲取天揖、管理和控制零個(gè)或多個(gè)cachemanager的機(jī)制
  • CacheManager定義了在CacheManager上下文中建立菊卷、配置缔恳、獲取、管理和控制唯一命名緩存的機(jī)制洁闰。
  • 緩存是類(lèi)似于數(shù)據(jù)結(jié)構(gòu)的哈希表歉甚,允許臨時(shí)存儲(chǔ)基于鍵的值。緩存屬于單個(gè)CacheManager扑眉。
  • 條目是存儲(chǔ)在緩存中的一個(gè)鍵-值對(duì)纸泄。
    鍵值對(duì)可以在圖中很容易地進(jìn)行說(shuō)明⊙兀考慮以下緩存中的條目圖:


    image.png

    通過(guò)鍵值存儲(chǔ)聘裁,Java緩存API還提供了以下附加特性:

  • 基本的緩存操作
  • 原子操作,類(lèi)似于java.util.ConcurrentMap
  • 通讀緩存
  • 直寫(xiě)式高速緩存
  • 條目處理器
  • 緩存事件監(jiān)聽(tīng)器
  • 統(tǒng)計(jì)數(shù)據(jù)
  • 完整的泛型API用于編譯時(shí)的安全性
  • 按引用存儲(chǔ)(僅適用于堆緩存)和按值存儲(chǔ)
    除了JCache之外弓千,Apache Ignite還提供了ACID事務(wù)衡便、SQL查詢(xún)功能、數(shù)據(jù)加載洋访、異步模式和各種內(nèi)存模型镣陕。Apache Ignite提供了IgniteCache接口,它擴(kuò)展了使用緩存的Java緩存接口姻政。

CAP定理

當(dāng)?shù)谝淮伍_(kāi)始使用Apache Ignite時(shí)呆抑,想知道Ignite一方面支持ACID事務(wù),另一方面汁展,Ignite也是一個(gè)高度可用的分布式系統(tǒng)鹊碍。在任何NoSQL數(shù)據(jù)存儲(chǔ)中,支持ACID事務(wù)并同時(shí)提供高可用性都是一個(gè)具有挑戰(zhàn)性的特性食绿。要橫向擴(kuò)展侈咕,需要強(qiáng)大的網(wǎng)絡(luò)分區(qū)容忍度,這需要放棄一致性或可用性器紧。NoSQL系統(tǒng)通常通過(guò)放松關(guān)系可用性或事務(wù)語(yǔ)義來(lái)實(shí)現(xiàn)這一點(diǎn)乎完。許多流行的NoSQL數(shù)據(jù)存儲(chǔ)(如Cassandra和Riak)仍然沒(méi)有事務(wù)支持,并被歸類(lèi)為AP系統(tǒng)品洛。AP一詞來(lái)源于著名的CAP定理10树姨,意為可用性和分區(qū)容忍性,在NoSQL系統(tǒng)中桥状,這比一致性更重要帽揪。


image.png

如上圖所見(jiàn),分布式系統(tǒng)只能具有以下三個(gè)屬性中的兩個(gè):

  • 分區(qū)容忍性:也就是說(shuō)辅斟,如果在兩個(gè)節(jié)點(diǎn)之間斷開(kāi)網(wǎng)絡(luò)转晰,系統(tǒng)仍然可以工作。
  • 一致性:在集群中的每個(gè)節(jié)點(diǎn)有相同的數(shù)據(jù)。
  • 可用性:如果可能的話(huà)總有一個(gè)節(jié)點(diǎn)可進(jìn)行響應(yīng)查詢(xún)查邢。
    因此蔗崎,讓我們看看三種選擇中有兩種會(huì)如何影響系統(tǒng)行為,如下所示:
  • CA系統(tǒng):在這種方法中扰藕,為了獲得一致性和可用性缓苛,犧牲了分區(qū)容忍性。數(shù)據(jù)庫(kù)系統(tǒng)提供了事務(wù)邓深,系統(tǒng)是高度可用的未桥。大多數(shù)關(guān)系數(shù)據(jù)庫(kù)被歸類(lèi)為CA系統(tǒng)。該系統(tǒng)存在嚴(yán)重的擴(kuò)展問(wèn)題芥备。
  • CP系統(tǒng):在CP系統(tǒng)中冬耿,為了一致性和容錯(cuò)而犧牲了可用性。在節(jié)點(diǎn)失敗的情況下萌壳,將丟失一些數(shù)據(jù)亦镶。
  • AP系統(tǒng):這個(gè)系統(tǒng)總是可用的和可分區(qū)的。此外袱瓮,通過(guò)向集群添加節(jié)點(diǎn)缤骨,該系統(tǒng)可以輕松地?cái)U(kuò)展。Cassandra是這類(lèi)系統(tǒng)的一個(gè)很好的例子懂讯。
    現(xiàn)在荷憋,我們回到我們的問(wèn)題台颠,Ignite在CAP定理中的哪個(gè)位置?乍一看褐望,Ignite可以被分到CP類(lèi),因?yàn)樗峭耆嫒軦CID的分布式事務(wù)串前,具有分區(qū)容錯(cuò)性瘫里。但這只是一部分。Apache Ignite也可以看作是AP系統(tǒng)荡碾。為什么Ignite有兩種不同的分類(lèi)?因?yàn)樗袃煞N不同的用于緩存操作谨读、事務(wù)和原子的事務(wù)模式。
    在事務(wù)模式中坛吁,您可以在一個(gè)事務(wù)中對(duì)多個(gè)DML操作進(jìn)行分組劳殖,并在緩存中提交。在此場(chǎng)景中拨脉,Ignitet將通過(guò)悲觀鎖鎖定一個(gè)訪(fǎng)問(wèn)的數(shù)據(jù)哆姻。如果您為緩存配置備份副本,則Ignite將使用2p提交協(xié)議來(lái)處理它的事務(wù)玫膀。


    image.png

    另一方面矛缨,在原子模式下,Ignite支持多個(gè)原子操作,一次一個(gè)箕昭。在原子模式下灵妨,每個(gè)DML操作要么成功要么失敗,讀和寫(xiě)操作都不會(huì)鎖定數(shù)據(jù)落竹。這種模式提供了比事務(wù)模式更高的性能泌霍。在Ignite cache中進(jìn)行寫(xiě)入時(shí),對(duì)于每一塊數(shù)據(jù)筋量,在主節(jié)點(diǎn)中將有一個(gè)主副本和一個(gè)備份副本(如果定義的話(huà))烹吵。當(dāng)您從Ignite grid讀取數(shù)據(jù)時(shí),總是從主節(jié)點(diǎn)讀取數(shù)據(jù)桨武,除非主節(jié)點(diǎn)關(guān)閉肋拔,這時(shí)數(shù)據(jù)將從備份中讀取。從這個(gè)角度看呀酸,您獲得了系統(tǒng)可用性和整個(gè)系統(tǒng)作為AP系統(tǒng)的分區(qū)容忍性凉蜂。在原子模式中,Ignite與Apache Cassandra非常相似性誉。然而窿吩,現(xiàn)實(shí)世界的系統(tǒng)很少完全屬于上述所有類(lèi)別,因此將CAP視為一個(gè)連續(xù)體會(huì)更有幫助错览。大多數(shù)系統(tǒng)將努力保持一致性纫雁、可用性和分區(qū)容錯(cuò)性,許多系統(tǒng)可以根據(jù)最重要的部分進(jìn)行調(diào)優(yōu)倾哺。

Clustering

Apache Ignite的設(shè)計(jì)目標(biāo)是在集群中跨多個(gè)節(jié)點(diǎn)處理高工作負(fù)載轧邪。集群被設(shè)計(jì)為一組節(jié)點(diǎn)⌒吆#客戶(hù)端可以向集群中的任何節(jié)點(diǎn)發(fā)送讀/寫(xiě)請(qǐng)求忌愚。Ignite節(jié)點(diǎn)可以自動(dòng)發(fā)現(xiàn)彼此,并且數(shù)據(jù)分布在集群中的所有節(jié)點(diǎn)上却邓。這有助于在需要時(shí)擴(kuò)展集群硕糊,而不需要一次重新啟動(dòng)整個(gè)集群。Ignite提供了一種簡(jiǎn)單的方法來(lái)在網(wǎng)格中創(chuàng)建集群節(jié)點(diǎn)的邏輯組腊徙,并將相關(guān)數(shù)據(jù)配置到類(lèi)似的節(jié)點(diǎn)中简十,以提高應(yīng)用程序的性能和可伸縮性。

Cluster group

Ignite ClusterGroup提供了在集群中創(chuàng)建一組邏輯節(jié)點(diǎn)的簡(jiǎn)單方法撬腾。按照設(shè)計(jì)螟蝙,Ignite集群中的所有節(jié)點(diǎn)都是相同的。然而时鸵,Ignite允許出于特定目的對(duì)任何應(yīng)用程序的節(jié)點(diǎn)進(jìn)行邏輯分組胶逢。例如厅瞎,您可以將所有節(jié)點(diǎn)集中在一起,使用名稱(chēng)myCache服務(wù)緩存初坠,或者所有訪(fǎng)問(wèn)緩存myCache的客戶(hù)端節(jié)點(diǎn)和簸。此外,你可能希望僅僅在遠(yuǎn)程節(jié)點(diǎn)上部署服務(wù)碟刺。你可以限制作業(yè)執(zhí)行锁保、服務(wù)部署、消息傳遞半沽、事件和其他任務(wù)只在一些集群組中運(yùn)行爽柒。


image.png

Ignite提供了以下三種方法來(lái)在Ignite Grid中創(chuàng)建邏輯集群:

  • Predefined cluster group(預(yù)定義集群組)。Ignite提供了接口的ClusterGroup的預(yù)定義實(shí)現(xiàn)者填,以基于任何謂詞創(chuàng)建集群組浩村。謂詞可以是遠(yuǎn)程節(jié)點(diǎn)、緩存節(jié)點(diǎn)占哟、具有指定屬性的節(jié)點(diǎn)等等心墅。以下代碼是一個(gè)示例集群組,其中包含緩存myCache的所有節(jié)點(diǎn)緩存數(shù)據(jù):
IgniteCluster cluster = ignite.cluster();
//名稱(chēng)為“myCache”緩存數(shù)據(jù)的所有數(shù)據(jù)節(jié)點(diǎn)榨乎。
ClusterGroup dataGroup = cluster.forDataNodes("myCache");
  • Cluster group with Node Attributes(具有節(jié)點(diǎn)屬性的群集組)怎燥。盡管集群中的每個(gè)節(jié)點(diǎn)都是相同的,但用戶(hù)可以配置節(jié)點(diǎn)為主節(jié)點(diǎn)或worker節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)蜜暑。啟動(dòng)時(shí)铐姚,所有集群節(jié)點(diǎn)自動(dòng)將所有環(huán)境和系統(tǒng)屬性注冊(cè)成為節(jié)點(diǎn)的屬性。但是肛捍,用戶(hù)可以通過(guò)配置來(lái)選擇分配自己的節(jié)點(diǎn)屬性:
IgniteConfiguration cfg = new IgniteConfiguration();
Map<String, String> attrs = Collections.singletonMap("ROLE", "master");
cfg.setUserAttributes(attrs);
Ignite ignite = Ignition.start(cfg);

在聲明節(jié)點(diǎn)之后隐绵,可以使用屬性master對(duì)節(jié)點(diǎn)進(jìn)行分組,如下所示:

IgniteCluster cluster = ignite.cluster();
ClusterGroup workerGroup = cluster.forAttribute("ROLE", "master");
Collection<GridNode> workerNodes = workerGroup.nodes();
  • Custom cluster group(自定義集群組)篇梭。有時(shí)它也稱(chēng)為動(dòng)態(tài)集群組氢橙≡褪啵可以根據(jù)某些謂詞定義動(dòng)態(tài)集群組恬偷。謂詞可以基于任何指標(biāo),如CPU利用率或空閑堆空間帘睦。這樣的集群組將始終只包含傳遞謂詞的節(jié)點(diǎn)袍患。下面是使用了小于256 MB堆內(nèi)存的節(jié)點(diǎn)上的集群組的示例。注意竣付,該組中的節(jié)點(diǎn)將根據(jù)使用的堆內(nèi)存隨時(shí)間而變化:
IgniteCluster cluster = ignite.cluster();
//使用的堆內(nèi)存小于256MB的節(jié)點(diǎn)
ClusterGroup readyNodes = cluster.forPredicate((node) -> node.metrics().getHeapMemoryUsed(\ ) < 256);

Data collocation數(shù)據(jù)配置

數(shù)據(jù)配置術(shù)語(yǔ)是指將相同的相關(guān)數(shù)據(jù)分配到相同的節(jié)點(diǎn)诡延。例如,如果我們有一個(gè)緩存為客戶(hù)屬性相關(guān)數(shù)據(jù)和另一個(gè)緩存為客戶(hù)的事務(wù)類(lèi)型的數(shù)據(jù)古胆。我們可以將他們相關(guān)聯(lián)的數(shù)據(jù)分配到相同的節(jié)點(diǎn)上肆良。在此方法中筛璧,相關(guān)數(shù)據(jù)的網(wǎng)絡(luò)往返次數(shù)減少,客戶(hù)端應(yīng)用程序可以從單個(gè)節(jié)點(diǎn)獲取數(shù)據(jù)惹恃。在這種情況下夭谤,具有相同字段集的多個(gè)緩存被分配給相同的節(jié)點(diǎn)。


image.png

例如巫糙,客戶(hù)信息及其帳戶(hù)信息位于同一個(gè)Ignite主機(jī)上朗儒。為了實(shí)現(xiàn)這一點(diǎn),用于緩存客戶(hù)端對(duì)象的緩存鍵應(yīng)該有一個(gè)帶有@AffinityKeyMapped注釋的字段或方法参淹,這樣為帳戶(hù)對(duì)象的key配置提供value醉锄。為了方便,您還可以選擇使用AffinityKey類(lèi)浙值,如下所示:

Object clientKey1 = new AffinityKey("Client1", "accId"); 
Object clientKey2 = new AffinityKey("Client2", "accId ");
Client c1 = new Client (clientKey1, ...); 
Client c2 = new Client (clientKey2, ...);
cache.put("accId ", new Account(“credit card”));  
cache.put(clientKey1, c1); 
cache.put(clientKey2, c2);

要計(jì)算關(guān)聯(lián)函數(shù)恳不,可以使用任何一組字段,不需要使用任何類(lèi)型的唯一鍵开呐。例如妆够,要計(jì)算客戶(hù)端帳戶(hù)關(guān)聯(lián)函數(shù),可以使用擁有account ID的 client ID负蚊。

Compute collocation with Data 數(shù)據(jù)計(jì)算配置

Apache Ignite還提供了將數(shù)據(jù)計(jì)算單元路由到所需數(shù)據(jù)緩存的節(jié)點(diǎn)的能力神妹。這個(gè)概念被稱(chēng)為計(jì)算和數(shù)據(jù)的配置。它允許將整個(gè)工作單元路由到某個(gè)節(jié)點(diǎn)家妆。要將計(jì)算與數(shù)據(jù)配置在一起鸵荠,應(yīng)該使用IgniteCompute.affinityrun(…)IgniteCompute.affinitycall(…)方法。

image.png

下面是如何在客戶(hù)信息及其帳戶(hù)信息分配的同一集群節(jié)點(diǎn)上配置計(jì)算伤极。

String accId = "acountId";
ignite.compute().affinityRun("myCache", accId, () -> { Account account = cache.get(accId);
Client c1 = cache.get(clientKey1);
Client c2 = cache.get(clientKey2);
... });

計(jì)算單元以本地方式訪(fǎng)問(wèn)客戶(hù)數(shù)據(jù)蛹找,這種方法大大降低了數(shù)據(jù)在集群中的網(wǎng)絡(luò)往返,提高了數(shù)據(jù)處理的性能哨坪。
Apache Ignite通過(guò)兩種關(guān)聯(lián)函數(shù)實(shí)現(xiàn):

  • RendezvousAffinityFunction-這個(gè)函數(shù)允許在部分到節(jié)點(diǎn)的映射中有一點(diǎn)差異(例如庸疾,某些節(jié)點(diǎn)可能負(fù)責(zé)比其他節(jié)點(diǎn)多一點(diǎn)的分區(qū))。但是当编,它保證當(dāng)拓?fù)浒l(fā)生變化時(shí)届慈,分區(qū)只能遷移到已連接的節(jié)點(diǎn)。集群中的現(xiàn)有節(jié)點(diǎn)之間不會(huì)發(fā)生數(shù)據(jù)交換忿偷。這是Apache Ignite使用的默認(rèn)關(guān)聯(lián)函數(shù)金顿。
  • FairAffinityFunction-這個(gè)函數(shù)試圖確保集群節(jié)點(diǎn)之間的分區(qū)分布是均勻的。這是以集群中現(xiàn)有節(jié)點(diǎn)之間可能的分區(qū)遷移為代價(jià)的鲤桥。

Zero SPOF 零單點(diǎn)故障

在任何分布式系統(tǒng)中揍拆,節(jié)點(diǎn)故障應(yīng)該能夠被預(yù)判的,特別是當(dāng)集群的規(guī)模增大時(shí)茶凳。零單點(diǎn)故障(SPOF)設(shè)計(jì)模式確保系統(tǒng)的單個(gè)節(jié)點(diǎn)或部分的失效不能阻礙整個(gè)集群或系統(tǒng)工作嫂拴。使用主-從復(fù)制或混合主-主系統(tǒng)的系統(tǒng)設(shè)計(jì)屬于這一類(lèi)播揪。在Hadoop 2.0.0之前,Hadoop NameNode是HDFS集群中的一個(gè)SPOF筒狠。大多數(shù)企業(yè)不希望單點(diǎn)失敗剪芍,原因顯而易見(jiàn)。
Apache Ignite作為一個(gè)水平可伸縮的分布式系統(tǒng)窟蓝,其設(shè)計(jì)方式是使集群中的所有節(jié)點(diǎn)都相等罪裹,你可以從集群中的任何節(jié)點(diǎn)進(jìn)行讀寫(xiě)。在Ignite集群中沒(méi)有主-從通信运挫。


image.png

數(shù)據(jù)在集群中備份或復(fù)制状共,因此任何節(jié)點(diǎn)的失敗都不會(huì)導(dǎo)致整個(gè)集群或應(yīng)用程序崩潰。通過(guò)這種方式谁帕,Ignite提供了一種動(dòng)態(tài)的高可用性峡继。這種方法的另一個(gè)好處是可以輕松地添加新節(jié)點(diǎn)。當(dāng)新節(jié)點(diǎn)加入集群時(shí)匈挖,它們可以從現(xiàn)有節(jié)點(diǎn)上接管一部分?jǐn)?shù)據(jù)碾牌。因?yàn)樗泄?jié)點(diǎn)都是相同的,所以這種通信可以在運(yùn)行的集群中無(wú)縫地進(jìn)行儡循。

在Ignite集群中使用SQL

在Ignite中處理SQL查詢(xún)有兩種主要方法:

  • In-memory Map-Reduce:如果您正在對(duì)分區(qū)緩存執(zhí)行任何SQL查詢(xún)舶吗,Ignite將查詢(xún)分解為內(nèi)存中的映射查詢(xún)和一個(gè)單一的reduce查詢(xún)。map查詢(xún)的數(shù)量取決于分區(qū)的大小和集群中的分區(qū)數(shù)量择膝。然后誓琼,在參與緩存的所有數(shù)據(jù)節(jié)點(diǎn)上執(zhí)行所有的map查詢(xún),將結(jié)果提供給reduce節(jié)點(diǎn)肴捉,從而在這些中間結(jié)果上運(yùn)行reduce查詢(xún)腹侣。如果您不熟悉Map-Reduce模式,可以將它想象成一個(gè)Java Fork-join過(guò)程齿穗。
  • H2 SQL engine:如果您正在對(duì)復(fù)制的或本地緩存執(zhí)行SQL查詢(xún)傲隶,那么Ignite就知道所有數(shù)據(jù)在本地可用,并在H2數(shù)據(jù)庫(kù)引擎中運(yùn)行一個(gè)簡(jiǎn)單的本地SQL查詢(xún)窃页。需要注意的是跺株,在復(fù)制緩存中,每個(gè)節(jié)點(diǎn)都包含其他節(jié)點(diǎn)的副本數(shù)據(jù)腮出。H2數(shù)據(jù)庫(kù)是一個(gè)用Java編寫(xiě)的免費(fèi)數(shù)據(jù)庫(kù)帖鸦,可以在嵌入式模式下工作芝薇。根據(jù)配置的不同胚嘲,每個(gè)Ignite節(jié)點(diǎn)都可以使用嵌入式H2 SQL引擎。

多數(shù)據(jù)中心復(fù)制

當(dāng)前洛二,多數(shù)據(jù)中心復(fù)制是任何數(shù)據(jù)庫(kù)的主要需求之一馋劈,包括RDBMS和NoSQL攻锰。簡(jiǎn)單地說(shuō),多數(shù)據(jù)中心復(fù)制意味著在不同的數(shù)據(jù)中心之間復(fù)制數(shù)據(jù)妓雾。多個(gè)數(shù)據(jù)中心復(fù)制可以有幾個(gè)場(chǎng)景:

  • 地理位置的場(chǎng)景:在這個(gè)場(chǎng)景中娶吞,數(shù)據(jù)應(yīng)該托管在不同的數(shù)據(jù)中心中,這取決于用戶(hù)的位置械姻,以便提供響應(yīng)性的交換妒蛇。在這種情況下,數(shù)據(jù)中心可以位于不同的地理位置楷拳,例如在不同的地區(qū)或在不同的國(guó)家绣夺。數(shù)據(jù)同步在數(shù)據(jù)中心中是完全透明的,是雙向的欢揖。在應(yīng)用程序邏輯代碼中可以定義用戶(hù)將連接到哪個(gè)數(shù)據(jù)中心陶耍。


    image.png
  • 實(shí)時(shí)備份的場(chǎng)景: 在這個(gè)場(chǎng)景中,大多數(shù)用戶(hù)使用不同的數(shù)據(jù)中心作為實(shí)時(shí)備份她混,可以快速地用作后備集群烈钞。這個(gè)用例與災(zāi)難恢復(fù)非常相似。有時(shí)也叫被動(dòng)復(fù)制坤按。在被動(dòng)復(fù)制中毯欣,復(fù)制發(fā)生在一個(gè)方向。從主復(fù)制到副本臭脓∫敲剑客戶(hù)端可以連接到一個(gè)數(shù)據(jù)中心的主數(shù)據(jù)庫(kù),并在數(shù)據(jù)庫(kù)上執(zhí)行所有CRUD操作谢鹊。


    image.png

    為了確保兩個(gè)數(shù)據(jù)庫(kù)之間的一致性算吩,副本作為只讀數(shù)據(jù)庫(kù)啟動(dòng),只有從主復(fù)制的事務(wù)才能修改數(shù)據(jù)庫(kù)內(nèi)容佃扼。
    Apache Ignite不支持多個(gè)數(shù)據(jù)中心復(fù)制偎巢。但是可以跨越不同數(shù)據(jù)中心的Ignite節(jié)點(diǎn)(例如,一個(gè)數(shù)據(jù)中心有10個(gè)節(jié)點(diǎn)兼耀,另一個(gè)數(shù)據(jù)中心有10個(gè)節(jié)點(diǎn))压昼。


    image.png

    跨越Ignite網(wǎng)格到多個(gè)數(shù)據(jù)中心可以引出一些問(wèn)題:
  • Latency延遲:這將在服務(wù)端影響性能。如果來(lái)自不同數(shù)據(jù)中心的任何節(jié)點(diǎn)都有主數(shù)據(jù)的備份副本瘤运,則事務(wù)時(shí)間可能非常高窍霞。從長(zhǎng)遠(yuǎn)來(lái)看,也可能會(huì)遇到數(shù)據(jù)一致性方面的問(wèn)題拯坟。
  • 連接到不同數(shù)據(jù)中心的客戶(hù)端將面臨不同的客戶(hù)端操作延遲但金。

異步支持

通常,任何普通的(同步的)put/get或執(zhí)行調(diào)用都會(huì)阻塞應(yīng)用程序的執(zhí)行郁季,直到從服務(wù)器獲得結(jié)果為止冷溃。之后钱磅,可以根據(jù)客戶(hù)的需要對(duì)結(jié)果進(jìn)行迭代和使用。這可能是處理任何持久性存儲(chǔ)的最常見(jiàn)方式似枕。但是盖淡,異步方法執(zhí)行可以提供顯著的好處,并且是現(xiàn)代系統(tǒng)的要求凿歼。Apache Ignite提供了在所有分布式api上使用異步和同步方法靈活調(diào)用的范例褪迟。它可以從存儲(chǔ)中put/get任何條目,也可以在計(jì)算網(wǎng)格中執(zhí)行作業(yè)答憔。Ignite異步方法執(zhí)行是一個(gè)非阻塞操作牵咙,并返回一個(gè)IgniteFuture對(duì)象而不是實(shí)際結(jié)果∨饰ǎ可以通過(guò)調(diào)用IgniteFuture.get()方法獲得結(jié)果洁桌。以下是一個(gè)使用異步調(diào)用從Ignite緩存中獲取條目的非常簡(jiǎn)單的例子:

// 獲得或者創(chuàng)建緩存
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("testCache"); 
// 得到一個(gè)異步的緩存
IgniteCache<Integer, String> asynCache = cache.withAsync();
// 放一些數(shù)據(jù)進(jìn)去
for(int i = 1; i <= 100; i++){ 
  cache.put(i, Integer.toString(i));
}
//異步獲取第一條記錄
asynCache.withAsync().get(1);
// 獲得 future promise
IgniteFuture<String> igniteFuture = asynCache.future();
// java 8 lamda expression
igniteFuture.listen(f-> System.out.println("Cache Value:" + f.get()));

在上面的代碼中,我們將100個(gè)條目同步插入到Ignite緩存testCache中侯嘀。然后另凌,異步請(qǐng)求第一個(gè)條目并獲得調(diào)用的future秸滴。接下來(lái)直砂,異步地偵聽(tīng)要完成的操作。注意唯袄,Java main()方法的主線(xiàn)程并不等待任務(wù)完成诗茎,而是將任務(wù)交給另一個(gè)線(xiàn)程工坊,然后繼續(xù)。

  • 彈性
    Ignite客戶(hù)端節(jié)點(diǎn)在本質(zhì)上是完全彈性的敢订。彈性這個(gè)詞指的是服務(wù)器或系統(tǒng)在出現(xiàn)故障時(shí)快速恢復(fù)并繼續(xù)運(yùn)行的能力王污。在某些情況下,Ignite客戶(hù)端節(jié)點(diǎn)可以從集群斷開(kāi)連接:
  • 主機(jī)宕機(jī)或重新啟動(dòng);
  • 緩慢的客戶(hù)端可以被服務(wù)器斷開(kāi)連接楚午。
    當(dāng)客戶(hù)端確定一個(gè)節(jié)點(diǎn)與集群斷開(kāi)連接時(shí)昭齐,它嘗試重新建立與服務(wù)器的連接。這一次矾柜,它將分配給一個(gè)新的節(jié)點(diǎn)ID阱驾,并嘗試重新連接到集群。

安全

Apache Ignite是一個(gè)開(kāi)源項(xiàng)目怪蔑,它不提供任何安全特性里覆。

結(jié)論

我們介紹了內(nèi)存數(shù)據(jù)網(wǎng)格的基本概念。我們首先簡(jiǎn)要地描述了Ignite函數(shù)概述和具有不同拓?fù)浣Y(jié)構(gòu)的各種緩存策略缆瓣。我們還介紹了一些基于標(biāo)準(zhǔn)數(shù)據(jù)訪(fǎng)問(wèn)模式的技術(shù)喧枷,如緩存、通讀和寫(xiě)入。我們介紹了Ignite數(shù)據(jù)配置技術(shù)割去,并簡(jiǎn)要介紹了Ignite鍵值數(shù)據(jù)存儲(chǔ)窟却。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昼丑,一起剝皮案震驚了整個(gè)濱河市呻逆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菩帝,老刑警劉巖咖城,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呼奢,居然都是意外死亡宜雀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)握础,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辐董,“玉大人,你說(shuō)我怎么就攤上這事禀综〖蚝妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵定枷,是天一觀的道長(zhǎng)孤澎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)欠窒,這世上最難降的妖魔是什么覆旭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮岖妄,結(jié)果婚禮上型将,老公的妹妹穿的比我還像新娘。我一直安慰自己荐虐,他們只是感情好茶敏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缚俏,像睡著了一般惊搏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忧换,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天恬惯,我揣著相機(jī)與錄音,去河邊找鬼亚茬。 笑死酪耳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碗暗,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼颈将,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了言疗?” 一聲冷哼從身側(cè)響起晴圾,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噪奄,沒(méi)想到半個(gè)月后死姚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤篮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年都毒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碰缔。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡账劲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出金抡,到底是詐尸還是另有隱情瀑焦,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布竟终,位于F島的核電站蝠猬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏统捶。R本人自食惡果不足惜榆芦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喘鸟。 院中可真熱鬧匆绣,春花似錦、人聲如沸什黑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)愕把。三九已至拣凹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恨豁,已是汗流浹背嚣镜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橘蜜,地道東北人菊匿。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跌捆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徽职,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容