Spring Boot集成Hazelcast实现集群与分布式内存缓存

HazelcastHazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map,Queue,ExecutorService,Lock和JCache等Java的许多开发人员友好的分布式实现

了解Hazelcast

Hazelcast特性

简单易用
Hazelcast是用Java编写的,没有其他依赖关系。只需简单的把jar包引入项目的classpath即可创建集群

无主从模式
与许多NoSQL解决方案不同,Hazelcast节点是点对点的。没有主从关系; 所有成员都存储相同数量的数据,并进行相等的处理,避免了单点故障。

弹性可扩展
Hazelcast旨在扩展成千上万的成员。新成员启动,将自动发现群集,并线性增加存储和处理能力。成员之间通过TCP保持连接和通讯。

读写快速高效
Hazelcast所有数据都存储在内存中,提供基于内存快速高效的读写能力。

Hazelcast部署拓扑
在Hazelcast官方提供两种方式部署集群(图片均来自官方文档):

Spring Boot集成Hazelcast实现集群与分布式内存缓存

如需聚焦异步或高性能大批量任务的缓存服务,嵌入式方式是相对有优势的,最明显嵌入式方式访问数据延迟性低。

Spring Boot集成Hazelcast实现集群与分布式内存缓存

独立创建Hazelcast集群,统一管理,所有的应用程序如果需要访问缓存,可通过Hazelcast客户端(有java .NET C++的实现)或Memcache客户端或简单的REST客户端访问。后续demo示例以嵌入式为例。

Hazelcast数据分区
在Hazelcast分布式环境中,默认情况下,Hazelcast有271个分区。
当启动第一个成员的时候,成员1在集群中的分区如下图:

当在集群中新添加一个节点2时,分区图如下:

Spring Boot集成Hazelcast实现集群与分布式内存缓存

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

随着成员的增多,Hazelcast将一些主要和副本分区逐个移动到新成员,使所有成员相等和冗余。只有最小量的分区将被移动到扩展Hazelcast。以下是具有四个成员的Hazelcast集群中的分区图示如下:

Hazelcast在群集成员之间平均分配分区。Hazelcast创建分区的备份,并将其分配给成员之间进行冗余。

上述插图中的分区是为了方便描述。通常,Hazelcast分区不会按照顺序分配(如这些图所示),而是随机分布。Hazelcast在成员间平均分配了分区和备份。

Hazelcast优势

Hazelcast提供开源版本。

Hazelcast无需安装,只是个极小jar包。

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

Hazelcast集群非传统主从关系,避免了单点故障;集群中所有成员共同分担集群功能。

Hazelcast集群提供弹性扩展,新成员在内存不足或负载过高时能动态加入集群。

Hazelcast集群中成员分担数据缓存的同时互相冗余备份其他成员数据,防止某成员离线后数据丢失。

Hazelcast提供SPI接口支持用户自定义分布式数据结构。

Hazelcast适用场景

频繁读写数据

需要高可用分布式缓存

内存行NoSql存储

分布式环境中弹性扩展

下面我们来使用Spring Boot集成Hazelcast实现分布式集群服务看看

Spring Boot集成Hazelcast实现分布式集群服务

首先新建一个Spring Boot的gradle项目,引入Hazelcast相关jar包:

dependencies { compile 'com.hazelcast:hazelcast' compile 'org.springframework.boot:spring-boot-starter-web' }

当Hazelcast包在classpath上,Spring Boot将通过下面两种方式之一为我们创建一个HazelcastInstance实例:

方式一,通过配置属性指定的Hazelcast.xml文件创建:
spring.hazelcast.config = classpath:hazelcast.xml
该方式需要编写一个hazelcast.xml文件,通过xml文件描述Hazelcast集群

方式二,通过提供一个com.hazelcast.config.Config javabean到Spring容器中(下面所有demo是基于java config方式)

@Bean public Config hazelCastConfig() { //如果有集群管理中心,可以配置 ManagementCenterConfig centerConfig = new ManagementCenterConfig(); centerConfig.setUrl("http://127.0.0.1:8200/mancenter"); centerConfig.setEnabled(true); return new Config() .setInstanceName("hazelcast-instance") .setManagementCenterConfig(centerConfig) .addMapConfig( new MapConfig() .setName("instruments") .setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE)) .setEvictionPolicy(EvictionPolicy.LRU) .setTimeToLiveSeconds(20000)); }

上面代码通过提供Config的bean时候,主要做了如下几个事:

创建一个默认名为hazelcast-instance的HazelcastInstance实例;

使用默认的组播发现模式,组播传播地址默认为:224.2.2.3,如果想修改信息或修改为TCP模式可通过setNetworkConfig()接口设置相关信息;

创建一个名为dev,访问密码为dev-pass的group保障节点加入,如果想修改组,可通过setGroupConfig()接口设置相关信息;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjwgy.html