Hazelcast IMDG 概览
数新网络,让每个人享受数据的价值
一、简介
Hazelcast IMDG(in-memory data grid)是开源的、分布式高可用的、开箱即用的、云原生的内存数据网格,可用作开箱即用的数据和计算平台,或用作自己的云原生应用程序和微服务的框架。
支持的编程语言:Java Member/ Client,C#,C++,Node.js,Python,Go。(备注:除 Java 其他仅支持 Client 方式)
特性:
简单:内置群集和发现功能。只需启动一个新成员,它就会加入集群,集群将自动重新平衡数据。每个成员处理一部分主数据和备份数据。Hazelcast 集群可以在任何支持 JVM 的地方运行。
强大:Hazelcast 可以在您添加成员时水平缩放,也可以利用所有可用内存垂直缩放。
灵活:Hazelcast 集群可以通过启动更多成员进程来增加容量。您可以在集群运行时添加成员,从而实现零停机时间。集群会自动重新平衡数据,以确保每个成员中的内存均匀使用。
可靠:Hazelcast 通过在集群中的其他成员上存储副本来确保数据安全。集群的每个成员都负责一部分主条目和副本条目。没有主进程或副本进程的概念。Hazelcast 可以智能地将副本放置在最安全的成员,另一台物理机器上,甚至是另一个机架上。
二、整体架构
您可以在以下架构图中看到所有 Hazelcast IMDG 版本的功能。
要获得 Hazelcast IMDG 更多详情可以查看白皮书:
An Architect's View of the Hazelcast Platform | Hazelcast
三、部署拓扑图
Hazelcast 集群可通过两种方式部署:嵌入式或客户端/服务器。
1、嵌入式部署:低延时更好,仅支持 Java
如果您的应用程序的主要焦点是异步或高性能计算以及大量任务执行,那么嵌入式部署是首选方式。在嵌入式部署中,成员包括应用程序和 Hazelcast 数据和服务。嵌入式部署的优点是具有低延迟的数据访问。请参见下图:
2、服务端部署:扩容较简单,可支持多种编程语言
在客户端/服务器部署中,Hazelcast 数据和服务集中在一个或多个服务器成员中,应用程序通过客户端访问它们。您可以拥有可独立创建和扩展的服务器成员集群。您的客户与这些成员进行通信,以访问他们的 Hazelcast 数据和服务。请参见下图。
(服务端部署模式跟嵌入模式还有一点不同,因为 HazelcastClient 仅仅是一个 Jet 任务提交工具,因此客户端的本地 java 类就算实现了序列化也没法传输到 server 端,除非事先在 server 的某个 lib 目录用 jar 引入了它们。)
Hazelcast 提供本地客户端(Java,.NET 和 C++),Memcache 和 REST 客户端,Python 和 Node.js 客户端实现。
客户端/服务器部署具有优势,包括更可预测和可靠的 Hazelcast 性能、更容易识别问题原因以及最重要的是更好的可扩展性。当您需要扩展此部署类型时,只需添加更多 Hazelcast 服务器成员即可。您可以分别解决客户端和服务器可伸缩性问题。
注意:Hazelcast 成员库仅在 Java 中可用。因此,将成员嵌入到业务服务中,只有使用 Java 才能实现。用其他语言(.NET、C++、Node.js 等)编写的应用程序可以使用 Hazelcast 客户端库来访问群集。有关客户端和其他语言实现的信息,请参阅 Hazelcast Clients一章。
如果需要低延迟数据访问(如嵌入式部署),并且还需要客户端/服务器部署的可伸缩性优势,则可以考虑为客户端定义近缓存。这使常用数据能够保存在客户端的本地内存中。请参阅Java Client。
四、数据分区
Hazelcast IMDG 中的内存段称为分区。分区的大小,即它们可以存储的数据条目量,受系统的物理容量限制。
分区在集群成员之间平均分布。Hazelcast 还创建这些分区的备份,这些备份也分布在集群中。
默认情况下,Hazelcast 为每个分区创建一个副本。也可以配置 Hazelcast 使每个分区可以有多个副本。其中一个副本称为“主副本”,其他副本称为“备份”。拥有分区“主”副本的集群成员称为“分区所有者”。读取或写入特定数据条目时,可以透明地与包含该数据条目的分区所有者通信。
默认情况下,Hazelcast 提供 271 个分区。当启动具有单个成员的集群时,它拥有所有 271 个分区(即它持有 271 个分区的主副本)。下图显示了具有单个成员的 Hazelcast 集群中的分区。
当您在该集群上启动第二个成员(创建具有两个成员的 Hazelcast 集群)时,将按此处的图示所示分发分区副本。
注意:下图中的分区分布是为了简单起见和描述目的而显示的。通常,分区不会按任何顺序分布(如这些图所示),而是随机分布(它们不必按顺序分布到每个成员)。这里重要的一点是,Hazelcast 在成员之间平均分配分区主节点及其备份副本。
在图中,带有黑色文本的分区副本是主副本,带有蓝色文本的分区副本是备份。第一个成员具有 135 个分区(黑色)的主副本,每个分区都在第二个成员中备份(即,第二个成员拥有备份副本)(蓝色)。同时,第一个成员还具有第二个成员的主分区副本的备份副本。
当添加更多成员时,Hazelcast 会将一些主分区副本和备份分区副本逐个移动到新成员,从而使所有成员相等且冗余。由于一致的哈希算法,仅移动最少数量的分区来横向扩展 Hazelcast。下图显示了具有四个成员的 Hazelcast 集群中的分区副本分布。
注意:您的数据可以在分区主和备份上具有多个副本,具体取决于备份计数。请参阅Map部分。
Hazelcast 还提供精简成员。这些成员不拥有任何分区。Lite 成员旨在用于计算量大的任务执行和监听器注册。尽管它们不拥有任何分区,但它们可以访问群集中其他成员拥有的分区。详情参阅Cluster Utilities。
如何对数据分区
Hazelcast 使用哈希算法将数据条目分发到分区中。给定一个对象键(例如,对于 map )或对象名称(例如,对于 topic 或 list):
序列化键或名称(转换为字节数组)
此字节数组经过哈希处理
哈希的结果是分区数的 mod
此模的结果 - MOD(hash result, partition count) - 是存储数据的分区,即 partition ID(分区 ID)。对于集群中的所有成员,指定键的 partition ID 始终相同。
分区表
分区表存储分区 ID 及其所属集群成员的地址。此表的目的是使集群中的所有成员(包括精简成员)都知道此信息,确保每个成员都知道数据的位置。
启动第一个成员时,将在其中创建一个分区表。当您启动其他成员时,第一个成员将成为“最老”的成员,并相应地更新分区表。它会定期将分区表发送给所有成员。通过这种方式,集群中的每个成员都会被告知分区所有权的任何更改。例如,当新成员加入集群或成员离开集群时,所有权可能会更改。
注意:如果集群中最老的成员出现故障,则下一个最老的成员会将分区表信息发送给其他成员。
您可以使用 hazelcast.partition.table.send.interval 系统属性配置成员发送分区表信息的频率(时间间隔)。默认情况下,频率为 15 秒。
重新分区
重新分区是重新分配分区所有权的过程。Hazelcast 在成员加入或离开集群时执行重新分区。
在这些情况下,将使用新的分区所有权更新最早成员中的分区表。请注意,如果精简成员加入或离开集群,则不会触发重新分区,因为精简成员不拥有任何分区。
五、使用案例
对高度变化的数据进行群集并进行事件通知,例如:基于用户的事件,并对后台任务进行排队和分发
作为具备近缓存(Near Cache)的简单内存缓存
作为需要对某些成员执行的某些进程的云范围调度程序
在 OSGI 环境下与不同安装中的多个成员动态共享信息(用户信息,队列,映射等)
在集群中共享密钥,其中应用程序服务器上存在 Web 服务接口并进行一些验证
作为分布式主题(发布/订阅服务器),为智能手机构建可扩展的聊天服务器
作为并发 API 的强一致性层,它是 Hazelcast 的 CP(关于 CAP 原则的 CP)子系统,建立在 Raft 共识算法之上
作为 Cassandra 后端的前层
在群集中分发用户对象状态,在对象之间传递消息以及共享系统数据结构(静态初始化状态、镜像对象、对象标识生成器)
作为多租户缓存,其中每个租户都有自己的 map
共享数据集,例如,类似表格的数据结构,供应用程序使用
从 Amazon EC2 服务器分配加载和收集状态,其中前端是使用 Spring 框架开发的
作为性能检测的实时流处理器
作为 Web 应用程序中会话数据的存储(实现 Web 应用程序的水平可伸缩性)
六、相关资料
Hazelcast API :Hazelcast Root 5.3.5 API
代码示例:Open Source Downloads | Hazelcast
更多用例和资料:Hazelcast | Unified Real-Time Data Platform for Instant Action
社区 Slack 分组:Slack,可加入分组并发布问题、关注公告、参与讨论等。
社区邮件组:https://groups.google.com/forum/#!forum/hazelcast,可发布问题或发起、跟进讨论
版权声明: 本文为 InfoQ 作者【数新网络官方账号】的原创文章。
原文链接:【http://xie.infoq.cn/article/d9f16896c03dbabc78673e7e5】。文章转载请联系作者。
评论