Hazelcast IMDG参考中文版手册-第三章-概述

Hazelcast是一个开源的内存数据网格(IMDG)。它提供弹性可扩展的分布式内存计算,被广泛认为是应用程序性能最快,最具扩展性的方法。Hazelcast在开源中做到这一点。更重要的是,Hazelcast通过提供来自Java的许多开发人员友好界面的分布式实现(如Map,Queue,ExecutorService,Lock和JCache),使分布式计算变得简单。例如,Map接口提供了一个In-Memory Key Value存储,它在开发人员友好性和开发人员工作效率方面赋予了NoSQL的许多优势。

除了在内存中分发数据外,Hazelcast还提供了一组方便的API来访问群集中的CPU,以实现最高的处理速度。Hazelcast设计轻巧,易于使用。由于Hazelcast是作为紧凑库(JAR)提供的,并且除了Java之外没有外部依赖性,因此它可以轻松插入您的软件解决方案并提供分布式数据结构和分布式计算实用程序。

Hazelcast具有高度可扩展性和可用性。分布式应用程序可以使用Hazelcast进行分布式缓存,同步,集群,处理,发布/发布消息等.Hazelcast是用Java实现的,具有Java,C / C ++,.NET,REST,Python,Go和Node.js的客户端。Hazelcast还讲Memcached协议。它插入Hibernate,可以很容易地与任何现有的数据库系统一起使用。

如果您正在寻找内存速度,弹性可扩展性以及NoSQL的开发人员友好性,Hazelcast是一个很好的选择。

Hazelcast很简单

Hazelcast是用Java编写的,没有其他依赖项。它从熟悉的Java util包中公开了相同的API,暴露了相同的接口。只需添加hazelcast.jar到类路径中,您就可以快速享受JVM集群并开始构建可伸缩的应用程序。

Hazelcast是Peer-to-Peer

与许多NoSQL解决方案不同,Hazelcast是点对点的。没有主人和奴隶; 没有单一的失败点。所有成员都存储相同数量的数据并进行相同数量的处理。您可以在现有应用程序中嵌入Hazelcast,也可以在客户端和服务器模式下使用它,其中您的应用程序是Hazelcast成员的客户端。

Hazelcast是可扩展的

Hazelcast旨在扩展到成千上万的成员。只需添加新成员,他们就会自动发现群集,并将线性增加内存和处理能力。成员之间保持TCP连接,并且所有通信都通过该层执行。

Hazelcast很快

Hazelcast将所有内容存储在内存中。它旨在执行非常快速的读取和更新。

Hazelcast是冗余的

Hazelcast将每个数据条目的备份保留在多个成员上。在成员发生故障时,数据将从备份中恢复,群集将继续运行而不会出现停机。

3.1。在Hazelcast中进行分片

Hazelcast碎片称为分区。默认情况下,Hazelcast有271个分区。给定一个密钥,我们使用分区数序列化,散列和修改它以找到密钥所属的分区。分区本身在群集成员之间平均分配。Hazelcast还创建了分区的备份,并在成员之间分配它们以实现冗余。

 

有关Hazelcast如何 对数据进行分区的详细信息,请参阅数据分区部分

3.2。Hazelcast拓扑

您可以通过两种方式部署Hazelcast群集:嵌入式或客户端/服务器。

如果您的应用程序的主要焦点是异步或高性能计算和大量任务执行,那么嵌入式部署是首选方式。在嵌入式部署中,成员包括应用程序和Hazelcast数据和服务。嵌入式部署的优势在于具有低延迟数据访问。

请参见下图。

嵌入式部署

在客户端/服务器部署中,Hazelcast数据和服务集中在一个或多个服务器成员中,应用程序通过客户端访问它们。您可以拥有一组可以独立创建和扩展的服务器成员。您的客户与这些成员进行通信,以获取Hazelcast数据和服务。

请参见下图。

客户端/服务器部署

Hazelcast提供本机客户端(Java,.NET和C ++),Memcache和REST客户端,Scala,Python和Node.js客户端实现。

客户端/服务器部署具有以下优势:包括更可预测和可靠的Hazelcast性能,更容易识别问题原因,最重要的是,更好的可扩展性。当您需要在此部署类型中进行扩展时,只需添加更多Hazelcast服务器成员。您可以单独解决客户端和服务器可伸缩性问题。

如果您希望在嵌入式部署中实现低延迟数据访问,并且还希望获得客户端/服务器部署的可伸缩性优势,则可以考虑为客户端定义近缓存。这使得常用数据可以保存在客户端的本地内存中。请参阅配置客户端近缓存部分

3.3。为何选择Hazelcast?

传统数据持久性概述

