Apache Ignite(一):簡介以及和Coherence、Gemfire、Redis等的比較
一、Ignite簡介
Apache Ignite 內存數組組織框架是一個高性能、集成和分布式的內存計算和事務平臺,用于大規模的數據集處理,比傳統的基于磁盤或閃存的技術具有更高的性能,同時他還為應用和不同的數據源之間提供高性能、分布式內存中數據組織管理的功能。
二、Ignite歷史
Ignite來源于尼基塔·伊萬諾夫于2007年創建的GridGain系統公司開發的GridGain軟件,尼基塔領導公司開發了領先的分布式內存片內數據處理技術-領先的Java內存片內計算平臺,今天在全世界每10秒它就會啟動運行一次。他有超過20年的軟件應用開發經驗,創建了HPC和中間件平臺,并在一些創業公司和知名企業都做出過貢獻,包括Adaptec, Visa和BEA Systems。尼基塔也是使用Java技術作為服務器端開發應用的先驅者,1996年他在為歐洲大型系統做集成工作時他就進行了相關實踐。
2014年3月,GridGain公司將該軟件90%以上的功能和代碼開源,僅在商業版中保留了高端企業級功能,如安全性,數據中心復制,先進的管理和監控等。2015年1月,GridGain通過Apache 2.0許可進入Apache的孵化器進行孵化,很快就于8月25日畢業并且成為Apache的頂級項目,9月28日即發布了1.4.0版,應該說發展、迭代速度非常之快。該技術相關資料較少,但確是一個很有潛力的技術,解決了大規模、大數據量、高并發企業級或者互聯網應用面臨的若干痛點。
三、Ignite和Hadoop以及Spark的關系
Ignite和Hadoop解決的是不同的問題,即使在一定程度上可能應用了類似的底層基礎技術。Ignite是一種多用途,和OLAP/ OLTP內存中數據結構相關的,而Hadoop僅僅是Ignite原生支持(和加速)的諸多數據來源之一。
Spark是一個和Ignite類似的項目。但是Spark聚焦于OLAP,而Ignite憑借強大的事務處理能力在混合型的OLTP/ OLAP場景中表現更好。特別是針對Hadoop,Ignite將為現有的Map/Reduce,Pig或Hive作業提供即插即用式的加速,避免了推倒重來的做法,而Spark需要先做數據ETL,更適合新寫的分析應用。
四、和類似技術的比較
在Ignite以前,大規模、大數據量、高并發企業級或者互聯網應用為了解決數據緩存、降低數據庫負載、提高查詢性能等突出問題,很多采用了Hazelcast或者Oracle Coherence或者GemFire(比如12306網站)或者目前應用越來越廣泛的Redis等緩存技術,本文對這些相關的技術做了簡單的比較,基本內容來源于其官方網站,進行了翻譯整理,方便更多的人了解他。
1.Ignite和Hazelcast
Apache Ignite和Hazelcast都提供了富數據網格的特性,解決了可擴展的分布式集群環境下在內存中對數據進行緩存和分區的問題。
Ignite和Hazelcast在緩存的方式上是有很多不同的,同時支持事務和數據的查詢,下面的表格列出了一些主要的不同點,這些都是我們在選擇內存數據網格產品時需要特別關注的。
序號 |
對比項目 |
Apache Ignite |
Hazelcast |
1 | 聚焦于開源 | Ignite是一個Apache的開源項目,還在不斷的增加新特性,對C++、.NET/C#和Node.js的支持也會很快到來。 | Hazelcast正在持續的減少開源版本的功能,更多的功能加入了企業版中,比如堆外內存,持續查詢,Web-Session集群,SSL加密支持等。 |
2 | JCache(JSR107) | Ignite完全兼容JCache (JSR 107)緩存規范 | Hazelcast完全兼容JCache (JSR 107)緩存規范 |
3 | 堆外存儲 | Ignite根據用戶配置支持將數據存儲在堆內或者堆外 |
Hazelcast僅在商業版中提供堆外存儲的功能 |
4 | 堆外索引 | 只要配置了堆外存儲,Ignite就會在堆外存儲索引(為了不影響使用堆內內存的用戶應用。) | 不支持 |
5 | 持續查詢 | Ignite支持持續查詢,比如允許客戶端和服務器端訂閱數據變化的持續通知 | Hazelcast僅在商業版中提供持續查詢的功能。 |
6 | SQL查詢 | Ignite支持完整的SQL(ANSI-99)語法以查詢內存中的數據 | Hazelcast僅對SQL提供有限的支持(只有幾個關鍵字) |
7 | 關聯查詢 | Ignite支持完整的SQL關聯,包括跨多個緩存的關聯,比如:select * from A a, B b where a.b_id = b.id | Hazelcast不支持任何的關聯查詢,不管用不用SQL,如果需要,開發者需要手工處理多個查詢的結果。 |
8 | 查詢一致性 | Ignite提供完整的查詢一致性,即查詢是在一個特定的快照中執行的,查詢開始之后的數據更新不影響查詢的結果。 | Hazelcast查詢是不一致的,這是可能的,查詢結果的一部分將看到一定的更新,而另一部分則不會。 |
9 | 查詢容錯 |
Ignite查詢是容錯的,即查詢結果始終是一致的不會受到集群拓撲發生變化的影響,比如節點的加入,退出或崩潰。 |
Hazelcast查詢是不容錯的,即查詢結果在集群拓撲發生變化時不一致,而數據正在后臺重新平衡。 |
10 | 數據一致性 | Ignite支持內存中數據的原子性和事務一致性,不管數據存儲在分區或者復制緩存中。 | Hazelcast僅在分區緩存中支持原子性和事務一致性,而存儲在復制緩存中的數據沒有任何事務一致性的保證。 |
11 | SSL加密 | Ignite為所有的網絡傳輸提供SSL加密,包括客戶端和服務器端以及服務器之間。 | Hazelcast僅在商業版中提供SSL加密功能。 |
12 | Web-Session集群 | Ignite為所有已知的應用服務器提供Web-Session的緩存和集群化支持。 | Hazelcast僅在商業版中提供Web-Session集群化支持。 |
13 | 計算網格 | Ignite提供集群上的M/R,Fork/Join和基本的分布式lambda處理,包括任務負載平衡,容錯,檢查點,計劃任務等。 |
Hazelcast僅支持M/R和集群內的分布式隨機任務。 |
14 | 流式網格 | Ignite支持內存流,包括對數據流浮動窗口的查詢和維護支持 | 不支持 |
15 | 服務網格 | Ignite可以使用戶方便地將其服務集群化,包括支持各種單例集群。 | Hazelcast管理的服務不提供單例集群的功能。 |
16 | .Net/C#,C++支持 | Ignite將在1.5.0版中提供完整的內存組織API | Hazelcast僅在商業版中提供有限的客戶端API支持。 |
17 | Node.js支持 | Ignite將在1.5.0版中提供Node.js的客戶端API。 | 不支持 |
2.Ignite和Coherence
Apache Ignite和Oracle Coherence都提供了富數據網格的特性,解決了可擴展的分布式集群環境下在內存中對數據進行緩存和分區的問題。
Ignite和Coherence在緩存的方式上是有很多不同的,同時支持事務和數據的查詢,下面的表格列出了一些主要的不同點,這些都是我們在選擇數據網格產品時需要特別關注的。
序號 |
對比項目 |
Apache Ignite |
Oracle Coherence |
1 | 開源和閉源 | Ignite是一個Apache的開源項目,并且還在不斷的增加新特性,對C++、.NET/C#和Node.js的支持也會很快到來。 | Coherence是一個Oracle的專有軟件,并不提供開源和免費的版本。 |
2 | JCache (JSR 107) | Ignite完全兼容JCache (JSR 107)緩存規范 | Coherence完全兼容JCache (JSR 107)緩存規范 |
3 | 堆外存儲 | Ignite根據用戶配置支持將數據存儲在堆內或者堆外 | Coherence對開發者提供了有限的選項支持將數據存儲在堆外 |
4 | 堆外索引 | 只要配置了堆外存儲,Ignite就會在堆外存儲索引(為了不影響使用堆內內存的用戶應用。) | 不支持 |
5 | SQL查詢 | Ignite支持完整的SQL(ANSI-99)語法以查詢查詢內存中的數據 | 不支持 |
6 | 關聯查詢 | Ignite支持完整的SQL關聯,包括跨多個緩存的關聯,比如:select * from A a, B b where a.b_id = b.id | Coherence不支持任何的關聯查詢,不管用不用SQL,如果需要,開發者需要手工處理多個查詢的結果。 |
7 | ACID事務 | Ignite提供了每臺服務器每秒成千上萬事務的優異性能。 | Coherence因為性能原因不建議使用事務。 |
8 | 分層存儲 | Ignite支持分層存儲模型,數據可以在堆內、堆外以及交換空間內存儲和移動,上層將提供更多的存儲能力,當然延遲也會增加。 | 不支持 |
9 | 數據流 | Ignite提供內存流的支持,包括支持流數據的維護、查詢和浮動窗口 | 不支持 |
10 | 配置 | Ignite支持通過Java Bean以及原生的Spring XML集成對系統進行配置,同時也支持通過代碼對系統進行方便配置的能力。 | Coherence通過專有的XML格式文件進行配置,不支持通過代碼進行配置。 |
3.Ignite和Gemfire
Apache Ignite和Pivotal Gemfire都提供了富數據網格的特性,解決了可擴展的分布式集群環境下在內存中對數據進行緩存和分區的問題。
Ignite和Gemfire在緩存的方式上是有很多不同的,同時支持事務和數據的查詢,下面的表格列出了一些主要的不同點,這些都是我們在選擇數據網格產品時需要特別關注的。
序號 |
對比項目 |
Apache Ignite |
Pivotal Gemfire |
1 | 開源和閉源 | Ignite是一個Apache的開源項目,并且還在不斷的增加新特性,對C++和.NET/C#和Node.js的支持也會很快到來。 |
Gemfire是Pivotal的專有軟件。 |
2 | JCache (JSR107) | Ignite數據網格是JCache(JSR107)規范的一個實現,該API為數據訪問提供了簡單易用、但是功能強大的API。 | Gemfire沒有實現JCache,使用專有的API。 |
3 | 堆外存儲 | Ignite根據用戶配置支持將數據存儲在堆內和堆外 | Gemfire不支持將數據存儲在堆外 |
4 | SQL查詢 | Ignite支持完整的SQL(ANSI-99) 查詢語法以查詢內存中的數據。 |
Gemfire不支持標準的SQL語法,但是他提供了他自己的叫做OQL的對象查詢語言。 |
5 | 關聯查詢 | Ignite支持完整的SQL關聯,包括跨多個緩存的關聯,比如:select * from A a, B b where a.b_id = b.id | Gemfire不支持任何的跨區或者跨緩存的關聯查詢,如果需要,開發者需要手工處理多個查詢的結果。 |
6 | 跨分區事務 | Ignite支持跨分區事務,事務可以在整個集群中緩存的所有分區中執行。 | Gemfire不支持跨越多個緩存分區或者節點的事務。 |
7 | 分層存儲 | Ignite支持分層存儲模型,數據可以在堆內、堆外以及交換空間內存儲和移動,上層將提供更多的存儲能力,當然延遲也會增加。 | 不支持 |
8 | 數據流 | Ignite提供內存流的支持,包括支持流數據的維護、查詢和浮動窗口 | 不支持 |
9 | 配置 | Ignite支持通過Java Bean以及原生的Spring XML集成對系統進行配置,同時也支持通過代碼對系統進行方便配置的能力。 | Gemfire通過專有的XML格式文件進行配置,不支持通過代碼進行配置。 |
10 | 部署 | Ignite節點是對等的,并且在啟動時自動加入集群(不需要任何locator服務器)。 | Gemfire需要啟動和維護一個locator服務器,以便控制節點的加入和退出。 |
4.Ignite和Redis
Apache Ignite和Redis都提供了分布式緩存的功能,但是每個產品提供的功能特性是非常不同的。Redis主要是一個數據結構存儲,但是Ignite提供了很多內存內的分布式組件,包括數據網格、計算網格、流,當然也包括數據結構。
Ignite是一個內存數據組織,并且提供了更多的功能,無法進行一個一個對應功能特性的比較,但是我們仍然能對一些數據網格功能進行比較。
序號 |
對比項目 |
Apache Ignite |
Redis |
1 | JCache (JSR 107) | Ignite完全兼容JCache(JSR107)緩存規范 | 不支持 |
2 | ACID事務 | Ignite完全支持ACID事務,包括樂觀和悲觀并發模型以及READ_COMMITTED, REPEATABLE_READ和SERIALIZABLE隔離級別。 | Redis提供了客戶端樂觀事務的有限支持,在并發更新情況下,客戶端需要手工重試事務。 |
3 | 數據分區 | Ignite支持分區緩存,類似于一個分布式哈希,集群中的每個節點都存儲數據的一部分,在拓撲發生變化的情況下,Ignite會自動進行數據的平衡。 | Redis不支持分區,但是他提供了副本的分片, |
4 | 全復制 | Ignite支持緩存的復制,集群中的每個節點的每個鍵值對都支持。 | Redis不提供對全復制的直接支持。 |
5 | 原生對象 | Ignite允許用戶使用自己的領域對象模型并且提供對任何Java/Scala, C++和.NET/C#數據類型(對象)的原生支持,用戶可以在Ignite緩存中輕易的存儲任何程序和領域對象。 | Redis不允許用戶使用自定義數據類型,僅支持預定義的基本數據結構集合,比如Set、List、Array以及一些其他的。 |
6 | (近)客戶端緩存 | Ignite提供客戶端緩存最近訪問數據的直接支持。 | Redis不支持客戶端緩存。 |
7 | 服務器端并行處理 | Ignite支持在服務器端,靠近數據并行地直接執行任何Java, C++和.NET/C#代碼。 | Redis通常沒有任何并行數據處理的能力,服務器端基本只支持LUA腳本語言,服務器端不直接支持Java, .NET,或者C++代碼執行。 |
8 | SQL查詢 | Ignite支持完整SQL(ANSI-99)語法以查詢內存中的數據。 | Redis不支持任何查詢語言,只支持客戶端緩存API。 |
9 | 持續查詢 | Ignite提供對客戶端和服務器端持續查詢的支持,用戶可以設置服務器端的過濾器來減少和降低傳輸到客戶端的數據量。 | Redis提供客戶端基于鍵值的事件通知的支持,然而,他不提供服務器端的過濾器,因此造成了在客戶端和服務器端中更新通知網絡流量的顯著增加。 |
10 | 數據庫集成 | Ignite可以自動集成外部的數據庫-RDBMS, NoSQL,和HDFS | 不支持 |
按照官方的說法,Ignite是很強大的整體解決方案和開發平臺,功能很多而且復雜,沒有提到缺點或者說坑,這個只能使用過程中逐步發現和解決,雖然Ignite本身歷史尚短,但是既然來源于歷史不算短的商業軟件,還是經過實際生產環境驗證的,基本功能的可用性肯定是有的。