`
hellwhj
  • 浏览: 4453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

分布式缓存hazelcast的一些原理分析

 
阅读更多

1.下面以一个客户端创建和发请求的过程来分解描述。

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());
}

 

2.单点问题:

        hazelcast之所以没有单点问题,不是因为没有master节点,而是直接把集群中最早的节点作为master节点,一旦第一个节点挂了,第二个自然就成为了第一个,也就成为了master。而master的作用是与各成员保持连接和心跳,维护成员列表和虚拟节点列表,并在各节点和客户端要获取时提供。管理这两个列表的服务分别是ClusterService和PartitionService。

 

3.故障转移:

        假设在执行mapCustomers.put(1, "Joe");操作时,要请求虚拟节点所在的实际节点挂了,则客户端会接收到IOException,此处客户端代码中判断如果出现IO异常,则向master节点发起一个异步的更新虚拟节点列表的请求,并重试刚才报IO异常的操作,重试时是向节点列表的下一个成员地址发请求。此处使用了while循环,除非客户端stop,否则会一直重试。如果挂掉的是master节点,则刚才向master发的获取虚拟节点列表的请求也会报IO异常,所以它也会找下一个节点重试。其实由于排在第二的节点自动就成为master,所以重试次数不会很多。

 

4.动态扩容:

        当启动一个新节点时,它会先用组播服务向所有节点发起请求,从而能够与master节点连接上,加入成功则master会把新的成员列表发给各节点。然后执行rebalance:首先根据新成员列表创建出新的虚拟节点列表,然后把原虚拟节点列表与新列表做比较从而针对每个需要移动的虚拟节点创建一个task,放到一个task队列中去依次执行。

 

5.数据一致性:

        客户端向 Hazelcast写入数据本体所在节点是必须同步的;而备份过程默认是异步的,也可以修改配置成同步。为了保证一致性,默认情况下,读取数据总是从数据的owner节点读取,这个也可以修改配置成允许从备份节点读数据,这样能给你带来更好的读性能。

举例来说,要更新key为1的数据时,由一致性hash算法得知其存在节点A上,则对节点A发起update请求,这时如果你用另一个客户端也要更新节点A上的key1时,咱俩这个操作肯定是同步控制的。而节点A把key1备份到节点B的过程你可以配成同步,然后再配成允许从备份节点读取,这样保证了一致性和高可读。如果备份过程配成异步,再配成不允许从备份节点读取,则保证了高可写,而一致性也基本ok,只是万一异步备份未完成时,数据本体所在节点挂掉,那数据就可能脏了。

 

1
1
分享到:
评论

相关推荐

    分布式缓存

    本书“深入分布式缓存:从原理到实践”旨在全面解析分布式缓存的核心概念、工作原理及其在实际项目中的应用。 分布式缓存的主要目标是解决单机内存有限的问题,通过在网络中的多台服务器上分散存储数据,实现高可用...

    19_先平易近人的随口问你一句分布式缓存的第一个问题.zip

    在这个主题中,我们将深入探讨分布式缓存的工作原理、如何实现高性能以及如何应对高并发挑战。 首先,我们需要理解什么是分布式缓存。分布式缓存是一种存储在多台机器上的数据缓存系统,它可以跨越网络提供快速的...

    hazelcast-all-3.3-EA.zip

    Hazelcast 是一个开源的内存数据网格解决方案,它提供分布式内存计算、缓存和消息队列功能,用于提高应用程序的性能和可伸缩性。这个 ZIP 文件很可能是包含了 Hazelcast 框架的所有组件,包括核心库、客户端、示例和...

    HazelcastClientSample:连接到Hazelcast群集的示例应用程序

    在Java环境下,Hazelcast提供了`hazelcast-client`库,使得Java应用程序可以方便地连接到群集并执行操作,如缓存管理、分布式Map、Queue、Topic等。 3. **连接过程**: 连接Hazelcast客户端到群集通常涉及以下步骤:...

    Concurrent.and.Distributed.Computing.in.Java

    Java中有许多成熟的分布式缓存解决方案,如Hazelcast、Infinispan等。 ### 结合并发与分布式计算 将并发与分布式计算相结合,可以构建出高度复杂且高性能的应用程序。例如,在大数据处理场景下,通过并发处理可以...

    java之数据库缓存

    它常被用作分布式缓存,提供高速的数据读写能力。Java开发者可以使用Jedis或Lettuce等客户端库与Redis进行交互。 2. **Memcached**:另一种流行的选择,是一个高性能的分布式内存对象缓存系统。Java中的...

    java网络编程与分布式计算

    14. **Distributed Cache**:如Hazelcast或Ignite,提供分布式缓存功能,提高大规模应用的性能。 15. **微服务架构**:微服务化是现代分布式计算的一种流行模式,每个服务独立部署、扩展和升级,通过API通信。 四...

    Distibuted Systems

    Java中的分布式缓存如Hazelcast和分布式事务处理如Two-Phase Commit协议,都是为了确保系统在部分故障时仍能正常运行。 5. **一致性与CAP定理**:分布式系统中的数据一致性是一个关键问题。CAP定理指出,一个分布式...

    Java Network Programming and Distributed Computing 及源码

    5. **分布式缓存**:如Java的Hazelcast或Infinispan,它们提供内存数据网格,用于提高分布式系统中的数据访问速度。 6. **分布式锁与协调**:例如Zookeeper或Google的Chubby,它们为分布式系统提供一致性服务,如...

    activiti6.0配套源代码

    Activiti 6.0加强了对分布式环境的支持,如使用Hazelcast进行分布式缓存和锁定,这使得Activiti可以在多节点环境中实现高可用性和水平扩展。 7. 工具集成: Activiti 提供了Eclipse插件和Alfresco的集成,方便...

    基于java的开发源码-多播通讯框架 JGroups.zip

    Java多播通讯框架JGroups是Java开发者用于构建...此外,JGroups还广泛应用于其他开源项目,如Hazelcast、Infinispan等分布式缓存系统,以及JBoss AS、WildFly等应用服务器,进一步证明了其在Java生态系统中的重要地位。

    PracticasSistemasDistribuidos145901:分布式系统课程对应的实践

    3. **分布式缓存**:如Hazelcast或Redis这样的缓存系统可以提高响应速度,减少数据库压力。它们可以在集群中自动分发数据,提供高可用性和可伸缩性。 4. **消息队列**:如Apache Kafka或RabbitMQ等消息中间件,允许...

    goldmansachs

    10. **分布式系统**:包括负载均衡、分布式缓存(如Redis、Hazelcast)、消息队列(如RabbitMQ、Kafka)等,这些技术用于构建可扩展和容错的系统。 以上只是Java技术在Goldman Sachs可能涉及的一部分知识点,实际...

    demo-SpringBoot:SpringBoot示例代码

    - SpringBoot 提供了对缓存的支持,可以使用 EhCache、Hazelcast、Infinispan 或 Redis 进行本地或分布式缓存。 8. **测试** - SpringBoot 提供了方便的测试工具,如`@SpringBootTest`注解可以启动整个应用进行...

    节目发行

    如果需要进一步提升性能,还可以使用Hazelcast或Apache Ignite这样的内存数据网格,它们可以在集群中缓存数据,提高读取速度。 除此之外,Apache Kafka可以作为实时数据流处理平台,用于收集、存储和处理来自多个源...

Global site tag (gtag.js) - Google Analytics