Ignite是什么?
Ignite是一个以内存为中心的数据平台
强一致
高可用
强大的SQL
键-值存储及相关的API
Ignite架构
ignite的架构图:
Ignite分为核心和组件两部分 ,即:
ignite-core 和
ignite-spring:基于Spring的配置支持
ignite-indexing:SQL查询和索引
ignite-geospatial:地理位置索引
ignite-hibernate:Hibernate集成
ignite-web:Web Session集群化
ignite-schedule:基于Cron的计划任务
ignite-log4j:Log4j日志
ignite-jcl:Apache Commons logging日志
ignite-jta:XA集成
ignite-hadoop2-integration:HDFS2.0集成
ignite-rest-http:HTTP REST请求
ignite-scalar:Ignite Scalar API
ignite-slf4j:SLF4J日志
ignite-ssh;SSH支持,远程机器上启动网格节点
ignite-urideploy:基于URI的部署
ignite-aws:AWS S3上的无缝集群发现
ignite-aop:网格支持AOP
ignite-visor-console:开源的命令行管理和监控工具
缓存模式
分区模式
复制模式
本地模式
客户端和服务端
客户端拥有服务端除了计算和存储外的所有功能。
功能
分发,自动数据迁移,到期,磁盘交换(固化内存),数据查询(支持并置)和事务。
主节点和备份副本
同步和异步备份
同步写模式 描述
FULL_SYNC 客户端节点要等待所有相关远程节点的写入或者提交完成(主和备)。
FULL_ASYNC 这种情况下,客户端不需要等待来自相关节点的响应。这时远程节点会在获得他们的状态在任意的缓存写操作完成或者Transaction.commit()方法调用完成之后进行小幅更新。
PRIMARY_SYNC 这是默认模式,客户端节点会等待主节点的写或者提交完成,但不会等待备份节点的更新完成。
缓存数据一致性 (强一致性)
注意不管那种写同步模式,缓存数据都会保持在所有相关节点上的完整一致性。
近缓存
分区化的缓存也可以通过近缓存前移,他是一个较小的本地缓存,可以用来存储最近或者最频繁访问的数据。和分区缓存一样,可以控制近缓存的大小以及回收策略。默认375,000b
规划内存使用量
计算主数据大小:每个条目的大小(字节)乘以条目的总数量
如果需要备份,乘以备份的数量
索引也需要内存,基本的用例是增加一个30%的量
每个节点增加大约200-300MB,为内部存储以及为了JVM和GC高效运行预留的合理的量。
Ignite持久化
WAL: Write-Ahead Logging 预写日志系统 数据库中一种高效的日志算法
分布式SQL数据库
内存数据网格
内存计算网格
事务
原子化模式
跨缓存事务和近缓存事务
阶段提交(2PC)
并发模型和隔离级别
悲观事务
乐观事务
死锁检测
无死锁事务
集成JTA
JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据
锁
关系并置
数据和计算以及数据和数据的并置可以显著地提升应用的性能和可扩展性。
Ignite SQL使用
加入模块:ignite-indexing
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-indexing</artifactId>
<version>2.1.0</version>
</dependency>
QuerySqlField
queryEntity
JDBC
数据加载
数据加载通常用于启动时初始化缓存数据,用标准的缓存put(...)和putAll(...)操作加载大量的数据通常是比较低效的。Ignite提供了IgniteDataStreamerAPI和CacheStoreAPI,他们有助于以一个更高效的方式将大量数据注入Ignite缓存。
IgniteDataStreamer
数据流处理器是通过IgniteDataStreamerAPI定义的,他可以将大量的连续数据注入Ignite缓存。数据流处理器以可扩展和容错的方式在数据被发送到集群节点之前通过把定量数据放在一起以获得高性能。
数据流处理器可以用于任何时候将大量数据载入缓存,包括启动时的预加载。
IgniteCache.loadCache()
将大量数据载入缓存的另一个方法是通过CacheStore.loadCache()方法,他可以在不传入要加载的所有键的情况下进行缓存的数据加载。
在所有保存该缓存的每一个集群节点上IgniteCache.loadCache()方法会委托给CacheStore.loadCache()方法,如果只想在本地节点上加载,可以用IgniteCache.localLoadCache()方法。
对于分区缓存,如果键没有映射到某个节点,不管是主节点还是备份节点,都会被自动忽略
退出策略
Random-LRU
Random-2-LRU
Random-LRU与Random-2-LRU的对比
Random-LRU退出模式中,一个数据页面只会保存一份最近访问时间戳,而Random-2-LRU模式会为每个数据页面保存两份最近访问时间戳。
缓存再平衡模式 描述
SYNC 同步再平衡模式,直到所有必要的数据全部从其他有效节点加载完毕分布式缓存才会启动,这意味着所有对缓存的开放API的调用都会阻塞直到再平衡结束
ASYNC 异步平衡模式,分布式缓存会马上启动,然后在后台会从其他节点加载所有必要的数据
NONE 该模式下不会发生再平衡,这意味着要么在访问数据时从持久化存储载入,要么数据被显式地填充
退出的触发
一个数据页面退出算法的触发默认是当内存区的总消耗量达到了90%,如果要调整的话,可以使用MemoryPolicyConfiguration.setEvictionThreshold(...)参数
基于堆内缓存条目的退出
最近最少使用(LRU)
先进先出(FIFO)
有序
随机
.Eager TTL(热生存时间)
异步线程处理
数据再平衡
再平衡模式
再平衡线程池调节
再平衡消息调节
SQL网格
分布式查询
Ignite借用了H2的SQL查询解析器以及优化器还有执行计划器。H2会在一个特定的节点执行本地化的查询(一个分布式查询会被映射到节点或者查询是以本地模式执行的),然后会将本地的结果集传递给分布式SQL引擎用于后续处理。
数据和索引,通常是存储于Ignite数据网格端的,而Ignite以分布式以及容错的方式执行SQL查询,这个是H2不支持的。
Ignite SQL网格执行查询有两种方式:
首先,如果查询在一个部署有REPLICATED模式缓存的节点上执行,那么Ignite会假定所有的数据都是本地化的,然后将其直接传递给H2数据库引擎执行一个简单的本地化SQL查询,对于LOCAL模式的缓存,也是同样的执行流程。
第二,如果查询执行于PARTITIONED模式缓存,那么执行流程如下:
查询会被解析然后拆分为多个映射查询以及一个汇总查询;
所有的映射查询都会在持有缓存数据的所有数据节点上执行;
所有的节点都会将本地执行的结果集提供给查询发起者(汇总节点),它会通过正确地合并结果集完成汇总的过程。
处理带有ORDER BY以及GROUP BY的结果集
带有ORDER BY语句的SQL查询不需要将所有结果集都加载到查询发起(汇总)节点来完成排序。而是查询映射的每个节点都会对自己那部分数据进行排序然后汇总节点以流的方式进行合并。
对于有序的GROUP BY查询也是同样的优化方式,不需要在将其返回给应用之前将所有数据加载到汇总节点用于分组。在Ignite中,来自单独节点的部分结果集可以被逐步地流化、合并、聚合以及返回给应用。
查询类型
在Java API层,通常有两种类型的SQL查询,分别为SqlQuery和SqlFieldsQuery(字段查询)。
替代APIs
Ignite内存SQL网格并不绑定到Java API,可以从.NET, C++通过 ODBC或者JDBC驱动连接到Ignite集群然后执行SQL查询。
可查询字段定义
在SqlQuery和SqlFieldsQuery中的指定字段可以被访问之前,他们需要在POJO层面加上注解,或者在QueryEntity中进行定义,以便SQL引擎可以感知到它们,后续章节还会详述。
配置
IgniteConfiguration
PersistentStoreConfiguration
MemoryConfiguration
CacheConfiguration
publicThreadPoolSize
systemThreadPoolSize
TcpDiscoverySpi
性能提示
禁用内部事件通知
调整缓存初始大小
关闭备份
调整堆外内存
禁用交换存储
调整退出策略
调整缓存数据再平衡
配置线程池
使用并置的计算
使用数据流处理器
批量处理消息
调整垃圾收集
不要在读时进行值复制
集群监控
REST API和 ignite visor
ignitevisorcmd.sh
一个ignite client 端程序
常用功能
Config 集群配置
Cache 集群内存使用情况
Node 节点使用情况
Top 集群总览
Ignite测试
开始时间 结束时间 耗时(毫秒) 记录数(条)
27996 28869 873 1345788
8255 9127 872 1426450
5896 7090 1194 2029511
18595 20213 1618 2662069
44747 47086 2339 3886353
18259 20690 2431 4178156
11652 14327 2675 4844281
8182 11278 3096 5399087
49666 53188 3522 6255529
47193 51324 4131 7246738
单线程写入速度:
时间 加载量(条)
2:03:18 1036206
2:11:05 2029511
2:26:47 3886353
2:35:14 4844281
平均加载效率 2000条/s