基本概念
1.1.Ignite是什么
Ignite是: 一个以内存为中心的分布式数据库、缓存和处理平台,可以在PB级数据中,以内存级的速度进行事务性、分析性以及流式负载的处理。
1.1.1.固化内存
可以按需将持久化打开或者关闭。如果持久化关闭,那么Ignite就可以作为一个分布式的内存数据库或者内存数据网格。
1.1.2.Ignite持久化
Ignite的原生持久化是一个分布式的、支持ACID以及兼容SQL的磁盘存储。
1.1.3.ACID兼容
存储在Ignite中的数据,在内存和磁盘上是同时支持ACID的,使Ignite成为一个强一致的系统,Ignite可以在整个网络的多台服务器上保持事务。
1.1.4.完整的SQL支持
Ignite提供了完整的SQL、DDL和DML的支持,可以使用纯SQL而不用写代码与Ignite进行交互,这意味着只使用SQL就可以创建表和索引,以及插入、更新和查询数据。有这个完整的SQL支持,Ignite就可以作为一种分布式SQL数据库。
1.2 特性
1.2.1 Advanced Clustering
通过心跳服务自动发现。从而:
(1)加节点无需重启(支持CacheRebalanceMode);
(2)获取度量指标(如CPU负载、使用内存等);
(3)自修复(自动重连,慢客户端会被自动踢出);
(4)容错性(故障节点的数据也会被自动传播到网格内的其他节点,至少一次保证:Ignite保证只要有一个节点存在,任务就不会丢失)
(5)动态负载平衡(通过LoadBalancingSpi实现可插拔,ExecutorService接口实现动态平衡计算);
1.2.2 Data Grid
in-memorydistributed key-value store(可理解为distributed partitioned hash map),using a pluggable hashingalgorithm。从而:
(1)加节点即加缓存;
(2)ACID数据一致性;
(3)支持JCache规范(使用IgniteCache接口实现);
(4)支持Hibernate L2 Cache;
(5)支持内存级数据自动分区(允许在内存内缓存TB级的数据);
(6)近缓存(本地客户端侧的缓存,他会存储最近和最频繁访问的数据,“内网中的CDN”);
(7)支持off-heap memory(支持堆内和堆外两种模式,堆外存储可以克服JVM垃圾回收(gc)导致的长时间暂停,堆外提供堆外索引和分层存储,分层存储是指冷数据按堆内->堆外->磁盘分层移动);
(8)支持乐观锁;
(9)Write-Through和 Read-Through通写通读(缓存数据更新会逐条或批次同步到数据库,请求的数据在缓存中不可用时自动从数据库中拉取);
(10)Data Loading,initializing cache dataon startup
1.2.3 SQL Grid
(1)支持标准SQL(支持基于内存分布式join);
(2)支持执行计划;
(3)Text Query(query cache object ongiven value – new TextQuery(Person.class, "Master"))
(4)continuous queries(持续查询是指执行查询后又想持续的获得之前的查询结果的数据更新通知,其基于CacheEntryUpdatedListener接口实现);
1.2.4 Streaming & CEP
(1)支持event window滑动窗口;
(2)支持接入Flume、Kafka、Storm数据;
1.2.5 Compute Grid
通过一组API实现分布式计算处理。
(1) ForkJoin处理(纯MapReduce并不是为了性能而构建,轻量级MapReduce,MR的简化API);
(2) 作业调度,支持LRU、FIFO、随机、优先级甚至磨洋工;
1.2.6 Service Grid
在集群中部署各种单例服务,如分布式计数器。
1.2.7 Ignite File System
Ignite文件系统(IGFS),IGFS提供了和Hadoop HDFS类似的功能,但是仅仅在内存内部。
(1) IGFS实现了Hadoop的文件系统API,并且可以透明地加入Hadoop或者Spark应用;
(2) IGFS也可以在另一个Hadoop文件系统上部署为一个缓存层(应用通写通读技术)。
(3) 自带Hadoop,也支持CDH和HDP。
1.2.8 Data Structures
支持复杂数据结构。
1.2.9 其他
(1)包含Ignite Web控制台;
(2)支持Spark Shared RDDs,使Spark job在Ignite上运行(IgniteRDD在执行SQL查询时比Spark原生RDD或者DataFrame有百倍的性能提升);
(3)支持混合云(Docker、AWS、Google Compute Engine),也支持Mesos、Yarn;
关键特性结构
2.1 Ignite持久化
2.2 分布式SQL数据库
2.3 内存数据网格
2.4 内存计算网格
2.5 机器学习
安装部署
3.1 下载解压
目录结构
下载地址 https://ignite.apache.org/
unzip apache-ignite-fabric-2.4.0-bin.zip
cd apache-ignite-fabric-2.4.0-bin
bin/ignite.sh
3.2 启动信息
机器1 启动1
机器1 启动2
机器2 启动1
3.3 服务端与客户端
Ignite的大部分配置选项,都同时支持通过基于Spring的XML配置方式以及通过Java代码的编程方式进行配置。
1. 默认配置文件
2. 客户端配置文件
3. java配置
TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList("192.168.2.167", "192.168.2.168:47500..47509"));
spi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDiscoverySpi(spi);
Ignition.start(cfg);
4. 发现机制
Ignite节点之间会自动感知,集群可扩展性强,不需要重启集群,简单地启动新加入的节点然后他们就会自动地加入集群。这是通过一个发现机制实现的,他使节点可以彼此发现对方,Ignite默认使用TcpDiscoverySpi通过TCP/IP协议来作为节点发现的实现,也可以配置成基于多播的或者基于静态IP的,这些方式适用于不同的场景。
启动服务端
启动客户端1
启动客户端2
web端配置
1. 下载客户端
https://console.gridgain.com/monitoring/dashboard ignite-web-agent-2.5.3.zip
2. 解压下载的zip文件,部署到安装ignite的一个节点
/data/ignite/apache-ignite-fabric-2.4.0-bin
3.配置default.properties
tokens=Om7ZqeDwzF7xRlLYPFdX
server-uri=https://console.gridgain.com
#Uncomment following options if needed:
node-uri=http://192.168.2.166:8080
driver-folder=./jdbc-drivers
4. 复制文件夹
cp -r /data/ignite/apache-ignite-fabric-2.4.0-bin/libs/optional/ignite-rest-http /data/ignite/apache-ignite-fabric-2.4.0-bin/libs/
5. 复制jdbc驱动
复制jdbc驱动到 mysql-connector-java-8.0.13-1.el6.noarch.rpm /data/ignite/apache-ignite-fabric-2.4.0-bin/ignite-web-agent-2.5.3/jdbc-drivers
6. 启动ignite节点
bin/ignite.sh
7. 启动web agent
./ignite-web-agent.sh
8. 启动界面
Demo
put
TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
// 设置预定义IP地址,注意端口或者端口范围是可选的。
ipFinder.setAddresses(Arrays.asList("192.168.2.168:47500"));
spi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDiscoverySpi(spi);
cfg.setClientMode(true);
// 启动集群
Ignite ignite = Ignition.start(cfg);
System.out.println("节点Id: " + ignite.cluster().localNode().id());
System.out.println("节点地址: " + ignite.cluster().localNode().addresses());
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
cache.put(1, "TEST");
cache.put(2, "IGNITE!");
get
TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
// 设置预定义IP地址,注意端口或者端口范围是可选的。
ipFinder.setAddresses(Arrays.asList("192.168.2.168:47500"));
spi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDiscoverySpi(spi);
cfg.setClientMode(true);
// 启动集群
Ignite ignite = Ignition.start(cfg);
// Put values in cache.
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
String test = cache.get(1);
String ingite = cache.get(2);
System.out.println(test + " " + ingite);
工具
SQLLine
启动终端
./sqlline.sh --verbose=true -u jdbc:ignite:thin://192.168.2.168/
执行sql
!sql
获取表
!tables
问题
问题一:关于第三方不同数据库是否支持统一sql查询。
不支持select查询
问题二:命名空间问题
有shcema概念,默认是public 目前,所有的表都会位于PUBLIC模式中 schema:要访问的模式名,默认是PUBLIC,这个名字对应于SQL的ANSI-99标准,不加引号是大小写不敏感的,加引号是大小写敏感的。如果使用了分号模式,模式可以通过参数名schema定义;
问题三:集群划分问题
问题四:是否支持roll up
问题五:列动态增加
支持显示增加列,结构化数据 ALTER TABLE City ADD COLUMN IF NOT EXISTS population int;
问题六:不同第三方数据库如何查询
JAVA API