分布式缓存组件Hazelcast
Hazelcast是一个Java的开源分布式内存实现,它具有以下特性:
- 提供java.util.{Queue, Set, List, Map}的分布式实现
- 提供java.util.concurrent.ExecutorService的分布式实现
- 提供java.util.concurrency.locks.Lock的分布式实现
- 提供用于发布/订阅的分布式Topic(主题)
- 通过JCA与J2EE容器集成和事务支持
- 提供用于一对多关系的分布式MultiMap
- 提供分布式事件和监听器的实现
- 提供集群应用和集群成员机制
- 支持动态HTTP Session集群
- 通过JMX监控和管理集群
- 为Hibernate提供二级缓存Provider
- 提供动态集群机制
- 提供动态分区和备份机制
- 支持动态故障恢复
- 简单通过jar包集成
- 运行速度快.
- 体积小
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的更多相关文章
- 分布式缓存Hazelcast案例一
分布式缓存Hazelcast案例一 Hazelcast IMDG Architecture 今天先到这儿,希望对您技术领导力, 企业管理,物联网, 系统架构设计与评估,团队管理, 项目管理, 产品管 ...
- 分布式二级缓存组件实战(Redis+Caffeine实现)
前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...
- 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇
Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...
- 组件-------(一)redis系列--安装部署redis+实现redis分布式缓存 java+Spring+redis
目的:解决单机session不能共享问题,插入查询数据库时间效率问题,实现分布式缓存. 准备材料:Redis 下载链接 http://pan.baidu.com/s/1dEGTxvV 相关jar包如果 ...
- NET分布式缓存Memcached测试体验
原文地址:http://onlyonewt.blog.sohu.com/160168896.html 一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测 ...
- springboot+mybatis+redis实现分布式缓存
大家都知道springboot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据, ...
- 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?
写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...
- Asp.Net Core 轻松学-正确使用分布式缓存
前言 本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...
- $Django content_type组件 缓存组件
1 content_type组件(只能方便插入添加) 需求:课程,学位课(不同的课程字段不一样),价格策略 #免费课 class Free_classes (models.Model): id = ...
随机推荐
- [SDOI2017]数字表格
Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...
- [USACO13OPEN]照片Photo
题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...
- 【Miller-Rabin随机判素数算法】
实用性介绍: #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<=b;i++) #define T 5 #define ...
- Angular中 build的时候遇到的错误--There are multiple modules with names that only differ in casing
今天早上遇到一个Angular的编译的时候的错误 具体信息: There are multiple modules with names that only differ in casing.This ...
- 数据结构与算法 —— 链表linked list(05)
反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 示例 : 给定这个链表:1->2->3->4->5 返回结果: 5->4->3->2 ...
- Python中的条件和循环语句
条件和循环语句 1. 条件语句 if单用 格式:if 条件表达式 例如:if 5 > 3: print('True') >>> 'True' #当条件满足时才会执行上述操作. ...
- 216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- 跟着小菜学习RabbitMQ启动和基础(系列一)
前言 今天开始我们正式进入RabbitMQ系列学习,在这系列博客中也会发表.NET Core和EF Core文章,网上关于RabbitMQ例子比比皆是,我将综合网上所提供的信息并加上我个人的理解来详细 ...
- 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)
为了日后便于查询,本文所涉及到的必记的基本字符串方法如下: "分隔符".join(字符串) #将字符串的每一个元素按照指定分隔符进行拼接.split("字符串&qu ...