最近项目中一个分布式应用碰到一些设计问题,听过上次技术沙龙key value store漫谈的同学可能会比较容易理解以下说明。
场景
假定一个有状态的服务,可以理解成web或者socket服务器,每个用户在这个服务上登录后是有状态的,我们把它的状态连同其他加载到内存的用户数据统称用户session。由于session数据实时会变化,加上程序访问session频率大,几乎所有的操作都跟session数据相关,因此不适合放在远程memcached中
第一阶段
考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为 hash() mod n, hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发生故障时,系统无法自动恢复。
第二阶段
为了解决单点故障,使用 hash() mod (n/2), 这样任意一个用户都有2个服务器备选,可由client随机选取。由于不同服务器之间的用户需要彼此交互,所以所有的服务器需要确切的知道用户所在的位置。因此用户位置被保存到memcached中。
当一台发生故障,client可以自动切换到对应backup,由于切换前另外1台没有用户的session,因此需要client自行重新登录。
这个阶段的设计存在以下问题
- 负载不均衡,尤其是单台发生故障后剩下一台会压力过大。
- 不能动态增删节点
- 节点发生故障时需要client重新登录
第三阶段
打算去掉硬编码的hash() mod n 算法,改用一致性哈希(consistent hashing)分布
假如采用Dynamo中的strategy 1(可参看Dynamo: Amazon’s Highly Available Key-value Store, PDF, P216)
我们把每台server分成v个虚拟节点,再把所有虚拟节点(n*v)随机分配到一致性哈希的圆环上,这样所有的用户从自己圆环上的位置顺时针往下取到第一个vnode就是自己所属节点。当此节点存在故障时,再顺时针取下一个作为替代节点。
优点:发生单点故障时负载会均衡分散到其他所有节点,程序实现也比较优雅。
应用一致性哈希分布后若干问题
1.如何解决单点故障时候的session迁移?是否所有session都像Dynamo那样写入到多个节点(或双写)?如果双写所有的服务器需要消耗2倍的内存及更多CPU资源,所以优先不考虑双写方案。
2.如果不双写,则发生故障切换时,即使服务器内部自动帮用户切换节点不重新登录,都需要牵涉到大量session重建,会引起集群震荡。当然这里可以稍微优化,比如session按需建立,IDLE的用户可以先不重建。
3.当故障节点恢复时候如何处理?Dynamo的策略是故障期间所有的数据都属于hinted handoff, 就是备用机起业务代理作用,一旦故障机恢复就立即把所有临时数据从备用机拉回去,然后整个集群恢复正常流程。但由于本场景session数据比较笨重,而且牵涉到复制时存在并发变更,如果直接借鉴Dynamo的话则感觉切换成本过高,大部分开发人员倾向于继续用备用机处理该用户业务。如果恢复正常后不切换,则存在用户位置的不确定性,使用一致性哈希算出来的结果和用户实际所在的节点不同。需要顺着圆环往下找用户,效率很低。因此就有提议把所有用户所在的当前节点位置写入memcached。
5. 假如需要将位置写入memcached,那似乎一致性哈希算法又成了花瓶,完全可以由client在create session时候随机选取一个没有故障的节点, 然后把位置写入memcached, 某个节点发生故障时,client再另外选一个随机的,并把新的位置写入memcached, 所有用户所在节点的位置都通过memcached来存储,服务器之间实时的通讯也通过查询memcached来寻址。从实用的角度来看,这样似乎程序更简单。
因此,一致性哈希分布对于这个场景来说是无用的?
转载地址:http://timyang.net/architecture/consistent-hashing-practice/
相关推荐
一致性哈希算法最初由麻省理工学院的K等人提出,并被广泛应用于分布式系统中,以解决节点动态变化时数据一致性问题。其核心思想是通过引入哈希环,将数据对象均匀分布在哈希环上的不同节点中,以此降低节点变更对...
然而,一致性哈希算法也存在一些问题,比如在节点数量较少时,节点间的数据分布可能不均匀,这会导致某些节点成为瓶颈。 针对一致性哈希算法存在的问题,文中提出了改进方案。该方案主要从以下几个方面进行改进:...
希望本文能够帮助读者更好地理解和应用一致性哈希,解决分布式系统中的数据分布问题。 本文详细介绍了一致性哈希的工作原理和在分布式系统中的应用,包括概念解释、实现代码示例和优势分析。希望这能帮助读者深入...
一致性哈希算法最初由Karger等人提出,目的是解决分布式缓存的问题,它弥补了CARP的不足,并在P2P环境中发挥了DHT(分布式哈希表)的优势。在分布式数据库中,由于节点数量可能会增加或减少,原有的哈希算法可以确保...
一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式系统已经成为支撑大规模服务的关键技术之一。在分布式系统中,多个节点通过网络协同工作,提供高可用性...
本文旨在深入探讨一致性哈希算法的基本原理及其在分布式系统中的应用实践。 #### 分布式缓存问题与传统哈希算法的局限性 在分布式系统中,缓存通常用于减轻数据库的压力,提高系统响应速度。然而,随着系统的扩展和...
分布式存储系统是一类将数据分布存储于多个物理节点上的系统,其设计目的是为了实现数据的可靠存储、高效访问和动态扩展...尽管存在一些需要改进的地方,但一致性哈希算法已经成为分布式系统领域研究和实践的重要基础。
分布式哈希表(Distributed Hash Table,简称DHT)是一种在分布式系统中用以实现大规模数据存储和快速定位的算法。DHT通过分布式的方式将数据以键值对的形式存储在各个节点上,从而实现无需中心服务器的高效数据管理...
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...
一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,尽可能少地改变已经存在的数据分布。在云计算和大数据处理领域,一致性哈希被广泛应用,例如在分布式...
分布式数据插入数据库是一个复杂而关键的任务,特别是在大数据和云计算环境下。一致性哈希算法(Consistent...通过对这些资源的深入学习和实践,可以更好地理解和掌握一致性哈希算法在实际应用中的具体操作和性能考量。
一致性哈希(Consistent Hashing)是一种分布式哈希算法,主要应用于分布式缓存、负载均衡等领域,例如Memcached和Redis等系统。它解决了在分布式环境中数据分片与节点动态增减时,尽量减少数据迁移的问题。带虚拟...
传统的ACID(原子性、一致性、隔离性和持久性)事务在分布式环境中难以实现,因为它们可能导致性能下降或者锁竞争问题。为了解决这一问题,我们可以采用“最终一致性”策略,即允许在一段时间内数据存在短暂不一致,...
分布式哈希表(Distributed Hash Table,DHT)是一种用于分布式系统中的数据存储技术,它将数据分散存储在多台独立的设备...Pastry 的设计和实现对于理解分布式系统、一致性哈希以及 Go 语言的应用有着重要的学习价值。
文章提出的一致性哈希策略在分布式数据库性能拓展的应用,主要是通过一个中心管理节点群来控制所有节点的通信过程,这个中心管理节点群负责处理故障等问题,每个节点对应一类网络管理方式及协议方式。这种设计能够...
一致性哈希算法是一种分布式哈希表(DHT)中用于解决数据分片和负载均衡问题的算法。在大型分布式系统中,例如缓存系统、分布式数据库等,一致性哈希能够确保当节点加入或离开时,尽可能少的数据需要迁移,从而保持...
【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入虚拟节点来优化一致性哈希的分布问题。 1. **普通哈希算法**: - Java中的`HashMap`类是一个典型...
此外,一致性哈希和gRPC等技术也有助于保持节点间的同步。 3. **容错与高可用性**:由于网络的不稳定性和硬件故障,分布式系统必须具备容错能力。例如,通过副本复制(RAID、分布式数据库)、心跳检测和故障恢复...