- Apache Ignite是一个开源的分布式数据库、缓存和处理平台,它以内存速度处理数PB的数据。
- 它提供容错、集群范围内的发布/订阅消息传递、在出现故障时动态重新平衡集群、内存文件系统、数据网格、数据库、流分析。它可以用来解决可伸缩性和性能问题。
- 在Cazton,我们通过Apache Ignite最佳实践、开发、性能调整、咨询、招聘服务和实践培训服务,帮助财富500强的大中型公司。
内存计算平台
在内存中缩放数据时会遇到问题吗?您是否面临处理时间缓慢的问题?您想要可伸缩性和原子事务吗?你的机器学习模型需要大量的培训和生产时间吗?您在分布式计算环境中寻找SQLACID事务吗?最近,Ignite在生产中完美地处理了2.5 TB。
等等,这是解决办法。ApacheIgnite是一个开源的分布式数据库、缓存和处理平台,它以内存速度处理数TB的数据。Ignite和经典分布式缓存的区别在于,除了键值对之外,Ignite还可以运行分布式SQL查询来连接和分组各种数据集。即使使用分布式SQL查询,我们也可以在共享或统一内存层的帮助下执行多记录和跨缓存ACID事务。Apache Ignite提供的其他一些功能包括:
- 具有容错性并支持完整的ACID事务。
- 使用发布/订阅(publish/subscribe,pub/sub)集群范围的消息传递,这是一种异步服务对服务通信的形式,用于无服务器和微服务体系结构。
- 发生故障时集群的动态再平衡。
- 内存文件系统、数据网格、数据库、流式分析以及用于机器和深度学习的连续学习框架。
- 内存中的事件驱动体系结构。
- 帮助解决可扩展性和高性能问题,支持提高实时性能。
- 插件NOSQL,MongoDb数据库。
- 支持大数据、机器学习
Apache Ignite可用作:
1. 内存缓存:支持key-value和ANSI-SQL,低延迟,高性能内存缓存。它可以部署为:
- Cache-aside部署:当缓存是静态的并且没有太多更新时非常有用。缓存从主数据存储部署,应用程序负责主数据存储中的数据同步和缓存中的复制。
- Read-Through/Write-Through Caching:对于希望跨许多断开连接的数据源创建共享缓存层或加速现有基于磁盘的数据库的体系结构非常有用。这种策略是一种内存中的数据网格部署,应用程序通过读写来Ignite,反过来Ignite确保所有底层外部数据保持一致,并与内存中的数据一起更新。
2. 内存数据网格:用于读/写直通缓存部署。它可以纯粹在内存中使用,也可以与本机持久性一起使用。它可以在RDBMS、Hadoop和其他数据源之上使用,通过在应用程序层和数据库层之间滑动作为内存中的数据网格,获得100倍的加速。
3. 内存数据库:它用于分布式多层存储,可跨RAM、NVRAM、闪存和磁盘进行扩展。Ignite可以在磁盘上完全运行,而无需从内存层预加载。它采用同位处理,通过在分布式数据上使用带连接的SQL来减少网络流量。每个Ignite服务器节点在引导阶段分配内存区域,将它们拆分为页,并在这些页中保留带有索引的数据记录。此外,可以在需要时禁用磁盘持久性,然后它将充当纯内存数据库。
Ignite还通过支持大规模和高通量体系结构,充当数字集成中心。这避免了后端数据库和前端API服务之间的复杂集成。它可以支持Ignite群集和使用Kakfa、Spark或Debezium的外部存储数据库之间的单向和双向同步。
它提供了数据网格功能—在内存中分区和缓存数据的功能。每个缓存代表数据库的一个实体,可以被分割成一组固定的分区,这些分区均匀分布在集群节点之间。总有一个主分区,可以有零个或多个备份副本分区。
Ignite是100%符合JCache(JSR 107)的内存数据网格,包括基本的缓存获取/输出操作、并发映射API、入口处理器和缓存拦截器API、事件和度量。对于需要以微秒为单位的一致响应时间的应用程序,Ignite的“近缓存”可用于在应用程序端存储最常用的数据。它会自动失效并更新近缓存。一旦对记录的主副本进行了更改,Ignite将立即将更改传播到所有节点。这包括存储备份的节点以及将记录副本存储在近缓存中的应用程序。
Ignite的数据库组件以这样一种方式水平扩展:集群中的每个节点使用哈希函数持有一部分键值对。当从集群中添加/删除节点时,会自动重新平衡数据,以分散工作负载并实现均匀的数据分布。
集群的节点分为:
- 服务器/数据节点:它们充当集群的存储和计算单元,并处理传入的请求。它们存储数据和索引,并负责计算。
- 客户端节点:它们通常使用爪哇、C或C++中的本地库嵌入应用程序代码中。对于其他语言和工具,Ignite提供了通过ODBC、JDBC和REST驱动程序公开的sqlapi来处理数据库。它们充当应用程序或服务与分布式数据库之间的连接,用于共同定位的SQL连接或任何其他复杂计算。
位于同一位置的联接(基本上是在分区列上联接的表)避免了节点之间的数据洗牌,并最小化了网络使用,因为计算是在集群节点的本地数据集上完成的。为了使用同一位置处理,数据集通过将相关记录存储在相同的集群节点上(称为相似性同一位置)来实现同一位置。应用程序将执行查询,Ignite将自动从内存和磁盘获取记录。在集群重启的情况下,Ignite将从磁盘读取数据和索引,从而避免任何潜在的停机时间。
Apache Ignite完全是内存模型吗?
Apache Ignite的内存体系结构由两个存储层组成,即“持久内存”——内存层和磁盘层。它完全可以从内存层操作,但它也可以将数据存储在磁盘上,因此使其持久耐用。如果数据很大,那么内存层根据容量缓存同样多的数据。例如,如果数据库中有100个条目,内存层的容量是40,那么100个条目存储在磁盘中,只有40个条目被缓存。如果缓存未命中,ignite会自动从磁盘读取缓存,而不管API是什么,也不管您使用的是SQL、键值还是扫描查询。
它使用Unix的虚拟内存模型,通过分页进行内存空间管理和数据引用。但是,这里对整个数据集的索引存储在磁盘上(假设磁盘层已启用),而不是仅当磁盘内存不足时才将它们存储在磁盘上(用于交换)。
点火是否可以与ACID兼容,同时遵循CAP定理?
简短的回答是“不”。由于Ignite是分布式系统,CAP定理确实适用。长答案取决于使用它的上下文。使用传统ACID属性(如RDBMS)设计的数据库系统选择一致性而不是可用性,而围绕基本理念设计的系统(NoSQL运动中很常见)选择可用性而不是一致性。根据CAP(一致性、可用性和分区容差)定理,在分区时,必须在一致性和可用性之间进行选择。
在事务模式下,您可以获得与完全符合ACID的事务的一致性。另一方面,在原子模式下,您可以从速度和可用性中获益。有趣的是,我们可以在您的应用程序中混合这两种模式,方法是使用一些ACID批集,然后使用一些原子突变。
它如何支持ACID性质?
Ignite支持所有DML命令,包括SELECT、UPDATE、INSERT和DELETE查询,以及与分布式系统相关的DDL命令子集。它支持主索引和次索引,尽管唯一性只在主索引上强制执行。但是,它不支持外键约束,这主要是为了避免将消息广播到每个集群进行更新(这样做可能会影响性能和可伸缩性)。
所有事务都是ACID兼容的,并且跨越多个集群节点和“内存”和“磁盘”层的缓存。这要求事务引擎具有一些处理失败事务中的数据的功能,以避免在集群中造成不一致。对于这些分布式系统,它使用两阶段提交(2PC)协议来确保ACID属性。两阶段提交由提交请求阶段(或投票阶段)组成,在该阶段中,它投票提交或中止事务;第二阶段是提交阶段,在该阶段中,它根据前一阶段中完成的投票决定其操作。因此,Ignite将事务保存在本地事务映射中,直到它们被提交,然后将数据传输到参与的远程节点。
在Ignite中是否需要使用2PC协议?
不,用户可以将系统配置为放宽两阶段提交协议,并享受“最终一致”解决方案的所有性能。配置数据库的完整事务行为或放弃某些性能一致性的能力使其更加灵活。
Ignite支持以下ACID保证:
- 提交的事务总是在失败后生存。
- 群集始终可以恢复到最新提交的事务。
它使用预写日志(write-ahead logging,WAL)技术将更改存储在数据库中,在将更改写入数据库之前,这些更改首先存储在稳定存储的日志中。现在,“检查点进程”将更改的(脏的)页面复制到分区文件中。WAL的目的是以最快的方式将更新传播到磁盘,并提供一种支持全集群故障的机制。随着WAL的增长,它会定期检查主存储。
Ignite是纯内存数据库还是持久数据库?
嗯,两者都有,可以根据需要开关。Ignite的本机持久性功能用作键值存储设置时,会将数据缓存在内存中并将其持久化到磁盘,而不是将其写入外部数据库。此功能使它可以跳过缓存预热步骤,也可以跳过从外部数据库重新加载数据的阶段。此外,该功能始终在磁盘上保留数据的副本,以便您可以随时缓存记录的子集。如果使用本机持久性,并且集群或单个节点在事务处理过程中停机,则可以确保数据一致性。本机持久性使用预写日志记录(WAL),它确保所有更改在持久化到磁盘之前都写入日志。
Apache Ignite支持数据预处理和模型质量估计,并使用本机实现的经典训练算法,如线性回归、决策树、随机林、梯度增强、支持向量机、K-均值等。它还集成了TensorFlow,允许在使用存储在单个或分布式节点上的数据的同时训练神经网络。它使用MapReduce方法来执行分布式训练和即时推断,避免了节点故障和数据重新平衡。
它能处理大数据并应用机器学习吗?
是的,两者都可以。机器学习需要在网络上进行大量的数据移动,由于数据的不断移动和横向可伸缩性的缺乏,数据科学家们经常受到困扰。首先,他们必须将数据提取到apachemahout或apachespark这样的系统中,以便进行培训。整个过程涉及移动数兆字节的数据,可以显著增加计算时间。其次,可以使用apachespark和TensorFlow来训练大型数据集,但这只是问题的一部分。他们也必须在生产中部署模型。
Ignite的多层存储解决了这两个问题。它允许用户直接在Ignite集群中存储在内存和磁盘上的数据上运行机器学习模型训练和推理。使用内部优化的算法进行同一位置的分布式处理,它们在运行时提供内存速度和无限的水平扩展。通过这种方式,它可以实现持续学习,从而实时改进决策。所有的学习过程都是容错的,这意味着当一个节点发生故障时,学习过程不会被中断,我们将得到与所有节点都启动并运行时类似的结果。
它可以部署在云服务(如AWS、Microsoft Azure或Google Compute engine)或容器化环境(如Docker、Kubernetes、VMWare、Apache Mesos)上
Apache Ignite与Redis比较
Redis | Apache Ignite |
用于通过使用内存中的键值对提高应用程序性能。使用的不仅仅是缓存。 | 它可以在应用程序层和数据层之间滑动,而无需重写任何代码。 |
关系数据需要映射到另一个模型 | 用Apache驱动程序替换ODBC/JDBC驱动程序,并且可以作为SQL的接口来支持ACID事务 |
用作应用程序数据的键值存储 | 用作内存中分布式SQL数据库的键值存储不止一个。持久性存储可用于将数据的子集保存在内存中。在重新启动时提供即时可用性,而无需等待数据先加载到内存中 |
C语言实现 | 在C++、java和.NET中实现 |
乐观锁定(在提交事务之前检查记录是否已由其他人更新) | 乐观锁定和悲观锁定(采用独占锁定,以便其他人无法开始修改记录) |
原文地址:https://cazton.com/consulting/database-development/apache-ignite
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2182.html
暂无评论