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,只是万一异步备份未完成时,数据本体所在节点挂掉,那就可能产生脏数据。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

时间: 2024-09-22 08:41:23

Hazelcast集群原理分析的相关文章

Linux集群原理与安装配置介绍

  Linux集群原理 Linux集群系统包括集群节点和集群管理器两部分.集群节点有时简称为节点.服务器或服务器节点,是提供处理资源的系统,它进行集群的实际工作.一般来讲,它必须进行配置才能成为集群的一部分,也必须运行集群的应用软件.应用软件可以是专用于集群的软件,也可以是设计用于分布式系统的标准软件.Linux集群管理器则是将节点捆绑在一起,以构成单一系统外观的逻辑结构,它用于将任务分解到所有的节点. 集群因多种不同的原因而有着不同的类型,建立Linux集群的最直接原因是共享CPU资源,在多个

memcached高可用集群原理及介绍

memcached高可用集群原理及介绍.memcached在实现分布式群集部署时,memcached服务之间是不能进行通讯的,分布式也是通过客户端的算法吧数据保存在不同的memcached中,所以当我们做完群集客户端往里面写入数据时,会出现下面的情况. 客户端往一个memcached节点写入数据后,另外两个节点是查询不到的. 那么如何结局额这个问题,就是接下来要做的了. memcached这种群集之间不能相互通讯导致了这种情况,这在访问量很大的web网站中是不允许的.所以我们就要使用到一个mag

云环境下的集群负载分析及调度策略研究

云环境下的集群负载分析及调度策略研究 杭州电子科技大学 应俊 本文首先研究了传统数据中心的特点及其缺点,分析了云数据中心的特点,接着研究了云集群的负载监控技术以及基于libvirt的虚拟机负载搜集技术.介绍了云环境下调度的概念和特征,并以OpenStack云平台为例详细分析了云环境下的调度机制.以CloudSim为例分析了云模拟技术,并研究了其中的主要模块. 随后,为了能深入理解云数据中心负载特征,本文搜集了实际公有云中生产集群的负载数据,涉及1082个虚拟机实例和100台物理机,时间跨度为20

EJB应用服务器集群技术分析

  J2EE平台提供了一个基于组件的方法,用来设计.开发.装配及部署企业应用程序.而且提供了一个多层的分布式的应用模型.组件的复用.一致化的安全模型以及灵活的事务控制模型.近年来在企业系统中得到了大量使用.随着J2EE应用服务器的大量部署和客户访问量的猛增.企业对于J2EE系统的可伸缩性和高可用性要求越来越高,特别是在电子商务和金融领域,这个问题越显的突出.如何设计和构建一个具有可伸缩的,高可用性的J2EE集群应用服务器,成为设计J2EE应用服务器设计必须考虑的问题.但J2EE应用服务器的集群是

定时组件quartz系列&lt;二&gt;quartz的集群原理

1.基本信息:      Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron- like表达式等等.其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢? 2 Quartz的集群配置:      2.1 实现集群的基本原理           Quar

heartbeat 3.0集群知识(1)集群原理

一, HA集群概念 (1)节点(node)运行heartbeat进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和heartbeat软件服务,在heartbeat集群中,节点有主次之分,分别称为主节点和备用/备份节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源,主节点上一般运行着一个或多个应用服务.而备用节点一般处于监控状态. (2)资源(resource)资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其它节点接管,heartbeat

你应该知道的服务器集群技术分析

在发展初期,一路处理器便可为一台服务器及其所有应用提供动力.接着就发展到了多处理时代,这时两路或多路处理器共享一个存储池,并能处理更多更大的应用.然后出现了服务器网络,该网络中的每台服务器都专门处理不同的应用集.现在,发展到了服务器集群,两台或多台服务器像一台服务器一样工作,提供更高的可用性和性能,这已经远远超出了您的想像.应用可从一台服务器转移到另一台服务器,或同时运行在若干台服务器上――所有这一切对用户都是透明的. 集群并不是新事物,但在软件和http://www.aliyun.com/zi

RDD:基于内存的集群计算容错抽象

摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Datasets),它具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大型集群上执行基于内存的计算.现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域很常见:二是交互式数据挖掘工具.这两种情况下,将数据保存在内存中能够极大地提高性能.为了有效地实现容错,RDD提供了一种高度受限的共享内存,即RDD是只读的,并且只能通过其他RDD上的批量操

E-MapReduce(Hadoop)10大类问题之集群规划

前言 目前E-MapReduce已经服务了很多客户,大部分的客户都有着相同类似的问题,本系列会总结这些问题,分为10篇文章,每隔一段时间会更新一大类的问题,欢迎大家交流学习.我们交流群为开源大数据技术社区召集令,欢迎大家关注.特别推荐 E-MapReduce产品,如果有大数据的需求,欢迎大家尝试使用,本系列所有的问题都是基于E-MapReduce平台的. 集群规划类问题 所有的使用Hadoop或者打算使用Hadoop的人肯定会遇到集群规划的问题,我到底使用多大的集群规模呢?有没有一个标准呢? 本