Hazelcast集群原理分析
简介
hazelcast其中一个很重要的应用就是可以将多个应用服务器组成一个分布式环境的应用,形成一个cluster。这个cluster可以选举出一个master来对外工作。而cluster中的各台服务器之间有数据同步机制和数据备份机制,来避免因为单个节点挂掉而导致数据丢失和cluster的失效。数据存储在分布式内存中,hazelcast可以保证数据在各个节点的均匀分布,可以增加节点和减少节点,而这个过程中,hazelcast会自动迁移数据,来保证数据的高可用。
选择Master
在hazelcast中,master是指集群里面的主节点。这个主节点负责的是向其他成员节点更新最新的成员列表。
一开始还没有节点,第一个启动的节点会先寻找其他节点,这里会根据配置的寻找机制,如果是multicast,就用multicast的方式寻找。如果是TCP/IP,就用TCP/IP的方式寻找。 找不到,就选举自己为master。
后面加入的节点,会向已存在cluster的master发出join请求,master检测是否符合集群的加入要求,如果符合,就会发送最新的成员列表给新加入的成员。同时更新集群中的数据,保证数据的均匀分布和冗余。
集群中的每个成员都有相同的成员列表。成员列表是按加入的顺序排好的。如果master 挂掉了,那么剩下的成员会收到通知,然后从成员列表中选举下一个作为master。
分布式备份
在可扩展的动态分区存储系统中,无论是NoSQL数据库、文件系统或者是内存数据网格,在集群更改时(添加或者删除节点),在集 群重新均衡时可能导致网络大数据传输。需要重新均衡这些节点中的主从数据。例如一个节点挂了,挂掉的节点的主备数据必须重新分配给其他在线的节点。以MB 数据传输会对集群造成消极的影响,因为要消耗机器的宝贵资源(例如网络流量、CPU和RAM)。在此期间可能导致严重的操作延时。
假设集群中有50个节点,每个存储40GB数据(20GB主数据和20GB备份数据);假设节点5挂了,我们必须保证节点5的存 储在集群中的临近节点中。那么节点5到的主备数据将被分配到临近节点7。这意味着节点7的数据量是其他节点的2倍。也意味着节点7消耗更多的CPU来处理 这两倍请求。另外节点7必须备份这个20GB的数据到其他节点9。这对这两个节点的负载造成极坏的影响。节点9也需要更多的内存去存储这20GB的备份数 据。造成大量的内存浪费。
Hazelcast 解决了以上问题。一个节点的主数据均匀地被分到其他节点。也就是说每个 节点都负责备份其他节点主数据。这样会有更好地使用内存和在减小添加或者删除结点时对集群的影响。假设集群中有50个节点要存储2TB的数据;每个节点存 储20G主数据和20G备数据。假设节点3的20GB的主数据被备份到其他49个节点,每个节点有20GB/49节点3的主数据。如果节点3挂了,每个节 点有1/49它的数据;注意没有任何数据迁移并且集群依然是均衡的!这样的备份机制在节点挂了之后是不需要立刻重新均衡的。假设你添加了5个节点。集群中也没有立马均衡;因为存在的节点已经在最佳状态。Hazelcast 会很温柔地迁移一些数据到这些新的节点,最终数据均匀存储。
Operation
Operation是hazelcast里面操作逻辑的封装。操作的逻辑要放在run方法里面,类似于runnable。
客户端创建和发送请求分析
public static void main(String[] args) {
ClientConfig clientConfig = new ClientConfig();
clientConfig.addAddress("10.10.4.40:5701");
// client初始化时会创建一系列service(线程池管理器、集群客户端服务、虚拟节点管理、动态扩展服务等),先启动ClientClusterServiceImpl,读取当前活动的实际节点(先根据clientConfig指定的地址获取connection,然后基于这个连接,再发起读取实际节点的请求),然后启动ClientPartitionServiceImpl,向各个实际活动节点发起请求获取其上的虚拟节点,记录到一个ConcurrentHashMap里。
HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig);
// 这里的map并不是真的map,而是一个mapProxy
// 并且这里要指定key和value的类型
Map<Integer, String> mapCustomers = instance.getMap("customers");
// put时,由这个mapProxy先把key和value都序列化为byte[]
// 然后用key的hash对虚拟节点数取余:key.getHash()%271,获得partitionId
// 根据ClientPartitionServiceImpl里的ConcurrentHashMap记录的虚拟节点和实际节点的对应关系,确定了该key对应的实际节点。然后通过BufferedOutputStream方式 对该地址发起操作请求。
mapCustomers.put(1, "Joe");
// 跟put类似,定位节点,然后发请求。只是请求类型不同而已。
System.out.println("Customer with key 1: "+ mapCustomers.get(1));
System.out.println("Map Size:" + mapCustomers.size());
}
故障转移
首先当 ClientClusterServiceImpl启动之后就产生一个一直监听节点存活情况的线程[cluster-listener]。
那么假设在执行 mapCustomers.put(1, “Joe”);操作前,其要操作的实际节点挂了,这时[cluster-listener]线程会立即感知并更新虚拟节点表。 如果在更新完毕后操作才发出请求,则操作可以成功,如果在更新未完成时发出了请求,则会抛出异常。而这个更新虚拟节点表的过程需要几秒钟。在这几秒钟里对失效节点的操作就真的失败了。
数据一致性
客户端向 Hazelcast写入数据本体所在节点是必须同步的;而备份过程默认是同步的,也可以修改配置成异步。 为了保证一致性,默认情况下,读取数据总是从数据的owner节点读取,这个也可以修改配置成允许从备份节点读数据,这样能带来更好的读性能。
举例来说, 要更新key为1的数据时,由一致性hash算法得知其存在节点A上,则对节点A发起update请求,这时如果你用另一个客户端也要更新节点A上的key1时,这两个操作肯定是同步控制的。而节点A把key1备份到节点B的过程也可以配成同步,然后再配成允许从备份节点读取,这样保证了一致性和高可读。如果备份过程配成异步,再配成不允许从备份节点读取,则保证了高可写,而一致性也基本ok,只是万一异步备份未完成时,数据本体所在节点挂掉,那就可能产生脏数据。
Hazelcast集群原理分析的更多相关文章
- mongodb基本命令,mongodb集群原理分析
mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...
- HDFS的HA集群原理分析
1.简单hdfs集群中存在的问题 不能存在两个NameNode 单节点问题 单节点故障转移 2.解决单节点问题 找额外一个NameNode备份原有的数据 会出现脑裂 脑裂:一个集群中多个管理者数据 ...
- Quartz应用与集群原理分析
Quartz在CRM中的应用场景: https://tech.meituan.com/mt-crm-quartz.html https://www.mtyun.com/library/mt-crm-q ...
- centos7搭建ELK Cluster集群日志分析平台(四):Fliebeat-简单测试
续之前安装好的ELK集群 各主机:es-1 ~ es-3 :192.168.1.21/22/23 logstash: 192.168.1.24 kibana: 192.168.1.25 测试机:cli ...
- centos7搭建ELK Cluster集群日志分析平台
应用场景:ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平台 ...
- kafka集群原理介绍
目录 kafka集群原理介绍 (一)基础理论 二.配置文件 三.错误处理 kafka集群原理介绍 @(博客文章)[kafka|大数据] 本系统文章共三篇,分别为 1.kafka集群原理介绍了以下几个方 ...
- ES的集群原理
文章转载自:https://www.cnblogs.com/soft2018/p/10213266.html 一.ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).E ...
- ELasticSearch(五)ES集群原理与搭建
一.ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).ES基本概念名词 Cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产 ...
- Quartz集群原理及配置应用
1.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: (1) ...
随机推荐
- javascript的基础(1)
1.javascript是什么? 它是一门基于客户端的脚本语言,是相对于服务器而言,浏览器就是一个客户端软件,浏览器从服务器上将资源(html,css,js,图片等)请求下来 并且在本地利用浏览器去解 ...
- ABP领域层知识回顾之---实体
标题:重温ABP领域层 1. 前言 最近一段时间一直在看<ABP的开发指南>(基于DDD的经典分层架构思想).因为之前一段时间刚看完<领域驱动设计:软件核心复杂性应对之道>, ...
- [Codeforces 176B]Word Cut
Description 题库链接 给你两个字符串 \(S\) 和 \(T\) ,准许你 \(k\) 次操作,每次将字符串左右分成两个非空的部分,再交换位置,问你有多少种不同的操作方法将 \(S\) 串 ...
- [PA 2014]Iloczyn
Description 斐波那契数列的定义为:k=0或1时,F[k]=k:k>1时,F[k]=F[k-1]+F[k-2].数列的开头几项为0,1,1,2,3,5,8,13,21,34,55,…你 ...
- [HNOI2001]软件开发
题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的 服务,其中一项服务就是要为每个开发人员每天提供一块 ...
- [bzoj4874]筐子放球
来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有 n 个球,用整数 1 到 n 编号.还有 m 个筐子,用 ...
- centos下 apache+mysql+php的安装
一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...
- java的数据结构
常见的数据结构 线性表(list) 1.有序列表,就像小朋友排队(一队)放学出校门,插入的顺序作为遍历的顺序,位置不变(长度固定) 2.顺序存储:从起始位置开始依次向后存储,查询方便,但是插入(排队 ...
- Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较 分区表位置
本文主要讲解Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的作用以及不同之处. 转自http://haohaozhang.blog.51cto.com/917 ...
- web项目部署到阿里云服务器步骤
http://www.cnblogs.com/qq3111901846/p/6178855.html http://blog.csdn.net/liona_koukou/article/details ...