Hazelcast 介绍与使用(整理)
要用到 Hazelcast 这个东西用作分布式缓存, 网上搜索了下发现这篇文章对我理解 Hazelcast 那种无主从之分, 避免了单点故障很有帮助, Hazelcast 的数据分布方式很有点像磁盘阵列 RAID 1, RAID0+1 的影子. 基本上在一个节点出现故障的情况下是不会影响数据访问的.
下面这个系列讲的很详细:
- Hazelcast集群服务(1)——Hazelcast介绍
- Hazelcast集群服务(2)——Hazelcast基本配置
- Hazelcast集群服务(3)——集群功能详解
- Hazelcast集群服务(4)——分布式Map
Hazelcast 是一个开源的可嵌入式数据网格(社区版免费,企业版收费)。你可以把它看做是内存数据库,不过它与 Redis 等内存数据库又有些不同。项目地址:http://hazelcast.org/
Hazelcast 使得 Java 程序员更容易开发分布式计算系统,提供了很多 Java 接口的分布式实现,如:Map, Queue, Topic, ExecutorService, Lock, 以及 JCache 等。它以一个 JAR 包的形式提供服务,只依赖于 Java,并且提供 Java, C/C++, .NET 以及 REST 客户端,因此十分容易使用。
如何存储数据
Hazelcast 服务之间是端对端的,没有主从之分,因此也不存在单点故障。集群中所有的节点都存储等量的数据以及进行等量的计算。
Hazelcast 缺省情况下把数据分为 271 个区。这个值可配置于系统属性 hazelcast.partition.count。
对于一个给定的键,在经过序列号、哈希并对分区总数取模之后能得到此键对应的分区号。所有的分区等量的分布与集群中所有的节点中,每个分区对应的备份也同样分布在集群中。
下例是拥有2个节点的 Hazelcast 集群:
黑色字体表示分区,蓝色字体表示备份。节点1存储了1到135分区,这些分区同时备份在节点2中。节点2存储了136到271分区,并备份在节点1中。
此时如果添加2个节点到集群中,Hazelcast 一个一个的移动分区和备份到新的节点,使得集群数据分布平衡。
注意实际中分区并不是有顺序的分布,而是随机分布,上面的示例只是为了方便理解。重要的是理解 Hazelcast 平均分布分区以及备份。
Hazelcast 使用哈希算法进行数据分区。对于一个给定的键(如Map)或者对象名称(如topic和list):
- 序列化此键或对象名称,得到一个byte数组。
- 对byte数组进行哈希。
- 取模后的值即为分区号。
每个节点维护一个分区表,存储着分区号与节点之间的对应关系。这样每个节点都知道如何获取数据。
重分区
集群中最老的节点(或者说最先启动)负责定时发送分区表到其他节点。这样如果有节点加入或者离开集群,所有的节点也能更新分区表。
注意: 如果最老的节点挂了,次老节点会接手这个任务。
这个定时任务时间间隔可配置系统属性 hazelcast.partition.table.send.interval。
缺省值为15秒。
重分区发生在:
- 节点加入集群。
- 节点离开集群。
此时最老节点会更新分区表,分发,接着集群开始移动分区,或者从备份恢复分区。
使用方式
有两种方式:嵌入式和客户端服务器。
- 嵌入式,Hazelcast 服务器的 jar 包被导入宿主应用程序,服务器启动并存在于各个宿主应用中。优点是可以更低延迟的数据访问。
- 客户端服务器,Hazelcast 客户端的 jar 包被导入宿主应用程序,服务器 jar 包独立运行于 JVM 中。优点是更容易调试以及更可靠的性能,最重要的是更好的扩展性。
摘自: http://www.cnblogs.com/seasonsluo/p/hazelcast-intro.html
以下是两段使用 Hazelcast 作为分布式 Map 和 Topic 的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import com.hazelcast.config.Config; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import java.util.concurrent.ConcurrentMap; public class DistributedMap { public static void main(String[] args) { Config config = new Config(); HazelcastInstance h = Hazelcast.newHazelcastInstance(config); ConcurrentMap<String, String> map = h.getMap("my-distributed-map"); map.put("key", "value"); //Concurrent Map methods map.putIfAbsent("somekey", "somevalue"); map.replace("key", "value", "newvalue"); map.forEach((k, v) -> System.out.println(k + " => " + v)); h.shutdown(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import com.hazelcast.config.Config; import com.hazelcast.core.*; public class DistributedTopic implements MessageListener<String> { static HazelcastInstance h; public static void main(String[] args) { Config config = new Config(); h = Hazelcast.newHazelcastInstance(config); ITopic<String> topic = h.getTopic("my-distributed-topic"); topic.addMessageListener(new DistributedTopic()); topic.publish("Hello to distributed world"); } @Override public void onMessage(Message<String> message) { System.out.println("Got message " + message.getMessageObject()); h.shutdown(); } } |
启动后会看到输出
Members [2] {
Member [192.168.2.106]:5702 - 274180a0-f05e-467d-bd84-13249f9db491
Member [192.168.2.106]:5703 - 16de21f2-3c5c-477f-aec6-0a33d6d02aba this
}
即使是本地的启动方式也会打开 Socket 端口, 默认在本机启动两个不同的端口号. 其他 Hazelcast 的应用例子可参考 https://hazelcast.org/.
其他相关链接:
- 如何使用分布式缓存 Hazelcast
- Hazelcast 集群原理分析
- 分布式缓存组件 Hazelcast
- 内存数据网格 Hazelcast 的一些机制原理
本文链接 https://yanbin.blog/hazelcast-introduction/, 来自 隔叶黄莺 Yanbin Blog
Hazelcast 介绍与使用(整理)相关推荐
- Hazelcast介绍
Hazelcast介绍 什么时侯需要 用例 内存中分布式计算 场景 分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默 ...
- 【Benewake(北醒) 】中距 TF02-i 40m工业版本CAN/485介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用指令串口助手使用说明 3.3 产品快速测试说明 4 基于开源硬件的运用整理 4.1 在开源飞控上的运用 5 ...
- 【Benewake(北醒) 】短距 TFmini Plus 12m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机测试说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 3.5 操作视频 4 基于开源硬 ...
- 【Benewake(北醒) 】长距 TF350 350m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机测试说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 4 基于开源硬件的运用整理 4. ...
- 【Benewake(北醒) 】短距 TFmini-S 12m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机测试说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 3.5 操作视频 4 基于开源硬 ...
- 【Benewake(北醒) 】中距 TF02-Pro 40m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机测试说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 3.5 操作视频 4 基于开源硬 ...
- 【Benewake(北醒) 】长距 TF03 100m/180m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机测试说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 3.5 操作视频 4 基于开源硬 ...
- Benewake(北醒) 短距 TF-Luna 8m介绍以及资料整理
目录 1 前言 2 产品介绍 3 产品快速测试 3.1 产品规格书及使用说明书 3.2 通用上位机使用说明 3.3 通用指令串口助手使用说明 3.4 产品快速测试说明 3.5 串口上手操作视频 4 基 ...
- (6)kendo UI使用基础介绍与问题整理——dropdownlist/基础问题整理
项目最近属于第一阶段的中后期,dropdownlist用的也算不少,首先对它的基本用法做一个整理. (插播一段:马未都的八字方针:自信坚强.认真宽容.马爷认为自信首先要拥有知识,然后要有勇气在公众面前 ...
最新文章
- python第二十九课——文件读写(复制文件)
- 苹果8参数_八年磨两苹果,日本精致农业“秘密” 打造不一样的智慧农业园区...
- Linux平台下Eclipse的安装
- 旋转的Apriltag码
- 网络推广外包——网络推广外包专员浅析移动端网站建设要点
- WEB中会话跟踪[转]
- 【CyberSecurityLearning 36】靶场环境搭建(ubuntu系统安装优化及vulhub安装)
- python numeric_Python pandas.to_numeric函数方法的使用
- java类的定义的实例_Java中类的定义和初始化示例详解
- linux ps命令使用详解
- Leading and Trailing LightOJ - 1282
- Illustrator 教程,如何在 Illustrator 中使用钢笔工具创建作品?
- Jquery—JQuery对radio的操作(01)
- Navicat Premiumx64 使用注册机激活
- python--查询PG数据库
- 流量控制系统pid整定方法仿真
- 猴子偷桃c语言编程软件,C语言实现的猴子偷桃之类算法
- 天龙八部科举答题问题和答案(全6/8)
- Python实现轨迹识别:如何用代码识别物体的运动轨迹
- ABAP-SAP 账号批量创建分配权限程序