1 Ignite使用场景
1.1 Ignite是什么?
Ignite官网给出的定义:
Apache Ignite is a best distributed database management system for high-performance computing with in-memory speed。
Apache Ignite是一个优秀的分布式内存数据库,可用于内存速度的高性能计算。
简述
Apache Ignite 内存数据组织框架是一个高性能、集成化和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不同的数据源之间提供高性能、分布式内存中数据组织管理的功能。
1.2 Ignite关键特性
Ignite体系结构具有足够的灵活性和高级特性,可用于大量不同的体系结构模式和风格。您可以将Ignite看作是一组独立的、集成良好的内存中组件的集合,以提高应用程序的性能和可伸缩性。下面的示意图表示Apache Ignite的基本功能:
Ignite是以模块化的方式进行组织,并为每个功能提供一个jar(库)。您只需将所需的库应用到项目中,就可以使用Ignite。
1.2.1 集群和水平扩展
服务端节点是集群的主体,它们存储数据、执行计算任务等。客户端节点作为常规节点加入拓扑,但不存储数据。客户端节点用于将数据流传输到集群中并执行用户查询。
此种架构意味着
- 计算和存储(内存,磁盘)可以突破单机性能瓶颈,扩展服务能力;
- 通过增加节点的方式,水平的增加系统的能力(并发,存储,计算等);
1.2.2 内存管理
Ignite内存架构通过可以同时在内存和磁盘上存储和处理数据及索引,得到了支持磁盘持久化的内存级性能。
多层存储的运行方式类似于操作系统(例如Linux)的虚拟内存。但是这两种类型架构之间的主要区别是,多层存储始终将磁盘视为数据的超集(如果启用了持久化),在故障或者重启后仍然可以保留数据,而传统的虚拟内存仅将磁盘作为交换扩展,一旦进程停止,数据就会被清除。
分区与关联并置
关联并置
分区通过将读写操作分布式化来提高性能。此外还可以设计数据模型,以使同一类数据条目存储在一起(即存储在一个分区中)。当请求该数据时,仅扫描少量分区,这种技术称为关联并置。
分区/复制模式
分区模式
在这种模式下,所有分区在所有服务端节点间平均分配。此模式是可扩展性最高的分布式缓存模式,可以在所有节点上的总内存(RAM和磁盘)中存储尽可能多的数据,实际上节点越多,可以存储的数据就越多。
复制模式
在REPLICATED模式下,所有数据(每个分区)都将复制到集群中的每个节点。由于每个节点上都有完整的数据,此缓存模式提供了最大的数据可用性。但是每次数据更新都必须传播到所有其他节点,这可能会影响性能和可扩展性。
提示
当数据集较小且不经常更新时,复制缓存非常理想。
备份分区
Ignite默认会保存每个分区的单个副本(整个数据集的单个副本)。这时如果一个或多个节点故障,存储在这些节点上的分区将无法访问,为避免这种情况,Ignite可以配置为每个分区维护备份副本。
分区映射交换
分区映射交换(PME)是共享整个集群分区分布(分区映射)的信息的过程,以便每个节点都知道在哪里寻找某个键。无论是应用户请求还是由于故障,每当缓存的分区分配发生更改时(例如新节点加入拓扑或旧节点离开拓扑)都需要PME。
包括但不限于会触发PME的事件:
- 一个新节点加入/离开拓扑;
- 新的缓存开始/停止;
- 创建索引。
外部存储
Ignite可以做为已有数据库之上的一个缓存层,包括RDBMS或者NoSQL数据库,比如Apache Cassandra或者MongoDB等,该场景通过内存计算来对底层数据库进行加速。
Ignite可以与Apache Cassandra直接集成,但是暂时还不支持其他NoSQL数据库,但是开发自己的CacheStore接口实现。
使用外部存储的两个主要场景是:
- 作为已有数据库的缓存层,这时可以通过将数据加载到内存来优化处理速度,还可以为不支持SQL的数据库带来SQL支持能力(数据全部加载到内存);
- 希望将数据持久化到外部数据库
1.2.3 Java和sql能力
Java
Ignite可用于Java、.NET/C#和C++。Java版本提供了最丰富的API,.NET/C#和C++版本的功能有限
SQL
Ignite是一个兼容于ANSI-99、可水平扩展和容错的分布式SQL数据库
作为SQL数据库,Ignite支持所有DML命令,包括SELECT、UPDATE、INSERT和DELETE语句,并且还实现了与分布式系统相关的DDL命令的子集。
索引
Ignite会自动为每个缓存的主键和关联键字段创建索引,当在值对象的字段上创建索引时,Ignite会创建一个由索引字段和主键字段组成的组合索引。在SQL的角度,该索引由2列组成:索引列和主键列。
事务
事务可以将多个缓存操作,可能对应一个或者多个键,组合为一个单个原子事务,这些操作在没有任何其他交叉操作的情况下执行,或全部成功或全部失败,没有部分成功的状态。
客户端事务
瘦客户端 | Apache Ignite - 分布式内存数据库
SQL事务:(不建议使用)
SQL参考 | Apache Ignite - 分布式内存数据库
1.2.4 易用性
安装部署简单,可通过xml文件解析部署,可集成到自身应用部署
文档完善:前言 | Apache Ignite - 分布式内存数据库
支持各种语言 java,sql,c++,rest等
1.2.5 轻量
依赖轻量:不依赖其它组件即可集群组网
使用轻量:对于jdbc体系架构,不需要额外改造,直接jdbc,java,rest client对接使用。
资源轻量:资源根据计算和数据存储大小动态调整,没有最小资源限制。小到百兆级别,达到PB级别。
1.2.6 其它特性
分布式计算mapReduce:在集群范围以容错和负载平衡的方式执行分布式计算
通读,通写,异步落库:与rdms传统数据库结合
Ignite持续查询:持续查询可以监控缓存中数据的变化,启动后就会收到符合查询条件的数据变化的通知。
Ignite 消息:消息中间件
Ignite 服务:微服务
分布式锁,事件处理CEP,流处理,spark加速,kafka集成,mybatis结合,spring集成等等
1.3 Ignite使用场景
1.3.1 关系型数据库缓存
Ignite集群可以作为关系型数据库(非关系型也支持)的缓存层,提供分布式内存数据存储以及基于缓存数据计算,可支持api和sql方式分析计算,并提供分布式mapreduce计算接口。
1.3.2 追求高性能/高吞吐量和线性扩展能力
此应用场景是针对于传统关系型数据库在数据量或者计算量达到服务器单机性能瓶颈的场景下,Ignite可以提供通过部署分布式集群的方式,把数据存储、内存、cpu、网络等扩展到多台服务器,从能达到线性扩展能力,并提供服务吞吐量和性能。
1.3.3 分布式内存数据库
Ignite启用原生持久化后可作为分布式内存数据库使用,提供SQL能力的DDL,DML,DQL能力,并提供一定的事务能力。此应用场景可以替代现有的存储组件和计算组件,使用ignite作为数据的存储组件,计算、分析可以使用ignite api接口和sql能力。
1.3.4 大规模并行计算平台
Ignite可以扩展到上千个节点,保存PB级的数据。提供分区表,关联并置,索引,分布式计算接口等能力,可以满足大规模的数据并行计算。
1.3.5 数据集成中心
Ignite分布式缓存的能力,可以作为数据集成中心,把异构数据源数据统一汇聚到Ignite,然后利用Ignite api和sql进行数据转换处理,然后再通过Ignite作为中介迁移或者持久化到其它数据源中。
1.3.6 spark计算加速
Ignite作为一个分布式的内存数据库,对于Spark用户可以实现如下的功能:
• 获得真正的可扩展的内存级性能,避免数据源和Spark工作节点和应用之间的数据移动;
• 提升DataFrame和SQL的性能;
• 在Spark作业之间更容易地共享状态和数据。
1.3.7 机器学习,微服务,消息中间件等引用场景
机器学习
IgniteML(机器学习)是一组简单的、可扩展以及高效的工具,在不需要成本高昂的数据转换的前提下,就可以构建可预测的机器学习模型。
算法和适用领域
分类
根据训练的数据集,对标的的种类进行标识。
适用领域:垃圾邮件检测、图像识别、信用评分、疾病识别。
算法:逻辑回归、线性SVM(支持向量机)、k-NN分类、朴素贝叶斯、决策树、随机森林、多层感知、梯度提升、近似最近邻。
回归
对因变量(y)与一个或多个解释变量(或自变量)(x)之间的关系进行建模。
适用领域:药物反应,股票价格,超市收入。
算法:线性回归、决策树回归、k-NN回归。
聚类
对对象进行分组的方式,即在同一个组(叫做簇)中的对象(某种意义上)比其它组(簇)中的对象更相似。
适用领域:客户细分、实验结果分组、购物项目分组。
算法:K均值聚类、高斯混合(GMM)
推荐
建立推荐系统,它是信息过滤系统的子类,旨在预测用户对项目的“评价”或“偏好”。
适用领域:用于视频和音乐服务的播放列表生成器,用于服务的产品推荐器。
算法:矩阵分解。
预处理
特征提取和归一化。
适用领域:对比如文本这样的输入数据进行转换,以便用于机器学习算法,然后提取需要拟合的特征,对数据进行归一化。
算法:IgniteML支持在分区化的数据集之上自定义预处理器,同时也有默认的预处理器,比如归一化预处理器、独热编码、离差标准化等。
微服务
Ignite服务是可以部署到Ignite集群并执行某个操作的一部分功能,在一个或多个节点上可以有一个服务的多个实例。
Ignite服务具有以下功能:
负载均衡
除了单例服务部署之外,Ignite都会自动确保在集群内的每个节点上部署大约相同数量的服务。当集群拓扑发生变化时,Ignite会重新评估服务的部署,并可能将已经部署的服务重新部署到另一个节点,以实现更好的负载平衡。
容错
Ignite会保证服务的持续可用性,即使发生拓扑变更或者节点故障,都会根据指定的配置进行部署。
热部署
可以使用Ignite的DeploymentSpi配置来重新部署服务,而无需重启集群,具体请参见重新部署服务。
消息中间件
Ignite分布式消息可以在集群内的所有节点间进行基于主题的通信,带有某个消息主题的消息可以分布到订阅了该主题的所有节点或者节点的子集。
Ignite消息基于发布-订阅范式,发布者和订阅者通过一个通用的主题连接在一起。当一个节点针对主题T发布了一个消息A,它会被分布到所有订阅了主题T的节点。
2 Ignite使用分析
2.1 Ignite使用场景分析
通过对ignite核心特性和使用场景来看,其核心优势在于内存、分布式、内存管理,易用性,并行计算等方面;展开如下列表:
核心优势点 | 优势体现 | 说明 | |
1 | 内存 | 1、内存性能通常优于磁盘 | |
2 | 分布式 | 1、集群、水平扩展能力 2、不受单机软硬件约束 3、数据量不受限制 | |
3 | 内存管理 |
| |
4 | 易用性 |
| |
5 | 并行计算 | mapreduce接口(可定义编排分布式并发任务) | |
因此,如下一些场景,使用ignite可以解决业务痛点问题:
- 系统性能存在瓶颈,可以通过数据存放内存提高性能的场景; (缓存)
- 单机存在瓶颈(存储,计算),可通过多节点资源(内存,cpu)提高的场景;(高性能/高吞吐、线性扩展能力)
- 数据量大,现有系统无法完成计算,可以分布式计算和分区内存存储解决的场景;(大规模并行计算)
- 关联计算场景,数据量较大,满足关联计算场景,可通过ignite提高计算性能的场景;
- 异构数据源,支持多种数据库场景:(数据集成中心/统一引擎接口层等)