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

栏目: Java · 发布时间: 5年前

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

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

了解Hazelcast

Hazelcast特性

简单易用

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

无主从模式

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

弹性可扩展

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

读写快速高效

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

Hazelcast部署拓扑

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

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

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

Hazelcast数据分区

在Hazelcast分布式环境中,默认情况下,Hazelcast有271个分区。

当启动第一个成员的时候,成员1在集群中的分区如下图:

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

在图示中,黑色分区是主分区,蓝色分区是副本分区(备份)。第一个成员具有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()接口设置相关信息;

创建了一个名为instruments的分布式map数据结构,并设置了该map的最大容量200/逐出策略LRU/有效期20000ms等信息,当集群启动后,我们可以在任一成员节点上通过HazelcastInstance读写该map。

完整代码:

@SpringBootApplication

public class StartUp {

private Logger LOGGER = LoggerFactory.getLogger(StartUp.class);

public static void main(String[] args) {

SpringApplication.run(StartUp.class, args);

}

@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));

}

}

下面我们通过修改server.port分别启动端口为8080和8081的成员服务

当启动完8080成员的时候,可以在8080控制台看到如下日志:

Members [1] {

Member [172.17.42.1]:5701 – 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1 this

}

因我们使用的是组播传播模式,5701为节点在组播网络中分配的端口

当启动完8081成员的时候,可以在8081控制台看到如下日志:

Members [2] {

Member [172.17.42.1]:5701 – 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1

Member [172.17.42.1]:5702 – a46ceeb4-e079-43a5-9c9d-c74265211bf7 this

}

回到8080控制台,发现多了一行日志:

Members [2] {

Member [172.17.42.1]:5701 – 0d39dd66-d4fb-4af4-8ddb-e9f4c7bbe5a1 this

Member [172.17.42.1]:5702 – a46ceeb4-e079-43a5-9c9d-c74265211bf7

}

发现8081成员也加入进来了。两个控制台都能看到成员列表。集群就已经搭建成功。

为了验证结果,上面我们在集群中已经创建了一个名为instruments的分布式map数据结构,现在我们通过写个接口证明:

@GetMapping(“/greet”)

public Object greet() {

Object value = Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).get(“hello”);

if (Objects.isNull(value)) {

Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).put(“hello”, “world!”);

} LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

首先通过访问8080服务的/greet,第一次访问instruments中是没有key为hello的键值对,会往里面塞入{“helo”:”world!”},然后访问8081服务的/greet,这个时候应该是能取得改键值对的。

完整代码:

@RestController

@SpringBootApplication

public class StartUp {

private Logger LOGGER = LoggerFactory.getLogger(StartUp.class);

public static void main(String[] args) {

SpringApplication.run(StartUp.class, args);

}

@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));

}

@GetMapping(“/greet”)

public Object greet() {

Object value = Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).get(“hello”);

if (Objects.isNull(value)) {

Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).put(“hello”, “world!”);

} LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

}

重启8080和8081服务

通过浏览器请求http://localhost:8080/greet

查看8080控制台日志:

2017-10-23 13:52:27.865 INFO 13848 — [nio-8080-exec-1] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=nul

通过浏览器请求http://localhost:8081/greet

查看8081控制台日志:

2017-10-23 13:52:40.116 INFO 13860 — [nio-8081-exec-2] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world

Spring Boot为Hazelcast提供了明确的缓存支持。如果启用缓存, HazelcastInstance则会自动包含在CacheManager实现中。所以完全可以支持Spring Cache。

以往我们用Spring Cache都是基于 Redis 做存储后端,现在我们使用Hazelcast来尝试一下 首先在启动类上开启缓存

@EnableCaching

建立个service类,demo为了方便,写在一起

完整代码:

@EnableCaching

@RestController

@SpringBootApplication

public class StartUp {

private Logger LOGGER = LoggerFactory.getLogger(StartUp.class);

public static void main(String[] args) {

SpringApplication.run(StartUp.class, args);

}

@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));

}

@GetMapping(“/greet”)

public Object greet() {

Object value = Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).get(“hello”);

if (Objects.isNull(value)) {

Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).put(“hello”, “world!”);

} LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

@Autowired

private DemoService demoService;

@GetMapping(“/cache”)

public Object cache() {

String value = demoService.greet(“hello”); LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

}

@Service

@CacheConfig(cacheNames = “instruments”)

class DemoService {

private Logger LOGGER = LoggerFactory.getLogger(DemoService.class);

@Cacheable(key = “#key”)

public String greet(String key) { LOGGER.info(“缓存内没有取到key={}”, key);

return “world!”;

}

}

连续访问两次8080服务的/cache接口 第一次控制台输出日志:

2017-10-23 14:10:02.201 INFO 13069 — [nio-8081-exec-1] com.hazelcast.DemoService: 缓存内没有取到key=hello

2017-10-23 14:10:02.202 INFO 13069 — [nio-8081-exec-1] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world!

第二次控制台输出日志:

2017-10-23 14:11:51.966 INFO 13069 — [nio-8081-exec-3] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world!

第二次比第一次相比少了执行service方法体内容,证明第二次是通过了缓存获取。

在Hazelcast官网上,有使用Hazelcast集群和Redis集群做缓存的对比

单只性能上来说,写入速度Hazelcast比Redis快44%,读取速度Hazelcast比Redis快56%

详情移步底下参考资料中链接

下面,我们再来一个尝试,既然有分布式缓存了,我们可以把我们的8080和8081服务做成一个web集群,web服务集群主要标志是前端负载均衡和session共享,我们来实现8080和8081的session共享。

Spring Session已经支持使用Hazelcast作为会话缓存后端,首先引入Spring Session jar包

dependencies {

compile ‘com.hazelcast:hazelcast’

compile ‘org.springframework.boot:spring-boot-starter-web’

compile ‘org.springframework.session:spring-session’

}

要启用Hazelcast作为集群会话缓存后端,有两种方式

第一种Spring Boot配置文件里面配置spring.session.*属性:

spring.session.store-type=hazelcast

第二种使用java注解开启:

@EnableHazelcastHttpSession

这里选择第二种方式,要证明集群会话共享,我们定一个简单接口打印一下sessionId,通过同一浏览器访问8080和8081服务的该接口,看看不同服务请求的时候sessionId是否一致,完整代码如下:

@EnableCaching

@RestController

@EnableHazelcastHttpSession

@SpringBootApplication

public class StartUp {

private Logger LOGGER = LoggerFactory.getLogger(StartUp.class);

public static void main(String[] args) {

SpringApplication.run(StartUp.class, args);

}

@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));

}

@GetMapping(“/greet”)

public Object greet() {

Object value = Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).get(“hello”);

if (Objects.isNull(value)) {

Hazelcast.getHazelcastInstanceByName(“hazelcast-instance”).getMap(“instruments”).put(“hello”, “world!”);

} LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

@Autowired

private DemoService demoService;

@GetMapping(“/cache”)

public Object cache() {

String value = demoService.greet(“hello”); LOGGER.info(“从分布式缓存获取到 key=hello,value={}”, value);

return value;

}

@GetMapping(“/session”)

public Object session(HttpSession session) {

String sessionId = session.getId(); LOGGER.info(“当前请求的sessionId={}”, sessionId);

return sessionId;

}

}

@Service

@CacheConfig(cacheNames = “instruments”)

class DemoService {

private Logger LOGGER = LoggerFactory.getLogger(DemoService.class);

@Cacheable(key = “#key”)

public String greet(String key) { LOGGER.info(“缓存内没有取到key={}”, key);

return “world!”;

}

}

访问8080服务/session接口,控制台日志如下:

2017-10-23 14:28:41.991 INFO 14140 — [nio-8080-exec-2] com.hazelcast.StartUp: 当前请求的sessionId=e75ffc53-90bc-41cd-8de9-e9ddb9c2a5ee

访问8081服务/session接口,控制台日志如下:

2017-10-23 14:28:45.615 INFO 14152 — [nio-8081-exec-1] com.hazelcast.StartUp: 当前请求的sessionId=e75ffc53-90bc-41cd-8de9-e9ddb9c2a5ee

集群会话共享生效。

集群管理界面

在上面的demo中,在创建Config的时候,设置了一个ManagementCenterConfig配置,该配置是指向一个Hazelcast集群管理平台,比如demo中表示在本地启动了一个管理平台服务。该功能也是相对其他NoSql服务的一个优势。

要部署ManagementCenter管理平台有多种方式

比如通过https://download.hazelcast.com/management-center/management-center-3.8.3.zip地址下载,解压后启动;

sh ./startManCenter.sh 8200 /mancenter

如果有 docker 环境,直接可以docker部署:

docker run -ti -p 8200:8080 hazelcast/management-center:latest

部署成功后,访问http://ip:8200/mancenter,首次访问会让你配置个用户名密码,进入后 :

在左侧菜单栏,能看到现有支持的分布式数据格式,比如Maps下面名为instruments的是我们前面demo自己创建的,名为spring:session:sessions是我们用了Hazelcast做集群会话同步的时候Spring为我们创建的。

中间区域能看到所有节点成员的系统相关实时使用率,随便点击一个节点进去,能看到当前节点的系统实时使用率:

红圈里面的即是上面提到的节点数据分区数,通过左侧菜单栏的数据结构进去,能看到当前对应的数据结构的详细信息和实时吞吐量:

更多内容请参考下方参考资料。

示例代码可以通过https://github.com/zggg/hazelcast-in-spring-boot下载。

参考资料

为什么选Hazelcast:https://hazelcast.com/why-hazelcast/imdg/

Hazelcast官方文档:http://docs.hazelcast.org/docs/3.8.6/manual/html-single/index.html

Redis对比:https://hazelcast.com/use-cases/nosql/redis-replacement/

Redis 3.2.8 vs Hazelcast 3.8 集群基准测试对比:https://hazelcast.com/resources/benchmark-redis-vs-hazelcast/

来源: https://www.cnblogs.com/heishao/p/9951421.html

——————–

Hazelcast与Spring集成问题

最近在项目中加入了Hazelcast第三方插件,在与Spring集成的时候,将Hazelcast配置到Spring的配置文件当中,出现了不能通过属性注入的方法,给属性赋值,代码如下:

<bean id="hazelcast" class="com.hazelcast.core.Hazelcast"
       factory-method="newHazelcastInstance">
       <constructor-arg>
           <bean class="com.hazelcast.config.Config">
               <property name="port" value="5701" />
               <property name="portAutoIncrement" value="true" />
               <property name="groupConfig">
                   <bean class="com.hazelcast.config.GroupConfig">
                       <property name="name" value="dev" />
                       <property name="password" value="pwd" />
                   </bean>
               </property>
               <property name="networkConfig">
                   <bean class="com.hazelcast.config.NetworkConfig">
                       <property name="join">
                           <bean class="com.hazelcast.config.Join">
                               <property name="multicastConfig">
                                   <bean class="com.hazelcast.config.MulticastConfig">
                                       <property name="enabled" value="false" />
                                       <property name="multicastGroup" value="224.2.2.3" />
                                       <property name="multicastPort" value="54327" />
                                   </bean>
                               </property>
                               <property name="tcpIpConfig">
                                   <bean class="com.hazelcast.config.TcpIpConfig">
                                       <property name="enabled" value="true" />
                                       <property name="members">
                                           <list>
                                               <value>10.2.108.194</value>
                                               <value>10.253.73.24</value>
                                           </list>
                                       </property>
                                   </bean>
                               </property>
                           </bean>
                       </property>
                   </bean>
               </property>
           </bean>
       </constructor-arg>
   </bean>

---------------

先将hazelcast-all-x.x.x.jar放到项目的lib中,

将hazelcast.xml复制到项目的根目录中。

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans                       

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd


http://www.springframework.org/schema/context

                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <bean id="instance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance"></bean>
    <bean name="multiMap" factory-bean="instance" factory-method="getMultiMap">
        <constructor-arg value="userSession"/>
    </bean>
</beans>

<constructor-arg value=”userSession”/>的userSession名字随便取。

在hazelcast的管理界面会显示的。

id=”instance”的bean不写<constructor-arg>会在根目录中寻找hazelcast.xml文件的。

除了有getMultiMap外,还有getMap,getQueue,getTopic,getSet,getList,getExecutorService,getIdGenerator,getAtomicLong,getSemaphore,getCountDownLatch,getLock等。

@Autowired
private MultiMap<String, Object> multiMap;

在java代码中这样就可以操作MultiMap了。

——————

hazelcast初探

Hazelcast作为一个高度可扩展的数据分发和集群平台,提供了高效的、可扩展的分布式数据存储、数据缓存。Hazelcast是开源的,在分布式技术方面,Hazelcast提供了十分友好的接口供开发者选择,如Map,Queue,ExecutorService, Lock和Jcache。

Hazelcast的稳定性很高,分布式应用可以使用Hazelcast进行存储数据、同步数据、发布订阅消息等。Hazelcast是基于Java开发的,其客户端有Java, C/C++, .NET以及REST。Hazelcast同时也支持memcache协议。它很好的支持了Hibernate,可以很容易的在当今流行的数据库系统中应用。

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

Hazelcast是一个高度可扩展的数据分发和集群平台。特性包括:

提供java.util.{Queue, Set, List, Map}分布式实现。

提供java.util.concurrency.locks.Lock分布式实现。

提供java.util.concurrent.ExecutorService分布式实现。

提供用于一对多关系的分布式MultiMap。

提供用于发布/订阅的分布式Topic(主题)。

通过JCA与J2EE容器集成和事务支持。

提供用于安全集群的Socket层加密。

支持同步和异步持久化。

为Hibernate提供二级缓存Provider 。

通过JMX监控和管理集群。

支持动态HTTP Session集群。

利用备份实现动态分割。

支持动态故障恢复。

1.优点

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的数据会在多个节点上进行备份。一旦一个节点失败了,数据将会从别的节点上进行恢复。

f. Hazelcast页面元素齐全

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

2. 使用场景

分布式缓存,通常使用在数据库之前的那一层

缓存服务器

NoSql的数据存储

Spring cache

微服务的结构

储存临时数据,如web的session等

3. Hazelcast的数据拆分

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

4.配置

配置组连接选项

<group>

<name>test</name>

<password>test</password>

</group>

配置管理页面,如果配置为true,则可以在mancenter目录下启动页面管理

<management-center enabled=”true”>http://10.1.4.97:8080/mancenter</management-center>

配置连接网络(自增长如果配为true,端口启动失败时会自增)

<port auto-increment=”true” port-count=”100″>5701</port>

集群节点发现机制,自选一种

<join>

<multicast enabled=”false”>

<multicast-group>224.2.2.3</multicast-group>

<multicast-port>54327</multicast-port>

</multicast>

<tcp-ip enabled=”true”>

<interface>10.10.10.10</interface>

<member-list>

<member>10.10.10.10</member>

</member-list>

</tcp-ip>

<aws enabled=”false”>

<access-key>my-access-key</access-key>

<secret-key>my-secret-key</secret-key>

<!–optional, default is us-east-1 –>

<region>us-west-1</region>

<!–optional, default is ec2.amazonaws.com. If set, region shouldn’t be set as it will override this property –>

<host-header>ec2.amazonaws.com</host-header>

<!– optional, only instances belonging to this group will be discovered, default will try all running instances –>

<security-group-name>hazelcast-sg</security-group-name>

<tag-key>type</tag-key>

<tag-value>hz-nodes</tag-value>

</aws>

</join>

配置节点对套接字加密,算法可选

<symmetric-encryption enabled=”false”>

<!–

encryption algorithm such as

DES/ECB/PKCS5Padding,

PBEWithMD5AndDES,

AES/CBC/PKCS5Padding,

Blowfish,

DESede

–>

<algorithm>PBEWithMD5AndDES</algorithm>

<!– salt value to use when generating the secret key –>

<salt>thesalt</salt>

<!– pass phrase to use when generating the secret key –>

<password>thepass</password>

<!– iteration count to use when generating the secret key –>

<iteration-count>19</iteration-count>

</symmetric-encryption>

配置执行服务器的线程和队列容量

<executor-service name=”default”>

<pool-size>16</pool-size>

<!–Queue capacity. 0 means Integer.MAX_VALUE.–>

<queue-capacity>0</queue-capacity>

</executor-service>

参考:http://blog.csdn.net/hengyunabc/article/details/18514563


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Natural Language Processing with Python

Natural Language Processing with Python

Steven Bird、Ewan Klein、Edward Loper / O'Reilly Media / 2009-7-10 / USD 44.99

This book offers a highly accessible introduction to Natural Language Processing, the field that underpins a variety of language technologies, ranging from predictive text and email filtering to autom......一起来看看 《Natural Language Processing with Python》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具