Ignite是什麼呢?先引用一段官網關於Ignite的描述:java
Ignite is memory-centric distributed database, caching, and processing platform for transactional, analytical, and streaming workloads delivering in-memory speeds at petabyte scalenode
直接翻譯就是,Ignite是之內存爲中心的分佈式的數據庫,緩存和處理平臺。它能夠在數據量達到PB級別,依然爲事務性處理,數據分析和流式任務提供了內存級的操做速度。 再從官網借用一張架構圖,從下面這張圖也能夠看出來Ignite提供了哪些能力:
git
圖中紅色部分屬於Ignite提供的組件,咱們依次從下往上看:sql
以上只是簡單羅列了目前我所瞭解的Ignite的特性,若是還想了解更多關於Ignite基本概念和資料,能夠參閱官方文檔, 英文很差的同窗能夠看看李玉珏翻譯的中文官方文檔。 光從文檔量上看,Ignite的特性至關繁雜,並且有些例子仍是須要實際跑跑代碼才能弄清楚如何使用,後面我會根據本身的學習進度,更新Ignite的學習筆記,把本身對Ignite的理解和小夥伴分享。docker
Ignite有多種安裝方式,好比源碼安裝,docker,RPM包等,我的認爲二進制包的安裝方式最簡單,開箱即用。下面咱們看看如何經過二級制包來安裝部署Ignite。
1.首先咱們須要從官網下載二進制壓縮包。在我寫這篇博客時候,最新版本爲2.6.0。
2.下載後咱們須要解壓縮二進制包,而後設置好環境變量IGNITE_HOME,指向剛剛解壓好的目錄。
3.而後咱們能夠經過IGNITE_HOME/bin/ignite.sh腳本啓動咱們的第一個Ignite節點:數據庫
$cd IGNITE_HOME $bin/ignite.sh
4.節點啓動過程,會在終端上打印日誌信息,當看到下面相似日誌時就表明節點啓動成功了:apache
[23:41:41] Ignite node started OK (id=e935ab3a) [23:41:41] Topology snapshot [ver=1, servers=1, clients=0, CPUs=2, offheap=1.6GB, heap=1.0GB]
咱們先來簡單看看最後那一行日誌都提供了哪些信息:api
就是這麼簡單,開箱即用。 到目前爲止咱們已經成功在一個節點上啓動了一個Ignite實例。咱們還能夠在同一個節點上或者多個節點上用相同的辦法啓動多個Ignite實例。在新的Ignite實例啓動後,新老節點會互相發現自動的造成一個集羣。好比我在相同的虛擬機上在啓動一個實例,在第一個和第二個實例的日誌中有這麼一行:緩存
[00:24:27] Topology snapshot [ver=2, servers=2, clients=0, CPUs=2, offheap=3.1GB, heap=2.0GB]
細心的小夥伴應該會發現ver, servers, offheap, heap值都改變了,這說明Ignite集羣加入了新的節點,因此topology的版本號變了,集羣內server數量也變成2。服務器
server節點啓動後,咱們就能夠用客戶端鏈接上進行操做了。 目前Ignite支持的客戶端有REST, SQL, Java/.NET客戶端。 其中Java/.NET客戶端都須要本身寫代碼鏈接到服務器上,因此這裏咱們先介紹使用REST和SQL客戶端,下一篇文章再分享如何寫一個簡單的Java程序鏈接Ignite server節點。
注意: 爲了啓用REST鏈接,必須保證ignite-rest-http模塊在啓動JVM的classpath中。 若是你下載了二進制包,能夠在$IGNITE_HOME/libs/optional中找到ignite-rest-http模塊,只要將它拷貝到$IGNITE_HOME/libs目錄中就能夠了。
Ignite啓動後,默認會自動監聽8080端口,咱們就能夠經過如下curl命令查看server節點版本(192.168.0.110是個人Ignite server節點啓動的ip地址):
$curl 'http://192.168.0.110:8080/ignite?cmd=version' {"successStatus":0,"sessionToken":null,"error":null,"response":"2.6.0"}
目前咱們的Ignite集羣裏沒有任何的cache,讓咱們試着用REST命令建立一個新的cache:
$curl 'http://192.168.0.110:8080/ignite?cmd=getorcreate&cacheName=myfirstcache' {"successStatus":0,"sessionToken":null,"error":null,"response":null}
而後咱們就能夠往這個cache裏添加數據了:
$curl 'http://192.168.0.110:8080/ignite?cmd=put&key=Toronto&val=Ontario&cacheName=myfirstcache' {"successStatus":0,"affinityNodeId":"370c1554-03f4-4fa2-9c45-880e40288467","sessionToken":null,"error":null,"response":true} $curl 'http://192.168.0.110:8080/ignite?cmd=put&key=Edmonton&val=Alberta&cacheName=myfirstcache' {"successStatus":0,"affinityNodeId":"370c1554-03f4-4fa2-9c45-880e40288467","sessionToken":null,"error":null,"response":true}
咱們往cache裏寫了兩條關於加拿大城市和所在省份的數據,第一條key是Toronto市,value值是Ontario省。 第二條key是Edmonton市,value值是Alberta省。 而後再讓咱們試着讀取cache裏的數據:
$curl 'http://192.168.0.110:8080/ignite?cmd=get&key=Toronto&cacheName=myfirstcache' {"successStatus":0,"affinityNodeId":"370c1554-03f4-4fa2-9c45-880e40288467","sessionToken":null,"error":null,"response":"Ontario"} $curl 'http://192.168.0.110:8080/ignite?cmd=get&key=Edmonton&cacheName=myfirstcache' {"successStatus":0,"affinityNodeId":"370c1554-03f4-4fa2-9c45-880e40288467","sessionToken":null,"error":null,"response":"Alberta"} $curl 'http://192.168.0.110:8080/ignite?cmd=get&key=Ottawa&cacheName=myfirstcache' {"successStatus":0,"affinityNodeId":"370c1554-03f4-4fa2-9c45-880e40288467","sessionToken":null,"error":null,"response":null}
當咱們查詢Toronto和Edmonton時,返回的省份名稱和咱們以前寫入的同樣。 當咱們查詢Ottawa時,由於咱們的cache沒有這組數據,因此返回值是null。
或許有小夥伴已經注意到默認狀況下REST API會把key/value當作String來處理,包括存儲在集羣裏的格式也是String。 固然在用put/get命令的時候也你能夠用keyType/valueType將key/value其餘Ignite支持的類型,好比整型,布爾型,浮點型,日期等類型,但這些類型也僅限於Java內置類型。 若是你想經過REST API來存儲一個複雜對象,可能就須要你本身先把對象序列化爲一個string,而後讀取的時候再反序列化回一個對象。 因此我的以爲REST API還不能發揮出Ignite所有的實力,只能支持一些簡單的緩存使用場景,對複雜的操做可能仍是SQL或者用代碼更方便。
更多的REST API和具體的使用參數能夠查看官方的REST API文檔。
還記得在官方介紹Ignite的描述中,把Ignite描述爲一個之內存爲中心的分佈式數據,同時Ignite兼容SQL ANSI-99標準,因此能夠像使用一個數據庫同樣使用Ignite,這個特性卻是目前其餘內存緩存所不具有的。
咱們可使用DBeaver工具像鏈接其餘數據庫同樣鏈接Ignite。按照官方文檔配置完JDBC驅動用到的類,URL鏈接模板,端口號以及須要使用到的Ignite的jar包,就能夠鏈接到Ignite上了。這個時候Ignite集羣裏尚未任何數據,因此在DBeaver裏是看不到任何表的:
如今讓咱們用SQL語句建立兩張表,在執行完SQL語句後,在左邊的Tables選項下就能夠看見剛剛建立的兩張表了,點開任意一張表,咱們就能夠在Dbeaver裏看到表的schema定義了。:
而後咱們在對這兩張表用省的名字和市的名字分別創建索引:
一樣,在執行完SQL語句後,咱們就在indexes選項下看到新建的表索引了。接着,咱們能夠往表格裏插入一些數據,並作簡單的查詢:
對就是這麼簡單,和使用其餘的數據庫沒什麼區別。並且若是你的Ignite集羣包含多個節點,Ignite已經根據你建表時的配置(注意咱們在建表的時候with以後有諸如template=replicated, backup=1,affinityKey=province_id關鍵字,這些配置會在後面進行介紹),自動幫你把表數據複製到不一樣的節點上去了,你不用關心你的數據是如何分佈的,一切就交給Ignite作管理吧,即使是有些節點發生故障,也不用擔憂數據會丟失。
除了Dbeaver外,Ignite也自帶了一個SQL命令行工具,叫作SQLLine,也能夠用來鏈接Ignite執行SQL語句。在$IGNITE_HOME/bin下能夠找到這個工具,使用下面的命令啓動SQLLine並鏈接到Ignite集羣中:
$cd $IGNITE_HOME/bin $./sqlline.sh --verbose=true -u jdbc:ignite:thin://192.168.0.110/
鏈接成功後,咱們能夠查看Ignite中全部的表(!tables),表結構(!columns),還能夠用SQL語句修改/查詢數據(!sql SQL Statement):
0: jdbc:ignite:thin://192.168.0.110/> !tables +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | | +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ | | PUBLIC | CITY | TABLE | | | | PUBLIC | PROVINCE | TABLE | | +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ 0: jdbc:ignite:thin://192.168.0.110/> !columns +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | | +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ | | PUBLIC | CITY | ID | | | | PUBLIC | CITY | NAME | | | | PUBLIC | CITY | PROVINCE_ID | | | | PUBLIC | PROVINCE | ID | | | | PUBLIC | PROVINCE | NAME | | +--------------------------------+--------------------------------+--------------------------------+--------------------------------+--+ 0: jdbc:ignite:thin://192.168.0.110/> !sql SELECT p.name, c.name FROM PROVINCE p, CITY c WHERE p.id=c.province_id; +--------------------------------+--------------------------------+ | NAME | NAME | +--------------------------------+--------------------------------+ | Alberta | Edmonton | | Alberta | Calgary | | Ontario | Toronto | | Quebec | Montreal | +--------------------------------+--------------------------------+
更多SQLLine使用的方法和命令,能夠看這裏。
在啓動了Ignite集羣后,Ignite也提供了一個簡單的命令行工具,Visor Command Line Interface,經過這個工具能夠查詢集羣的狀態,檢測緩存的使用狀況,控制節點等。一樣,在$IGNITE_HOME/bin下能夠找到Visor命令行工具並啓動:
$cd $IGNITE_HOME/bin $ ./ignitevisorcmd.sh ... ADMIN CONSOLE 2018 Copyright(C) Apache Software Foundation +-------------------------------------+ | Status | Disconnected | | Ignite instance name | <n/a> | | Config path | <n/a> | | Uptime | <n/a> | +-------------------------------------+ Type 'help' for more information. Type 'open' to join the grid. Type 'quit' to quit form Visor console. visor> open
啓動成功後, 再經過open命令鏈接到當前使用的Ignite集羣上,咱們就能夠查詢集羣的topology信息:
visor> top Hosts: 1 +=========================================================================================================================+ | Int./Ext. IPs | Node ID8(@) | Node Type | OS | CPUs | MACs | CPU Load | +=========================================================================================================================+ | 0:0:0:0:0:0:0:1%lo | 1: 134F0292(@n0) | Server | Linux amd64 3.13.0-32-generic | 2 | 08:00:27:8F:07:76 | 10.17 % | | 127.0.0.1 | 2: B677DAF2(@n1) | Server | | | | | | 192.168.0.110 | | | | | | | +-------------------------------------------------------------------------------------------------------------------------+ Summary: +--------------------------------------+ | Active | true | | Total hosts | 1 | | Total nodes | 2 | | Total CPUs | 2 | | Avg. CPU load | 10.17 % | | Avg. free heap | 81.00 % | | Avg. Up time | 00:28:14 | | Snapshot time | 2018-10-11 00:52:24 | +--------------------------------------+
從上面的輸出能夠看到,目前個人集羣裏有1臺主機,2個Ignite server節點,這兩個節點都跑在同一臺機器上的。咱們還能夠查看下目前集羣裏的緩存數據:
visor> cache Time of the snapshot: 2018-10-11 01:04:59 +============================================================================================================================+ | Name(@) | Mode | Nodes | Entries (Heap / Off-heap) | Hits | Misses | Reads | Writes | +============================================================================================================================+ | myfirstcache(@c0) | PARTITIONED | 2 | min: 1 (0 / 1) | min: 0 | min: 0 | min: 0 | min: 0 | | | | | avg: 1.00 (0.00 / 1.00) | avg: 0.00 | avg: 0.00 | avg: 0.00 | avg: 0.00 | | | | | max: 1 (0 / 1) | max: 0 | max: 0 | max: 0 | max: 0 | +--------------------------+-------------+-------+---------------------------+-----------+-----------+-----------+-----------+ | SQL_PUBLIC_CITY(@c1) | PARTITIONED | 2 | min: 2 (0 / 2) | min: 0 | min: 0 | min: 0 | min: 0 | | | | | avg: 2.00 (0.00 / 2.00) | avg: 0.00 | avg: 0.00 | avg: 0.00 | avg: 0.00 | | | | | max: 2 (0 / 2) | max: 0 | max: 0 | max: 0 | max: 0 | +--------------------------+-------------+-------+---------------------------+-----------+-----------+-----------+-----------+ | SQL_PUBLIC_PROVINCE(@c2) | REPLICATED | 2 | min: 1 (0 / 1) | min: 0 | min: 0 | min: 0 | min: 0 | | | | | avg: 1.50 (0.00 / 1.50) | avg: 0.00 | avg: 0.00 | avg: 0.00 | avg: 0.00 | | | | | max: 2 (0 / 2) | max: 0 | max: 0 | max: 0 | max: 0 | +----------------------------------------------------------------------------------------------------------------------------+
能夠看到目前咱們集羣裏面有3個緩存,一個是咱們經過REST API創建的myfirstcache緩存,剩下兩個是咱們在DBeaver裏面建立的兩張數據庫表。同時咱們還能夠看到每一個緩存的統計信息,好比緩存是REPLICATED仍是PARTITIONED模式,緩存中有多少條目,讀寫次數,命中率等。
Visor的命令行工具就簡單介紹到這, 更多命令的使用說明經過"help CMD" 或者 「? CMD」命令輸出命令的幫助文檔供查閱。
下一篇,讓咱們看看如何寫Java代碼來鏈接Ignite集羣,並解鎖更多Ignite的特性。