Apache Ignite 介绍


Ignite是什么呢?先引用一段官网关于Ignite的描述:

Ignite is memory-centric distributed database, caching, and processing platform for transactional, analytical, and streaming workloads delivering in-memory speeds at petabyte scale

直接翻译就是,Ignite是以内存为中心的分布式的数据库,缓存和处理平台。它可以在数据量达到PB级别,依然为事务性处理,数据分析和流式任务提供了内存级的操作速度。 再从官网借用一张架构图,从下面这张图也可以看出来Ignite提供了哪些能力:

图中红色部分属于Ignite提供的组件,我们依次从下往上看:

  • 持久化层:Ignite同时支持原生持久化和用第三方存储做持久化,比如RMDBMS,HDFS等。虽然Ignite有以内存为中心的存储,但是毕竟内存中数据在节点出现故障的时候都有丢失的可能性。 因此持久化层为Ignite提供了故障恢复的能力。另外有了持久化能力,可以让冷热数据更合理使用内存。比如在内存足够情况下,数据可以全部加载到内存中。 而当内存紧张时,可以只加载热数据至内存中,冷数据就留在硬盘上。
  • Ignite内存存储层:这一层可以算是Ignite的核心层了。数据可以通过不同分区,复制模式分布在Ignite集群所有节点,部分节点或者本地节点。通过数据分区和复制,比如1主多备的方式,可以提高数据的可用性,即便主数据节点故障后,集群中的备数据节点可以切换为主节点继续提供读写服务。 同时备节点也可以作为只读节点使用,提高数据读操作的吞吐量。Ignite还利用Java堆外内存存储数据和索引,减少了JVM的垃圾回收次数和时间,提供了更高效的操作。
  • API接口层: 丰富多样的接口支撑Ignite向上提供了诸如分布式数据库,数据网格和计算网格的能力。Key/Value+transaction,可以把Ignite当做和Redis,Memcached一样的缓存使用。 而对SQL ANSI-99的兼容,有可以把Ignite当做一个分布式数据库来用。 除了数据能力,Ignite还允许你通过Compute Grid的接口提交计算任务,充分利用集群的计算资源。Ignite还支持把计算任务部署在和计算数据所在的相同节点上,减少网络传输和数据的序列化开销,提高计算效率。 流处理,机器学习网格,服务网格,消息队列等,Ignite也同时提供支持。

以上只是简单罗列了目前我所了解的Ignite的特性,如果还想了解更多关于Ignite基本概念和资料,可以参阅官方文档, 英文不好的同学可以看看李玉珏翻译的中文官方文档。 光从文档量上看,Ignite的特性相当繁杂,而且有些例子还是需要实际跑跑代码才能弄清楚如何使用,后面我会根据自己的学习进度,更新Ignite的学习笔记,把自己对Ignite的理解和小伙伴分享。

Ignite 集群安装部署和启动


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.节点启动过程,会在终端上打印日志信息,当看到下面类似日志时就代表节点启动成功了:

[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]

我们先来简单看看最后那一行日志都提供了哪些信息:

  • ver=1”代表Ignite集群topology版本是1。关于什么是topology,我会在介绍Ignite原生持久化能力的时候讨论到。
  • servers=1”代表现在集群里面就一个server节点,“clients=0”代表集群里没有client节点。 client/server节点在作为数据节点和计算节点时时有区别的,我会在后面介绍。现在可以简单的理解为server节点总是存放数据,client节点不存放数据,数据的访问总是通过server节点。
  • CPUs=2”代表当前节点的CPU数量。
  • offheap=1.6GB”代表当前节点可以使用的Java堆外内存是1.6GB。堆外内存是个很重要的概念,我会在介绍Ignite内存架构的时候再详细解释Ignite是如何使用堆外内存。现在只要记住Ignite用堆外用来存储数据和索引来减少GC。默认配置下Ignite能使用的堆外内存为节点内存大小的20%。我启动Ignite的虚拟机只有8G内存,因此堆外内存为8GB*20%=1.6GB。
  • heap=1.0GB”这个就是Ignite能使用的Java堆内存了。这个值的大小也是可以调整的,如果你没有配置JAVA_OPTS,在ignite.sh脚本中启动JVM时用的最小/最大堆都是1GB。

就是这么简单,开箱即用。 到目前为止我们已经成功在一个节点上启动了一个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。

Ignite REST和SQL客户端


server节点启动后,我们就可以用客户端连接上进行操作了。 目前Ignite支持的客户端有REST, SQL, Java/.NET客户端。 其中Java/.NET客户端都需要自己写代码连接到服务器上,所以这里我们先介绍使用REST和SQL客户端,下一篇文章再分享如何写一个简单的Java程序连接Ignite server节点。

REST 客户端使用

注意: 为了启用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文档