数据是软件系统的核心。在传统体系结构中,关系数据库持久存在并提供对数据的访问。应用程序直接与数据库交谈,数据库的备份是另一台机器。为了提高性能,需要调整或更快的机器。这可能需要花费大量金钱或精力。

还有一种想法是在数据库旁边保留数据副本,这是使用外部键值存储或辅助卸载数据库的二级缓存等技术执行的。但是,当数据库饱和或应用程序主要执行“put”操作(写入)时,这种方法没有用,因为它只将数据库与“get”加载(读取)隔离开来。即使应用程序是读密集型的,也存在一致性问题 - 当数据发生变化时,缓存会发生什么,以及如何处理变更?这就是生存时间(TTL)或直写等概念。

在TTL的情况下,如果访问频率低于TTL,则结果将始终是缓存未命中。另一方面,在直写高速缓存的情况下,如果群集中有多个这样的高速缓存,我们将再次出现一致性问题。这可以通过使节点彼此通信以便可以传播入口无效来避免。

我们可以得出结论,理想的缓存将结合TTL和直写功能。此字段中有多个缓存服务器和内存数据库解决方案。但是,这些是具有分布机制的独立单个实例,其在一定程度上由其他技术提供。所以,我们又回到了原点; 如果产品是单个实例或者分发不提供一致性,我们会遇到饱和或容量问题。

还有Hazelcast

Hazelcast是一种全新的数据方法,是围绕分发概念设计的。Hazelcast在集群周围共享数据,以实现灵活性和性能。它是用于群集和高度可扩展数据分发的内存数据网格。

Hazelcast的一个主要特点是它没有主成员。每个集群成员在功能方面配置相同。最旧的成员(在集群中创建的第一个成员)自动执行对集群成员的数据分配。如果最老的成员死亡,则第二个最老的成员接管。

  您可以在本手册的某些部分中遇到术语“主”或“主成员”。它们用于上下文澄清目的; 请记住,他们指的是上面解释的“最老的成员”。

Hazelcast的另一个主要特征是数据完全保存在内存中。这很快。在发生故障(例如成员崩溃)的情况下,由于Hazelcast在所有集群成员之间分发数据副本,因此不会丢失任何数据。

如“ 分布式数据结构”一章中的功能列表所示,Hazelcast支持许多分布式数据结构和分布式计算实用程序。这些提供了访问分布式集群内存和访问CPU以实现真正分布式计算的强大方法。

Hazelcast的独特优势

  • Hazelcast是开源的。

  • Hazelcast只是一个JAR文件。您不需要安装软件。

  • Hazelcast是一个图书馆,它没有对Hazelcast用户施加架构。

  • Hazelcast提供开箱即用的分布式数据结构,例如Map,Queue,MultiMap,Topic,Lock和Executor。

  • 没有“主人”,这意味着Hazelcast集群中没有单点故障; 群集中的每个成员都配置为功能相同。

  • 当您的内存大小和计算需求增加时,可以将新成员动态加入Hazelcast群集以进行弹性扩展。

  • 数据对成员故障具有弹性。数据备份分布在群集中。当群集中的成员崩溃时,这是一个很大的好处,因为数据不会丢失。

  • 与传统的键值缓存解决方案不同,成员始终彼此了解。

  • 如果您对提供的数据结构不满意,可以使用服务编程接口(SPI)构建自己的自定义分布式数据结构。

最后,Hazelcast拥有一个充满活力的开源社区,使其能够不断发展。

Hazelcast适合您需要:

  • 需要通过分区数据进行大数据处理的分析应用程序。

  • 保留网格中经常访问的数据。

  • 缓存,特别是具有弹性分布式可伸缩性的开源JCache提供程序。

  • 适用于具有最高性能,可扩展性和低延迟要求的应用程序的主数据存储。

  • 内存中的NoSQL密钥值存储。

  • 以最快的速度发布/订阅通信以及应用程序之间的可伸缩性。

  • 需要在分布式和云环境中弹性扩展的应用程序。

  • 应用程序的高可用分布式缓存。

  • Coherence和Terracotta的替代品。

3.4。数据分区

正如您在Shazel in Hazelcast部分中所读到的那样,Hazelcast分片称为分区。分区是内存段,每个内存段可以包含数百或数千个数据条目,具体取决于系统的内存容量。每个Hazelcast分区可以有多个副本,这些副本分布在集群成员中。其中一个副本成为primary其他复制品backupsprimary调用拥有分区副本的集群成员partition owner。当您读取或写入特定数据条目时,您将透明地与包含数据条目的分区的所有者通信。

默认情况下,Hazelcast提供271个分区。当您启动具有单个成员的集群时,它拥有所有271个分区(即,它保留271个分区的主副本)。下图显示了具有单个成员的Hazelcast群集中的分区。

