Tim Yang去年在博客(http://timyang.net)讨论一个有状态服务的场景下如何使用一致性哈希算法的问题。其中主要涉及到增加或删除节点时引起的系统震荡。其中也讨论了是否使用随机选取节点,并使用memcached保持选择的方案。
我们知道一致性哈希算法可以很好的解决增加或删除节点时引起的系统震荡问题。采用虚拟节点后,平均的将增删节点产生的震荡分配到其他节点上。测试证实了一致性哈希算法有很良好的平均性。
我们做一个简单测试:
有50个node,200个虚节点,100000个session。分别测试增加10%的节点和删除10%的节点对系统有多少影响。结果分析如下,
Normal case : nodes count : 50
Added case : nodes count : 55
Reduced case : nodes count : 45
85512 --- 85431
Same percent in added case : 89.218124%
Same percent in reduced case : 89.13361%
(增加或删除10%的节点后,仍有约89%的session被分配给原有节点)
但测试中暴露了两个问题,有待以后研究。
一个是随着节点数的增加,分配给每个节点的session不再是非常平均。特别是在环开始的几个节点分配的较少
第二是当节点数量很多时,比如2^32大小的寻址空间上,如果节点数量很大,超过1000个虚节点,算法性能就开始有比较明显的下降。这可能是由于实现问题,但是还需要调研。
回到原来的问题上,即什么样的场景适合使用一致性哈希算法。
这里有两类场景,我们先来讨论比较简单的情况。
场景一
假设有一种静态资源,例如视频、网页、大型log文件等,只有第一次请求时才加载到系统中。我们希望以后每次对相关资源的请求都送达到同一个节点。这样可以最大限度的利用整个集群的能力,这也是CDN的基本思路。
这类场景的特点是,
1,在高并发情况下,如何使多个并发请求都被发送到同一节点。
2,session实际是无状态的
在该情况下,使用一致性哈希是很合适的。我在构建高性能Java服务器中谈到了使用一致性哈希算法替代多线程上同步锁,从而极大的提高系统性能。就是在这个场景下实现的。
场景二
一个有状态服务,持有大量有状态session,且session不断的被更新和查询。
这种类型的session是不可能被实时更新到数据库的,因此它们只能在分布式内存中被保持。由于session更新频繁,且要特别考虑到场景是多线程同时受理对同一session的多个请求。因此我们的考虑是,不能完全把session保存在一个分布式memory中,因为频繁的更新对CPU和网络都有比较大的压力session异步备份,还是那句话,这次业务可以失败,但是系统不能因为业务无法更新而停止工作
可以有几种解决方案,
buddy replication+一致性哈希
借鉴Jboss Cache buddy replication的思路。为了减少网络和被备份节点的压力,我们不希望把session复制到整个cluster上。但是又希望可以当单点crash后从内存恢复数据。因此我们只把session备份到几个节点上,例如当一致性哈希找到了工作节点后,该工作节点再使用固定后缀找到buddy node进行复制。
例如,sessionID+"buddy1";sessionID+"buddy2";
每次更新本地session的同时,节点异步的向buddy中的memcached写一个备份。如果本节点crash,session被分配到其他节点处理,它会试图从buddy的memcached中取回状态。
whole cluster replication
如果你的服务要求一个会话都不能丢失,则只能进行全cluster复制。这样可以保证任何一节点活着就能继续进行业务。我们测试过一些开源产品,比如Jboss InfiniSpan,
在节点数量不大,且网络条件很好的情况,仅用UDP进行whole cluster replication效果就很好。如果参考其实可以发现,通过NIO/TCP进行可序列号对象复制,其速度和可靠性在节点数较多的集群中也可以工作的很好。
以上两种场景在实际运营的系统中都可胜任,当然对于不同客户的不同要求,需要采用不同的架构。另外要考虑到团队的能力,比如团队如果一直基于JBoss开发,且用户对session状态的丢失率有严格要求,则采用Jboss Cache是最简单的方法。尽管它显然没有一致性哈希这么酷:)
本文纯属原创,欢迎转载,请注明原网址;
分享到:
相关推荐
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...
一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,尽可能少地改变已经存在的数据分布。在云计算和大数据处理领域,一致性哈希被广泛应用,例如在分布式...
本文将深入探讨一致性哈希算法的基本概念、工作原理以及在实际场景中的应用和优化策略。 ### 一、一致性哈希算法的起源与基本原理 #### 1. 简单哈希算法的局限性 在传统的分布式系统中,数据的存储和检索往往依赖...
【摘要】中的“高效扩展”和“分布式数据库”是本文的核心话题,研究的是如何利用一致性哈希算法在大数据时代高效地扩展分布式数据库。一致性哈希算法最初由Karger等人提出,目的是解决分布式缓存的问题,它弥补了...
一致性哈希算法作为解决这一问题的重要手段之一,近些年来得到了广泛关注和应用。 一致性哈希算法由David Karger等人在1997年提出,它是一种特殊的哈希算法,主要用于分布式系统中实现负载均衡。与传统的哈希算法...
一致性哈希算法(Consistent Hashing)是一种在分布式系统中实现负载均衡的算法,尤其在分布式缓存如Memcached和Redis等场景下广泛使用。它解决了传统哈希算法在节点增减时导致的大量数据迁移问题,提高了系统的可用...
在了解一致性哈希算法之前,需要了解一个经典的分布式缓存应用场景。假设,我们有三台缓存服务器,用于缓存图片,我们希望这些图片被均匀的缓存在这三台服务器上,以便它们能够分摊缓存的压力。那么,我们应该怎样做...
Mycat一致性哈希算法广泛应用于分布式缓存、负载均衡、数据库分片等场景,特别是在大数据、高并发的互联网应用中,能够有效提升系统的处理能力和稳定性。 总结,Mycat的一致性哈希分片算法是实现高效分布式数据库的...
Mycat 一致性哈希分片算法 Mycat是一款开源的数据库中间件,支持各种数据库...Mycat的一致性哈希分片算法是一个高效、可扩展和灵活的数据分布式存储解决方案,对大规模数据存储和高并发访问的应用场景具有重要意义。
本项目以“基于NIO-EPOOL模型netty实现的具备一致性哈希算法的NAT端口映射器”为主题,深入探讨了Netty在NAT端口映射中的应用,以及一致性哈希算法在此过程中的作用。 首先,我们来了解NIO(Non-blocking I/O,非...
一致性哈希(Consistent Hashing)是一种特殊的哈希算法,它在分布式缓存和负载均衡等场景中被广泛应用。它通过将数据和服务器节点映射到一个哈希环上,提供了一种在节点增减时能够最小化数据重新分配的机制。本文将...
哈希算法在数字签名、加密、数据完整性校验等场景中扮演着核心角色。尽管哈希算法有很多种,如MD5、SHA-1等,但SHA-1由于其良好的安全性和可靠性,成为了非常重要的哈希算法之一。 数字签名是电子商务活动中不可或...
在实际应用中,一致性哈希算法不仅可以用于负载均衡,还可以应用于分布式数据库的分片、分布式缓存系统如Memcached或Redis的集群部署,以及P2P网络中的数据分布等场景。通过精心设计和优化,一致性哈希能够有效地...
其核心是通过哈希算法来创建图像的数字指纹,以便快速比较和识别图像的相似性。 感知哈希算法(Perceptual Hash algorithm)是实现相似图搜索的一种有效方法。它的设计灵感来源于人类视觉系统对图像的感知,即在...
哈希算法是一种单向函数,它将任意长度的输入(也称为预映像)转化为固定长度的输出,这个输出被称为哈希值或消息摘要。哈希算法的设计目标是使得输入的微小...在选择哈希算法时,需要根据应用场景考虑其安全性和效率。
在实际应用中,一致性哈希算法不仅用于分布式缓存系统,还可以用于分布式数据库、CDN内容分发网络等场景,有效解决了动态扩展性和负载均衡的问题。它通过最小化数据迁移,降低了系统在节点变化时的复杂性和性能影响...
在实际应用中,例如在游戏开发、软件发布、数据库索引和云存储服务中,这些哈希算法的C++实现可以帮助确保数据的完整性和一致性,防止数据篡改。同时,通过比较文件的哈希值,可以快速识别两个文件是否相同,这对于...
一致性哈希算法是一种分布式哈希技术,用于解决在分布式缓存、负载均衡系统等场景下节点动态增减时,数据分布的稳定性和效率问题。它最初由麻省理工学院在1997年提出,目的是解决分布式缓存系统中如何均匀分配数据的...