SQL 客户端使用


还记得在官方介绍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=1affinityKey=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 Visor 命令行工具


在启动了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”命令输出命令的帮助文档供查阅。

总结


  • 简单的介绍了Apache Ignite的特性,Ignite可以当做缓存使用,也可以当做分布式数据库使用,还可以用来做计算节点和服务网格等。详细的特性介绍会在随后的文章详细展开。
  • Ignite的二进制包安装十分简单,一个命令就可以用默认的配置启动一个Ignite实例,属于开箱即用。
  • Ignite支持REST, SQL, Java/.NET客户端连接。使用REST, SQL客户端(Dbeaver和SQLLine),可以不用写一行代码快速体验Ignite的缓存和分布式数据库能力。
  • Ignite自带的Visor Command Line Interface提供了基本的集群查询/管理能力。

下一篇,让我们看看如何写Java代码来连接Ignite集群,并解锁更多Ignite的特性。

Apache Ignite 学习笔记(一): Ignite介绍、部署安装和REST/SQL客户端使用的更多相关文章

  1. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  2. InterSystems Ensemble学习笔记(一) Ensemble介绍及安装

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  3. Apache Ignite 学习笔记(二): Ignite Java Thin Client

    前一篇文章,我们介绍了如何安装部署Ignite集群,并且尝试了用REST和SQL客户端连接集群进行了缓存和数据库的操作.现在我们就来写点代码,用Ignite的Java thin client来连接集群 ...

  4. MeayunDB学习笔记(一) MeayunDB介绍及安装

    系列目录   MeayunDB介绍-高性能分布式内存数据库 MeayunDB学习笔记(一)MeayunDB介绍及安装 MeayunDB学习笔记(二)批量导入数据 MeayunDB学习笔记(三)索引应用 ...

  5. Docker学习笔记_04 Rancher的部署安装(编排选用K8S)

    原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...

  6. Apache Ignite 学习笔记(三): Ignite Server和Client节点介绍

    在前两篇文章中,我们把Ignite集群当做一个黑盒子,用二进制包自带的脚本启动Ignite节点后,我们用不同的客户端连接上Ignite进行操作,展示了Ignite作为一个分布式内存缓存,内存数据库的基 ...

  7. Apache Ignite 学习笔记(四): Ignite缓存冗余备份策略

    Ignite的数据网格是围绕着基于内存的分布式key/value存储能力打造的.当初技术选型的时候,决定用Ignite也是因为虽然同样是key/value存储,它有着和其他key/value存储系统不 ...

  8. Apache Ignite 学习笔记(6): Ignite中Entry Processor使用

    之前的文章我们其实已经用到了两种不同的方式访问Ignite中的数据.一种方式是第一篇文章中提到通过JDBC客户端用SQL访问数据,在这篇文章中我们也会看到不使用JDBC,如何通过Ignite API用 ...

  9. MongoDB学习笔记(一) MongoDB介绍及安装

    转自:http://database.51cto.com/art/201103/247882.htm http://baike.baidu.com/link?url=b6B3dVSCnQauCX-Ep ...

随机推荐

  1. python虚拟环境 -- virtualenv , virtualenvwrapper

    virtualenv -- python虚拟沙盒 有人说:virtualenv.fabric 和 pip 是 pythoneer 的三大神器. 一.安装 pip install virtualenv ...

  2. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  3. Pandas Learning

    Panda Introduction Pandas 是基于 NumPy 的一个很方便的库,不论是对数据的读取.处理都非常方便.常用于对csv,json,xml等格式数据的读取和处理. Pandas定义 ...

  4. Linux基础第二课——系统架构

    网址 192.168.0. 172.16. 10.0. 以上是内网网段 127.0.0.1 这是本地回环网卡 表示本身 查看网络是否连通 windows Linux 都是通过 ping 先ping网关 ...

  5. POJ 1066 昂贵的聘礼

    Description 年轻的探险家来到了一个印第安部落里. 在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长减 ...

  6. BZOJ1922:[SDOI2010]大陆争霸(最短路)

    Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...

  7. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...

  8. Python2.7-getpass

    getpass模块,当用户输入密码时,可以不在屏幕上显示,但是用户也不能看到自己输了几位输了什么 1.模块方法 1.1 getpass.getpass([prompt[, stream]]):prom ...

  9. linux shell中'',""和``的区别

    今天学习一个bash脚本,看到有一条:bin=`dirname "$0"` (dirname filename是输出该文件所在的目录,$0是该bash文件的文件名,在bash中一般 ...

  10. Centos7 安装ELK日志分析

    1.安装前准备 借鉴:https://www.cnblogs.com/straycats/p/8053937.html 操作系统:Centos7 虚拟机  8G内存  jdk8+ 软件包下载:采用rp ...