初探HazelCast IMDG内存数据网格-简介

初探HazelCast IMDG内存数据网格-简介



一、内存数据网格(In Memory Data Grid)

所谓内存数据网格,是有别于内存关系型数据库,NoSQL数据库或关系型数据库的新型数据库软件。
内存数据网格将数据存储到内存中,并使其分布到多个服务器上,该方法的目的是更容易获取数据、改进其可扩展性和更好地进行数据分析。

1.1 IMDG特点

  • 数据是分布式存储在多台服务器上的。数据被集群里所有的服务器共享,外界不需要知道数据存放在哪个节点。
  • 所有数据存储于服务器的内存(RAM)中。数据存储和读取, 响应时间更快。
  • 每个节点的数据服务都是活跃的。
  • 用于存储数据的内存容量可以随着服务器的动态添加删除而不断改变, 随着集群服务器数量的增加,自动负载均衡,分担读写压力。
  • 数据模型是基于对象模型而并非关系模型。
  • 数据结构具有伸缩性,可以自动检测服务器节点的加入和移除。
  • 遇到网络或者硬件问题,不需要人工的干预,自动的切换到备份机器上,同时保证数据完整性。

1.2 IMDG架构

IMDG需要克服的两个核心为提示:容量限制(RAM精贵)和数据可靠性。通常IMDG通过水平扩展来克服内存容量的瓶颈(没有什么性能问题是加一台服务器解决不了的,一台不够那就两台!),而可靠性通常依赖复制来保证。
IMDG架构
除了提供各种分布式数据结构外,IMDG一般会使用堆外内存(off-heap,或称弹性内存)来降低GC的压力。

1.3 成熟的产品

  • [Java]Hazelcast
  • [商用]Terracotta Enterprise Suite
  • [Java]VMware Gemfire
  • [Java]Oracle Coherence
  • [Java]Gigaspaces XAP Elastic Caching Edition
  • [商用]IBM eXtreme Scale
  • [商用]JBoss Infinispan
  • [商用]GridGain

二、Hazelcast 简介

2.1 Hazelcast介绍

  • Hazelcast 是一款开源的分布式内存数据网格产品;
  • Hazelcast 是由Hazelcast公司开发和维护的开源产品,可以为基于jvm环境运行的各种应用提供分布式集群和分布式缓存服务。Hazelcast可以嵌入到任何使用Java、C++、.NET开发的产品中(C++、.NET只提供客户端接入);
  • Hazelcast 提供了 Map、Queue、MultiMap、Set、List、Semaphore、Atomic 等接口的分布式实现;
  • 提供了基于Topic 实现的消息队列或订阅\发布模式;
  • 提供了分布式id生成器(IdGenerator);
  • 提供了分布式事件驱动(Distributed Events);
  • 提供了分布式计算(Distributed Computing);
  • 提供了分布式查询(Distributed Query)。
  • 提供用于一对多关系的分布式MultiMap。
  • 通过JCA与J2EE容器集成和事务支持。
  • 提供用于安全集群的Socket层加密。
  • 支持同步和异步持久化。
  • 通过JMX监控和管理集群。
  • 支持动态HTTP Session集群。
  • 利用备份实现动态分割。
  • 支持动态故障恢复。
  • 简单通过jar包集成
  • 运行速度快.
  • 体积小
  • Hazelcast 有开源版本和商用版本。开源版本遵循 Apache License 2.0 开源协议免费使用。

附:
Hazelcast源码
关于Hazelcast的issues:
githubstackoverflow

2.2体系结构图

体系结构图

2.3HazelCast的特点

  • 使用Hazelcast开发比较简单
    Hazelcast是基于Java写的,没有任何其它的依赖。它提供的API跟Java util包很像。对于开发者来说,只需要加入hazelcast.jar,然后就可以快速使用在多个JVM之间的数据共享(分布式)。

  • 自治集群(无中心化)
    Hazelcast的节点(文中的节点可以理解为运行在任意服务器的独立jvm,下同)之间是对等的(没有主次之分)。所有的节点存储的数据都是相等的,在应用中可以很容易的增加一个Hazelcast节点。Hazelcast 没有任何中心节点,或者说Hazelcast 不需要特别指定一个中心节点。在运行的过程中,它自己选定集群中的某个节点作为中心点来管理所有的节点。

  • 数据按应用分布式存储
    Hazelcast 将数据分散的存储在每个节点中,节点越多越分散。每个节点都有各自的应用服务,而Hazelcast集群会根据每个应用的数据使用情况分散存储这些数据,在应用过程中数据会尽量“靠近”应用存放。这些在集群中的数据共享整个集群的存储空间和计算资源。

    在传统的数据存储模型中(MySql、MongDB、Redis 等等)数据都是独立于应用单独存放,当需要提升数据库的性能时,需要不断加固单个数据库应用的性能。即使是现在大量的数据库支持集群模式或读写分离,但是基本思路都是某几个库支持写入数据,其他的库不断的拷贝更新数据副本。这样做的坏处一是会产生大量脏读的问题,二是消耗大量的资源来传递数据——从数据源频繁读写数据会耗费额外资源,当数据量增长或创建的主从服务越来越多时,这个消耗呈指数级增长。

  • 抗单点故障
    集群中的节点是无中心化的,每个节点都有可能随时退出或随时进入。因此,在集群中存储的数据都会有一个备份(可以配置备份的个数,也可以关闭数据备份)。这样的方式有点类似于 hadoop,某项数据存放在一个节点时,在其他节点必定有至少一个备份存在。当某个节点退出时,节点上存放的数据会由备份数据替代,而集群会重新创建新的备份数据。Hazelcast的扩展性非常强,可以很简单的增加或减少节点。可以自动的监听节点的增加,并以线性的方式增加存储空间和能力。节点之间的通信是以TCP的方式建立的。

  • Hazelcast是可备份的
    Hazelcast的数据会在多个节点上进行备份。一旦一个节点失败了,数据将会从别的节点上进行恢复。

  • Hazelcast页面元素齐全
    页面可以看到map,list等数据内容,以及一些容量的仪表图.可以看到很多有用的数据,包括每个Map的请求次数等.

2.4 使用场景

  • 分布式缓存
  • 缓存服务器
  • NoSQL数据存储
  • SpringCache
  • 微服务的结构存储
  • 存储临时数据

2.5 Hazelcast的数据分区

Hazelcast的数据分区叫做间隔(Partitions),Hazelcast 缺省情况下把数据分为 271 个区。这个值可配置于系统属性hazelcast.partition.count。对于一个给定的键,在经过序列号、哈希并对分区总数取模之后得到此键映射的分区号。所有的分区等量的分布与集群中所有的节点中,每个分区对应的备份也同样分布在集群中,保证高可用。

数据分区示例

  • 单节点
    仅仅启动一个节点时,由于没有其他节点,因此推选该节点为master节点,默认有271个分区。
    单节点

  • 第二个节点
    启动第二个节点,第二个节点会加入第一个节点创建的集群中。第一个节点中的分区会重新分配,均匀分布在集群中。且集群中每个成员的数据分片都有一个副本。
    两个节点

  • 多个节点
    当加入更多节点的时候,原来节点中的数据分片会重新分布到新加入的节点上面,保证集群中数据分片的均匀分布。且同样会备份数据。下面是4个节点集群的数据分片分布。
    四个节点

  • 分区算法
    Hazelcast数据分片采用哈希算法。当给一个map的key或是一个分布式对象的名称,会首先将key或对象名称进行序列化,转成byte array的形式,然后将byte array进行哈希,将哈希结果对分区数求模得到分片ID。

  • 分区表
    分区表在第一个节点创建的时候就会生成。分区表是存储分区和节点的对应关系。每个节点维护一个分区表,存储着分区号与节点之间的对应关系。第一个启动的节点会将这个分区表周期性地发送给集群中的其他节点。这样,当集群中新增节点或是删除节点的时候,集群中的每个节点都可以拿到最新的分区信息。如果第一个节点(master)失败了,集群会选出新的master(第二个启动的节点),再由新的master将分区表发送给集群中的节点。发送的时间周期可以设置hazelcast.partition.table.send.interval系统属性,默认是15s.

2.6 hazelcast拓扑方式

  • 嵌入式拓扑模型
    含有Hazelcast 服务器的jar 包的JVM直接加入Hazelcast群集。优点是可以更低延迟的数据访问。
    嵌入式
  • C/S服务器外加客户端拓扑模型
    Hazelcast 客户端的 jar 包被导入宿主应用程序,服务器 jar 包独立运行于 JVM 中。优点是更容易调试以及更可靠的性能,最重要的是更好的扩展性。
    客户端加入
    在多数情况下,可以采用客户端外加成员拓扑方法,因为就群集机制而言,它提供更大弹性 - 成员 JVM 可被拆卸和重新启动,不会对整体应用程序产生任何影响,因为 Hazelcast 客户端将只需重新连接到群集的另一个成员。

引文:
1.https://www.theserverside.com/discussions/thread/63425.html
2.https://www.cnblogs.com/xiaomaohai/p/6157664.html
3.https://blog.csdn.net/sprayabc/article/details/8488253
4.https://www.cnblogs.com/seasonsluo/p/hazelcast-intro.html
5.https://blog.csdn.net/wangyangzhizhou/article/details/52511101

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章