【总结】Hazelcast入门简介

2022-05-23 00:00:00 拆分 数据 分布式 节点 间隔

我们为什么要用缓存?
太简单的问题,因为要提高速度~ 中心思想是空间换时间,从数据库中预加载一部份数据放到内存或磁盘中,牺牲空间来换取交互时间。

一般的应用正式环境中都不止一台服务器(也就是说是集群的),那么如果只是简单的将数据预加载到内存,那么就会有数据不同步的现象。(更新了其中一台JVM,另一台JVM并不会收到通知从而保持数据同步)。这时候就需要用到cache server了。
目前流行的cache server有很多种,像redis,Hazelcast,ehcache,memcache等。相比其它三种,Hazelcast好像并没有那么流行,中文文档比较少。

Hazelcast是一个用Java编写的基于内存的数据网格管理平台([b]open source in-memory data grid[/b])。同时也是一个公司的名字。
公司网站:[url]https://hazelcast.com[/url]
产品网站:[url]https://hazelcast.org[/url]

[b]1. Hazelcast简介[/b]
(本文是基于version 3.5.4写的。)

Hazelcast作为一个高度可扩展的数据分发和集群平台,提供了高效的、可扩展的分布式数据存储、数据缓存。Hazelcast是开源的,在分布式技术方面,Hazelcast提供了十分友好的接口供开发者选择,如Map,Queue,ExecutorService, Lock和Jcache。
Hazelcast的稳定性很高,分布式应用可以使用Hazelcast进行存储数据、同步数据、发布订阅消息等。Hazelcast是基于Java开发的,其客户端有Java, C/C++, .NET以及REST。Hazelcast同时也支持memcache协议。它很好的支持了Hibernate,可以很容易的在当今流行的数据库系统中应用。

如果你在寻找一个基于内存的、可扩展的以及对开发者友好的NoSql,那么Hazelcast是一个很不错的选择!

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

b. Hazelcast的节点之间是平等的(Peer-to-Peer)
不像其它很多的NoSql解决方案,Hazelcast的节点之间是对等的(没有主次之分)。所有的节点存储的数据都是相等的,在应用中可以很容易的增加一个Hazelcast节点。或者以客户端-服务端的形式使用。

c. Hazelcast是可扩展的
Hazelcast的扩展性非常强,可以很简单的增加或减少节点。可以自动的监听节点的增加,并以线性的方式增加存储空间和能力。节点之间的通信是以TCP的方式建立的。

d. Hazelcast效率很高。
将数据存储在内存中,所以是非常高效的,包括读操作和写操作。

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

[b]2. 使用场景[/b]
分布式缓存,通常使用在数据库之前的那一层
缓存服务器
NoSql的数据存储
Spring cache
微服务的结构
储存临时数据,如web的session等

[b]3. Hazelcast的数据拆分[/b]
Hazelcast的数据拆分叫做间隔(Partitions)。默认情况下,Hazelcast会将数据拆分成271个间隔(总数,并不是单个单点)。当传入一个key时,Hazelcast会对它进行序列化,以及进行hash的算法等算出一个数值,通过该数值它存放在相应的间隔中(271个的其中一个)。在不同的节点中存放相同数量的间隔。Hazelcast还会生成备份的间隔,同样也是存放在这些间隔中。

[b]4. Hazelcast技术[/b]
如果你的应用主要关注的是数据的同步,或是在计算方面的效率,或者是大量的执行任务,那么在应用中嵌入Hazelcast是个不错的选择。在这种模式下,节点包含了应用本身和数据,如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/136449/eb4d5c58-8033-32f2-a83e-b755cf389221.png[/img]

另一种模式将多个节点组成一个cache server,然后应用程序通过协议来(Memcache, REST, 客户端等)和server进行交互。如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/136451/dd6ea47d-7e20-3efd-80d4-ee39e47f1407.png[/img]

[b]5. 数据的拆分之——间隔化(Partitioning)[/b]
在前面介绍过,Hazelcast数据的拆分叫间隔。间隔是一个内存片断,每一个间隔可以包含成千上万条的数据,这个取决于你的机器的能力。
默认情况下,Hazelcast的间隔有271个(所有加起来)。当我们配置了一个节点,那么它就有271个间隔了,下图就是单个节点的间隔图:
[img]http://dl.iteye.com/upload/picture/pic/136453/cdeae480-7aae-3cf7-a49b-66290f7d3d90.png[/img]

当我们在这个群集中加个第二个node,这时候的间隔就被分布化成如下图所示:
[img]http://dl.iteye.com/upload/picture/pic/136445/8963ffa9-7c6a-3e42-84d0-acc896f3954b.png[/img]
在图中,黑色部分的间隔是主要功能是拿来存储的,蓝色部分的间隔是拿来做备份的。个节点有135个黑色间隔,其它的(271-135)是备份间隔,主要用来备份第二个节点的黑色间隔。(简而言之就是两个节点相互备份)。

那么如果加入更多的节点呢?Hazelcast会均分拿来存储的黑色间隔以及拿来备份的蓝色间隔,确保所有的节点都是均衡的以及可恢复的。下图是4个节点的间隔图:
[img]http://dl.iteye.com/upload/picture/pic/136447/4d8b19e3-ee95-3ac4-bb58-1a32abeb0e9b.png[/img]

[b]6. 数据是怎么被拆分的[/b]
数据被放入间隔时使用的算法是一个hash算法。当存入一个键值(或名字)为key的对象(map或topic或list):
通过序列化、hash算法、取模(mod)等,再存放到间隔中。

[b]7. 间隔表[/b]
当启动一个节点时,间隔表就会被生成,这个表是用来存放间隔是从属于哪个节点的信息。目的是为了让所有的节点都共享这个信息,让所有的节点都知道数据是具体属于哪个节点的。
老的节点周期性的向其它节点发送间隔表,所以在集群中的每个点节都会知道间隔有没有发生变化。(比如节点增加或删除)。
如果个节点被移除了,那么第二个节点将担任起发送间隔表的工作。
你可以配置系统参数hazelcast.partition.table.send.interval来定义多久发送一次间隔表的信息。默认情况下是15秒。

[b]8. 重新间隔化[/b]
当集群中增加一个节点或删除一个节点时,都会进行重新间隔化。

[b]9. 资料[/b]
官方文档(重要):[url]https://hazelcast.org/documentation/[/url]
3.5版本文档:[url]http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html[/url]
3.5版本Java文档:[url]http://docs.hazelcast.org/docs/3.5/javadoc/[/url]

[b]10. 分布式数据结构[/b]
1. 标准的数据结构:Map/Queue/RingBuffer/Set/List/MultiMap/ReplicatedMap
2. Topic
3. 并发工具:Lock/Semaphore/AtomicLong/AtomicReference/IdGenerator/CountdownLatch

------------------------------
参考:
Wiki: [url]https://en.wikipedia.org/wiki/Hazelcast[/url]
[url]https://hazelcast.com/use-cases/caching[/url]
[url]https://hazelcast.com/use-cases/caching/cache-as-a-service[/url]
[url]https://hazelcast.com/use-cases/imdg[/url]
————————————————
版权声明:本文为CSDN博主「angelbill3」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/angelbill3/article/details/84829865

相关文章