# Apache Ignite核心特性介紹(2.1.0版) ## 1.摘要 ### 1.Ignite是什麽?  - 一個以內存為中心的數據平臺 - 強一致性 - 高可用 - 強大的SQL、鍵-值以及相關處理的API **Ignite是不是分布式數據庫?** **是**,在整個集群的多個節點中,Ignite中的數據要麽是分區模式的,要麽是復制模式的,這給系統帶來了伸縮性,增加了彈性。Ignite可以自動化地控制數據如何分區,然而,開發者也可以插入自定義的函數,以及為了提高效率將部分數據並置在一起。 **Ignite是不是關系型SQL數據庫?** **不完整**,盡管Ignite的目標是和其他的關系型SQL數據庫具有類似的行為,但是在處理約束和索引方面還是有不同的。Ignite支持一級和二級索引,但是只有一級索引支持唯一性,Ignite還不支持外鍵約束。 從根本上來說,Ignite作為約束不支持任何會導致集群廣播消息的更新以及顯著降低系統性能和可伸縮性的操作。 **Ignite是不是內存數據庫?** **是**,雖然Ignite的固化內存在內存和磁盤中都工作得很好,但是磁盤持久化是可以禁用的,使Ignite作為一個純粹的內存數據庫。 **Ignite是不是事務型數據庫?** **不完整**,ACID事務是支持的,但是僅僅在鍵-值API級別,Ignite還支持跨分區的事務,這意味著事務可以跨越不同服務器不同分區中的鍵。 在SQL層,Ignite支持原子性,還不是事務型一致性,社區計劃在2.2版本中實現SQL事務。 **Ignite是不是鍵-值存儲?** **是**,Ignite提供了鍵-值API,兼容於JCache (JSR-107),並且支持Java,C++和.NET。 **Ignite是不是內存數據網格(IMDG)?** **是**,Ignite是一個全功能的數據網格,它既可以用於純內存模式,也可以帶有Ignite的原生持久化,它也可以與任何第三方數據庫集成,包括RDBMS和NoSQL。 **固化內存是什麽?** Ignite的固化內存架構使得Ignite可以將內存計算延伸至磁盤,它基於一個頁面化的堆外內存分配器,它通過寫前日誌(WAL)的持久化來對數據進行固化,當持久化禁用之後,固化內存就會變成一個純粹的內存存儲。 **並置處理是什麽?** Ignite是一個分布式系統,因此,有能力將數據和數據以及數據和計算進行並置就變得非常重要,這會避免分布式數據噪聲。當執行分布式SQL關聯時數據的並置就變得非常的重要。Ignite還支持將用戶的邏輯(函數,lambda等)直接發到數據所在的節點然後在本地進行數據的運算。 ## 2.關鍵特性 ### 2.1.固化內存  Ignite作為以內存為中心的平臺,是基於固化內存架構的,當Ignite持久化存儲特性開啟時,它可以在內存和磁盤中存儲和處理數據和索引。 該內存架構在可以將集群中的所有可用資源持久化到磁盤的前提下,還可以獲得內存級的高性能。 Ignite固化內存的構建和操作方式,類似於比如linux這樣的操作系統的虛擬內存。但是兩者的顯著區別是,如果開啟持久化存儲的話,固化內存會一直將整個數據和索引保持在磁盤上,而虛擬內存使用磁盤只是用於交換用途。 當固化內存和Ignite持久化存儲同時開啟時,下面Ignite作為一個平臺的優勢和特點: **內存** - 堆外內存 - 避免明顯的GC暫停 - 自動碎片整理 - 可預測的內存消耗 - 高SQL性能 **磁盤** - 可選的持久化 - 支持閃存、SSD以及Intel的3D Xpoint - 存儲數據的超集 - 全事務化(前寫日誌WAL) - 集群瞬時啟動 ### 2.2.Ignite持久化  Ignite持久化存儲是一個分布式的、支持ACID、兼容SQL的磁盤存儲,它作為一個可選的磁盤層,可以將數據和索引存儲在SSD、閃存、3D XPoint以及其他的非易失性存儲器中,並且可以透明地與Ignite固化內存進行集成。 開啟持久化存儲後,就不再需要將所有的數據和索引保持在內存中,也不再需要在節點或者集群重啟後對數據進行預熱,因為Ignite的固化內存和持久化存儲是緊密耦合的,並且視其為二級存儲。這意味著如果數據或者索引的子集在內存中遺失,固化內存會從磁盤中獲取。 Ignite的持久化存儲相比於第三方存儲有很多的優勢(RDBMS、NoSQL、Hadoop),它可以作為Ignite集群的一個可替代的持久化層。 - 可以在數據中執行SQL查詢,不管數據在內存中還是在磁盤中,這意味著Ignite可以作為一個經過內存優化的分布式SQL數據庫; - 不再需要將所有的數據和索引保持在內存中,持久化存儲可以在磁盤上存儲數據的超集,然後只在內存中保存頻繁訪問的數據的子集; - 集群的瞬時重啟,如果整個集群停機,不再需要通過預加載數據而對內存進行預熱,只要所有集群節點都連接在一起了,整個集群就可以正常運轉了; - 數據和索引在內存和磁盤中是以相似的格式進行存儲的,這有助於避免昂貴的格式轉換,數據集只是在內存和磁盤之間進行移動; - 通過插入第三方解決方案,可以創建完整的增量集群快照。 ### 2.3.分布式SQL數據庫  在Ignite中,作為平臺的一部分,提供了分布式SQL數據庫的功能,這個數據庫可以水平擴展、容錯並且兼容ANSI-99標準,它支持所有的SQL以及DML命令,包括SELECT、update、INSERT、MERGE以及DELETE,它還提供了對和分布式數據庫相關的DDL命令的一個子集的支持。 有賴於固化內存架構,數據集和索引可以同時在內存和磁盤中存儲,這樣可以跨越不同的存儲層執行分布式SQL操作,來獲得可以固化到磁盤的內存級性能。 可以在Java、C++、.NET中通過原生的API使用SQL語言來與Ignite進行交互,也可以通過Ignite的JDBC或者ODBC驅動,這從語言層面來說,比如PHP、Ruby以及其他的,具有了真正的跨平臺連接性。 ### 2.4.內存數據網格  Ignite內存數據網格是一個*內存中的分布式鍵-值存儲*,它可以在分布式集群的內存中緩存數據,Ignite數據網格可以視為一個分布式分區化的哈希,其中每個節點都持有整個數據集的一部分,這樣的話,隨著不斷地增加新節點,就可以緩存更多的數據。 Ignite數據網格甚至可以線性地增長到幾百個節點,它通過強語義的數據位置和關系數據路由,來降低冗余數據噪聲。 Ignite數據網格速度足夠快,經過官方不斷的測試,目前,他是分布式集群中支持事務性或原子性數據的最快的實現之一。 ### 2.5.內存計算網格  分布式計算是通過並行處理的方式來獲得更高的性能,更低的延遲以及線性可擴展性,Ignite計算網格提供了一組簡單的API來允許用戶在集群內的多臺計算機中執行分布式計算和數據處理。 分布式並行計算是基於在集群內的節點中進行任何的計算然後將結果返回的能力。 ### 2.6.機器學習(測試)  Ignite從2.0版本開始,引入了一個叫做機器學習網格的分布式機器學習庫的第一版。 構建機器學習網格的理由很簡單,很多用戶將Ignite作為各種數據集的高性能存儲和處理核心系統,如果用戶想在這些數據集上執行機器學習或者深度學習(即訓練集或者模型推理),就需要首先進行ETL,將數據轉換到其他的系統中,比如Apache Mahout或者Apache Spark。 機器學習網格的路線圖是從基於分布式協同處理的核心代數實現開始的。初始版本在Ignite的2.0版本中發布。未來的版本會為python、R以及Scala引入自定義DSL,不斷優化機器學習算法集比如線性和邏輯回歸、決策樹/隨機孫林、SVM、樸素貝葉斯以及支持經過Ignite優化的神經網絡,還有就是集成TensorFlow。 當前測試版的Ignite機器學習網格,在高度優化和可擴展的Ignite平臺基礎上支持一個分布式的機器學習庫,實現了一個本地化以及分布式的矢量和矩陣運算,還有已經廣泛使用的算法的分布式版本。 ## 3.擴展特性 ### 3.1.服務網格  服務網格可以在集群中任意部署自定義的服務,可以實現和部署任意服務,比如自定義計數器,ID生成器,分級映射等。 服務網格的主要應用場景是提供了在集群中部署各種單例服務的能力。但是,如果需要一個服務的多實例,Ignite也能保證所有服務實例的正確部署和容錯。 ### 3.2.數據註入和流計算  Ignite流式計算允許以可擴展和容錯的方式處理連續不中斷的數據流。在一個中等規模的集群中,數據註入Ignite的比例會很高,很容易達到每秒百萬級的規模。 **工作方式:** 1. 客戶端將流式數據註入Ignite; 2. 數據在Ignite數據節點中自動分區; 3. 數據在`滑動窗口`中並發處理; 4. 客戶端在流式數據中執行並發`SQL查詢`; 5. 客戶端訂閱數據變化的`持續查詢`。 ### 3.3.RDBMS集成  Ignite支持與各種持久化存儲進行集成,它可以接入數據庫、導入模式、配置索引類型、以及自動化地生成所有必要的XML OR映射配置和Java領域模型POJO,他們可以很容易地導入自己的開發工程。 Ignite可以與任何支持JDBC驅動的關系型數據庫(RDBMS)進行集成,包括Oracle, PostgreSQL, Microsoft SQL Server, 和mysql。 **RDBMS集成向導** 通過Web控制臺,Ignite支持自動化的RDBMS集成,它是一個交互式的配置向導、管理和監控工具,功能包括: - 創建和下載各種集群的配置文件; - 從任何RDBMS模式中自動化地構建Ignite的SQL元數據; - 在內存緩存中執行SQL查詢; - 查看查詢的執行計劃、內存模式和流化圖表。 這個Web控制臺是一個創新的工具,它提供了豐富的功能來管理集群,並不限於上述提到的這些功能。 ### 3.4.分布式數據結構 Ignite以分布式的形式支持基於`java.util.concurrent`框架的大部分數據結構。比如,可以在一個節點上使用`java.util.concurrent.BlockingQeque`加入一些東西,然後再另一個節點上獲取它。或者有一個分布式的ID生成器,他可以保證所有節點上的ID唯一性。 **支持的數據結構包括:** - Concurrent Map (Cache) - 分布式隊列和集合 - AtomicLong - AtomicReference - AtomicSequence (ID生成器) - CountDownLatch - ExecutorService ### 3.5.消息和事件 Ignite提供了**集群範圍的高性能的消息**功能,支持基於發布-訂閱以及直接點對點通信模型的數據交換。消息可以以有序的,也可以以無序的方式進行交換。有序消息會稍微有點慢,但是如果使用的話,Ignite會保證收到消息的順序和發送消息的順序一致。 當在分布式網格環境中發生各種事件時,Ignite的**分布式事件**功能可以使應用收到通知。可以自動地收到集群內的本地和遠程節點上發生的任務執行、讀寫和查詢操作的通知,事件通知也可以分組在一起然後分批或者定期地發送。 ## 4.隨處運行 ### 4.1.Java Ignite主要是用Java進行開發的,並且也提供了其他語言的原生支持。它在設計上是為內存計算的各種使用場景提供高性能的解決方案 - 從高性能計算,到工業級的先進數據網格,CEP以及數據流化處理。 Ignite本質上是一個內存鍵-值存儲,它可以在分布式集群的內存中存儲數據,然後在這個基礎上支持ACID事務、SQL查詢、分布式SQL關聯、消息和事件、數據流化處理以及其他的功能。 通過在緩存中以通用的二進制格式寫入對象,Ignite還支持跨平臺的互操作性,這樣使得應用可以在Java、.NET和C++之間無縫地進行操作。 ### 4.2.Ignite.NET Ignite.NET從設計上來說是在.NET平臺上為內存計算的各種使用場景提供高性能的解決方案 - 從高性能計算,到工業級的先進數據網格,CEP以及數據流化處理。這些都是原生的,經過了.NET API的優化。 Ignite.NET是在Ignite之上構建的,這樣就可以執行幾乎所有的內存數據網格操作,包括ACID事務、SQL查詢、分布式SQL關聯、消息和事件、數據流化處理以及其他的。 通過在緩存中以通用的二進制格式寫入對象,Ignite還支持跨平臺的互操作性,這樣使得應用可以在Java、.NET和C++之間無縫地進行操作。另外,Ignite.NET和Ignite C++都提供了原生的API,而它們的實現通過使用JNI委托了大部分的Java調用,這裏,值得一提的是,JNI的消耗是最小的,不會造成性能的下降,特別是在分布式環境下,網絡是最主要的開銷,還有,Ignite提供了二進制編組器的純.NET實現來保證性能。 ### 4.3.Ignite C++ Ignite C++從設計上來說是在C++平臺上為內存計算的各種使用場景提供高性能的解決方案 - 從高性能計算,到工業級的先進數據網格,CEP以及數據流化處理。這些都是原生的,經過了C++ API的優化。 Ignite C++是在Ignite之上構建的,這樣就可以執行幾乎所有的內存數據網格操作,包括ACID事務、SQL查詢、分布式SQL關聯、消息和事件、數據流化處理以及其他的。 通過在緩存中以通用的二進制格式寫入對象,Ignite還支持跨平臺的互操作性,這樣使得應用可以在Java、.NET和C++之間無縫地進行操作。另外,Ignite.NET和Ignite C++都提供了原生的API,而它們的實現通過使用JNI委托了大部分的Java調用,這裏,值得一提的是,JNI的消耗是最小的,不會造成性能的下降,特別是在分布式環境下,網絡是最主要的開銷,還有,Ignite提供了二進制編組器的純C++實現來保證性能。 ### 4.4.客戶端協議 對於客戶端連接Ignite集群,Ignite提供了若幹種協議,包括Ignite原生客戶端,REST/HTTP,SSL/TLS,Memcached,Node.js(正在開發中)等等。 ### 4.5.部署選項  Apache Ignite可以獨立運行,在集群中運行,在Kubernetes或者Docker容器中運行,還可以運行在Apache Mesos以及Hadoop Yarn環境。他可以在物理機上運行,也可以在虛擬機上運行。 **公有雲** 對於公有雲環境,Ignite原生地繼承了`Amazon AWS`、`Google Compute Engine`,對於其他的雲環境,Ignite集成了`Apache JCloud`,他支持大多數的[雲供應商](https://jclouds.apache.org/reference/providers/)。 **容器** Ignite可以容易地運行於容器環境,Ignite集成了`Docker`,在服務器啟動之前可以自動地構建並且將用戶代碼部署進Ignite。 Ignite也可以部署進Kubernetes環境,它可以自動化地部署和管理容器化的應用。 **資源管理** Ignite原生地集成了`Hadoop Yarn`和`Apache Mesos`,可以將Ignite輕易地無縫部署進Hadoop和Spark環境。 ## 5.Hadoop & Spark ### 5.1.Spark共享RDD  Apache Ignite提供了一個Spark RDD抽象的實現,他允許跨越多個Spark作業時方便地在內存內共享狀態,不管是在同一個應用內部還是在不同的Spark應用之間。 `IgniteRDD`作為Ignite分布式緩存的視圖,既可以在Spark作業執行進程中部署,也可以在Spark workder中部署,也可以在他自己的集群中部署。 根據預配置的部署模型,狀態共享既可以只存在於一個Spark應用的生命周期的內部(`嵌入式模式`),或者也可以存在於Spark應用的外部(`獨立模式`),這種模式下狀態可以在多個Spark應用之間共享。 ### 5.2.內存文件系統  Ignite一個獨有的技術就是叫做Ignite文件系統(IGFS)的分布式內存文件系統,IGFS提供了和Hadoop HDFS類似的功能,但是僅僅在內存內部。事實上,除了他自己的API,IGFS實現了Hadoop的文件系統API,並且可以透明地加入Hadoop或者Spark應用。 IGFS將每個文件中的數據拆分為獨立的數據塊然後將他們存儲在分布式內存緩存中。然而和Hadoop HDFS不同,IGFS不需要一個name節點,並且用一個哈希函數自動地確定文件數據位置。 IGFS可以獨立部署,也可以部署在HDFS之上,不管是哪種情況,他對於HDFS中存儲的文件都是一個透明的緩存層。 IGFS可以與原生的Apache Hadoop發行版集成,也可以與Cloudera CDH、Hortonworks HDP集成。 **Tachyon替代** 在Spark環境中IGFS可以透明地替代Spark環境中的Tachyon文件系統,鑒於IGFS是基於久經考驗的Ignite數據網格技術,他會比Tachyon有更好的讀和寫性能,並且更穩定。 **Hadoop文件系統** 如果打算使用IGFS作為Hadoop文件系統,可以參考[Hadoop集成文檔](http://apacheignite-fs.readme.io/docs/file-system),這時IGFS和HDFS並沒有什麽不同。 ### 5.3.內存MapReduce  Apache Ignite帶來了一個Hadoop MapReduce API的內存實現,他比原生的Hadoop MapReduce實現有了顯著的性能提升。Ignite MapReduce比Hadoop性能更好,是因為基於推的資源分配以及進程內的計算和數據的並置。 另外,因為`IGFS`不需要一個name節點,當使用IGFS時,Ignite MapReduce作業會在一個鏈路內直達IGFS數據節點。
Tags: Ignite 支持 數據庫 內存 是不是 分區
文章來源: