Hazelcast是一个Java的开源分布式内存实现,它具有以下特性:

  1. 提供java.util.{Queue, Set, List, Map}的分布式实现
  2. 提供java.util.concurrent.ExecutorService的分布式实现
  3. 提供java.util.concurrency.locks.Lock的分布式实现
  4. 提供用于发布/订阅的分布式Topic(主题)
  5. 通过JCA与J2EE容器集成和事务支持
  6. 提供用于一对多关系的分布式MultiMap
  7. 提供分布式事件和监听器的实现
  8. 提供集群应用和集群成员机制
  9. 支持动态HTTP Session集群
  10. 通过JMX监控和管理集群
  11. 为Hibernate提供二级缓存Provider
  12. 提供动态集群机制
  13. 提供动态分区和备份机制
  14. 支持动态故障恢复
  15. 简单通过jar包集成
  16. 运行速度快.
  17. 体积小

Hazelcast体系结构图

hazelcast拓扑

hazelcast拓扑结构可用于分布式集群。支持两种操作模式。采用”嵌入成员”模式时,含有应用代码的JVM直接加入Hazelcast群集,采用”客户端外加成员”模式时,备用JVM(可能在相同或不同的主机上)负责加入Hazelcast群集。这两种拓扑方法如下图所示:

嵌入模式:

客户端外加成员模式:

在多数情况下,可以采用客户端外加成员拓扑方法,因为就群集机制而言,它提供更大弹性 - 成员 JVM 可被拆卸和重新启动,不会对整体应用程序产生任何影响,因为 Hazelcast 客户端将只需重新连接到群集的另一个成员。另一种说法是客户端外加成员拓扑方法能够隔离纯粹群集级别事件的应用代码。

Hazelcast数据分区

Hazelcast中的数据分片被叫做partition。默认情况下,Hazelcast有271个partition。用一个数据的key,可以采用序列化哈希的算法将数据映射到具体的分区上面。分区会均匀分布在集群member的内存中。并且有多个副本保证高可用。

下面演示节点增加分区分布的情况:

单个节点:

单仅启动一个节点的时候,该节点为master,且有默认的271个分区。

两个节点

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

加入更多节点

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

分区算法

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

分区表

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

分布式缓存组件Hazelcast的更多相关文章

  1. 分布式缓存Hazelcast案例一

    分布式缓存Hazelcast案例一 Hazelcast IMDG Architecture 今天先到这儿,希望对您技术领导力, 企业管理,物联网,  系统架构设计与评估,团队管理, 项目管理, 产品管 ...

  2. 分布式二级缓存组件实战(Redis+Caffeine实现)

    前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...

  3. 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇

    Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...

  4. 组件-------(一)redis系列--安装部署redis+实现redis分布式缓存 java+Spring+redis

    目的:解决单机session不能共享问题,插入查询数据库时间效率问题,实现分布式缓存. 准备材料:Redis 下载链接 http://pan.baidu.com/s/1dEGTxvV 相关jar包如果 ...

  5. NET分布式缓存Memcached测试体验

    原文地址:http://onlyonewt.blog.sohu.com/160168896.html 一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测 ...

  6. springboot+mybatis+redis实现分布式缓存

    大家都知道springboot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据, ...

  7. 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?

    写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...

  8. Asp.Net Core 轻松学-正确使用分布式缓存

    前言     本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...

  9. $Django content_type组件 缓存组件

    1  content_type组件(只能方便插入添加) 需求:课程,学位课(不同的课程字段不一样),价格策略 #免费课 class Free_classes (models.Model): id = ...

随机推荐

  1. [UOJ 282]长度测量鸡

    Description

  2. [Codeforces 864B]Polycarp and Letters

    Description Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s con ...

  3. hdu 5438(拓扑+bfs)

    题意:建图,删掉所有连接点小于2的点,直到不能删为止,问最后剩余的联通块中,点的数量是奇数的联通块中的点的权值和. 思路:拓扑删点,bfs计算 #include <iostream> #i ...

  4. [bzoj1187][HNOI2007]神奇游乐园

    来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...

  5. python 字典实现简单购物车

    # -*- coding: utf-8 -*-#总金额asset_all=0i1=input('请输入总资产:')asset_all=int(i1)#商品列表goods=[ {'name':'电脑', ...

  6. C语言程序设计第六次作业--循环结构(2)

    (一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...

  7. async/await,了解一下?

    上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...

  8. SQL语句删除字段,改变字段长度

    1.改变字段长度 ALTER TABLE T_MSG_SEND_R_ACC MODIFY reply_content VARCHAR(512); 2.删除字段ALTER TABLE MSG_TX_BA ...

  9. HTML中鼠标滚轮事件onmousewheel处理

    滚轮事件是不同浏览器会有一点点区别,一个像Firefox使用DOMMouseScroll ,ff也可以使用addEventListener方法绑定DomMouseScroll事件,其他的浏览器滚轮事件 ...

  10. 如何在Eclipse中快速添加main方法

    在创建类时自动添加,只需要勾选"public static void main(String[]   args)"