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的特性。