具有分区的单个成员

当您在该群集上启动第二个成员(创建具有两个成员的Hazelcast群集)时,分区副本将按照此处的插图所示进行分发。

  为简单起见和出于描述目的,示出了以下图示中的分区分布。通常,分区不按任何顺序分布,因为它们在这些图示中显示,但是随机分布(它们不必按顺序分配给每个成员)。这里重要的一点是,Hazelcast在成员之间平均分配分区初选及其备份副本。

具有两个成员的群集 - 创建备份

在图示中,具有黑色文本的分区副本是原色,具有蓝色文本的分区副本是备份。第一个成员具有135个分区(黑色)的主副本,并且每个分区都在第二个成员中备份(即,第二个成员拥有备份副本)(蓝色)。同时,第一个成员还具有第二个成员的主分区副本的备份副本。

随着您添加更多成员,Hazelcast将一些主要和备份分区副本逐个移动到新成员,使所有成员相等且冗余。由于采用了一致的散列算法,因此只需移动最少量的分区即可扩展Hazelcast。以下是具有四个成员的Hazelcast群集中的分区副本分发的说明。

有四个成员的集群

Hazelcast在群集成员之间平均分配分区的主副本和备份副本。保留分区的备份副本以实现冗余。

  您的数据可以在分区初选和备份上具有多个副本,具体取决于您的备份计数。请参阅备份地图部分

从Hazelcast 3.6开始,介绍了Lite成员。Lite成员是不拥有任何分区的新类型成员。Lite成员旨在用于计算量大的任务执行和监听器注册。虽然它们不拥有任何分区,但它们可以访问群集中其他成员拥有的分区。

  请参阅启用Lite成员部分

3.4.1。如何分区数据

Hazelcast使用散列算法将数据条目分发到分区中。给定对象键(例如,对于地图)或对象名称(例如,对于主题或列表):

  • 密钥或名称被序列化(转换为字节数组),

  • 这个字节数组是哈希的,并且

  • 散列的结果是由分区数量修改的。

此模数的结果 - MOD(散列结果,分区计数) - 是存储数据的分区,即分区ID。对于群集中的所有成员,给定密钥的分区ID将始终相同。

3.4.2。分区表

启动成员时,会在其中创建分区表。此表存储分区ID及其所属的集群成员。此表的目的是使集群中的所有成员(包括lite成员)都能够识别此信息,确保每个成员都知道数据的位置。

群集中最早的成员(首先启动的成员)会定期将分区表发送给所有成员。这样,群集中的每个成员都会收到有关分区所有权的任何更改的通知。例如,当新成员加入群集或成员离开群集时,可能会更改所有权。

  如果群集中最旧的成员发生故障,则下一个最旧的成员会将分区表信息发送给其他成员。

您可以使用hazelcast.partition.table.send.interval系统属性配置成员向分区表发送信息的频率(频率)。默认情况下,该属性设置为每15秒。

3.4.3。重新分区

重新分区是重新分配分区所有权的过程。Hazelcast在以下情况下执行重新分区:

  • 成员加入群集时。

  • 成员离开集群时。

在这些情况下,最旧成员中的分区表将使用新的分区所有权进行更新。请注意,如果lite成员加入或离开集群,则不会触发重新分区,因为lite成员不拥有任何分区。

3.5。用例

可以使用Hazelcast:

  • 共享服务器配置/信息以查看群集的执行情况。

  • 使用事件通知(例如,基于用户的事件)来集群高度变化的数据,以及排队和分发后台任务。

  • 作为一个简单的Memcache与近缓存。

  • 作为需要在某些成员上执行的某些进程的云端调度程序。

  • 在OSGI环境下的不同安装中,与多个成员一起共享信息(用户信息,队列,地图等)。

  • 在群集中共享数千个密钥,其中应用程序服务器上有Web服务接口并进行一些验证。

  • 作为分布式主题(发布/订阅服务器),为智能手机构建可扩展的聊天服务器。

  • 作为Cassandra后端的前层。

  • 在集群中分发用户对象状态,在对象之间传递消息,以及共享系统数据结构(静态初始化状态,镜像对象,对象标识生成器)。

  • 作为多租户缓存,每个租户都有自己的地图。

  • 共享数据集,例如,类似于表的数据结构,供应用程序使用。

  • 从使用Spring框架开发前端的Amazon EC2服务器分发负载和收集状态。

  • 作为性能检测的实时流光。

  • 作为Web应用程序中会话数据的存储(实现Web应用程序的水平可伸缩性)。

3.6。资源

猜你喜欢

转载自blog.csdn.net/javacodekit/article/details/81412463