分布式缓存服务器设计原理

简介: 1.数据是如何被分布到多个服务器上的?(一致性哈希算法) 假设有n台服务器, 计算这n台服务器的IP地址的哈希值, 把这些哈希值从小到大按顺时针排列组成一个“服务器节点环”, 客户端需要存储一系列的“键值对”到这些服务器上去, 计算这些“键”的哈希值, 看看这些“键”的哈希值落在“服务器环”的哪些区间, 如下图所示: 根据上图示意,数据将被存储在“顺时针方向上的下一个服务器节点” 读取数据时,也是先根据“键”的哈希值,找到这个服务器节点, 再向这个节点索取数据。
1.数据是如何被分布到多个服务器上的?(一致性哈希算法)
假设有n台服务器,
计算这n台服务器的IP地址的哈希值,
把这些哈希值从小到大按顺时针排列组成一个“服务器节点环”,
客户端需要存储一系列的“键值对”到这些服务器上去,
计算这些“键”的哈希值,
看看这些“键”的哈希值落在“服务器环”的哪些区间,
如下图所示:
根据上图示意,数据将被存储在“顺时针方向上的下一个服务器节点”
读取数据时,也是先根据“键”的哈希值,找到这个服务器节点,
再向这个节点索取数据。
2.数据如何均匀的分布?(虚拟服务器)
假设服务器数量较少,
很可能造成有些服务器存储的数据较多、承担的压力较大,
有些服务器就比较空闲。
这时就要把一台服务器虚拟化成多台服务器,
具体的操作办法:
在计算服务器对应的哈希值时
可以在IP地址字符串加多个“尾缀”
比如:
10.0.0.1#1
10.0.0.1#2
10.0.0.1#3
....
这样,一台物理服务器就被虚拟化成多台服务器,
对应“服务器环”上的多个节点。
3.如何实现数据的热备份?
以顺时针方向看“服务器环”
当有客户端把数据存储在第1台服务器上后,
第1台服务器负责把该数据拷贝一份给第2台服务器
以此类推,
也就是说“服务器环”上的每一个节点,都是上一个节点的热备份节点
同时,一个服务器上存了两类数据,一类是自身的业务数据,一类是上一节点的热备数据。
注意:这里所说的服务器,都是物理服务器,不是虚拟服务器。
如下图所示
4.如何让客户端发现所有服务端?
每个服务器节点都要维护一个对照表
这个对照表中包含所有服务器,(IP地址和IP地址的哈希值对照表)
配置客户端时,只要让客户端知道任意一个服务器的IP地址即可
客户端可以通过获取这个服务器的对照表从而知道所有的服务器
客户端初始化的时候,这个对照表也存储在客户端一份
客户端根据这个对照表来存取数据
注意:这个对照表是有一个版本号的,具体的用途见下面的描述
5.如何应对服务器异常?
假设数据在节点1上读写不成功,
我们就认为这个节点存在异常,要把它从服务器群集中拿掉。
客户端先在节点2(节点1的热备节点)上完成相应的读写工作,这时客户端就可以去做其他工作了。
然后节点2向节点0索取数据(这些数据是本应该备份在节点1上的数据)
然后节点2向节点3推送数据(这些数据是节点1上的数据,现在要备份在节点3上)
然后节点2更新其对照表,把节点1从其对照表中移除,并更新对照表的版本号
当有任何客户端与节点2交互的时候,
就会发现节点2上的对照表的版本号比自己持有的对照表要高
此时,客户端就更新自己的对照表
这些客户端再与其他服务器交互的时候
其他服务器发现客户端携带的对照表版本号比自己持有的要高
此时,其他服务器更新自己的对照表
注意:这是一个“发散式的连锁反应”,不会影响生产。
还可以让节点2告知节点3需要更新对照表
当节点3更新完之后,再让节点3告知节点4....
以此引发“环式的连锁反应”
注意:
当“服务器环”上连续两台服务器同时故障的时候,那么这个系统就崩溃了
可以对数据做两次热备份,以提高安全性,但性能和硬件利用率会有所损耗。
6.如何增加服务器?
首先需要通过配置让这台服务器知道节点环上的任意一台服务器的IP地址(假设是10.0.0.1)
此服务端运行之后,他就会从10.0.0.1上获取对照表,
以此知道自己在节点环中的具体位置,
它首先需要从它的下一个节点中迁移一部分数据(也就是它上一个节点热备份的一部分数据)
然后从上一个节点中索取一部分数据(也就是该自己存储的一部分数据)
然后它把自己加入对照表中,
然后告知10.0.0.1需要更新对照表,以此引发连锁反应
 
 
 
此文最初的想法是一个 alexqiu跟我说的,
后来又仔细研究了 一致性哈希算
并加入了我自己的想法(热备机制、配置表保存及升级机制)
最终形成此文。
 
 
2014年4月9号:
针对此文做了技术分享,录音文件地址: http://url.cn/KxFQw5
第一个问题:此文利用IP地址(虚拟IP地址)计算哈希值的办法尚待进一步考虑和验证
第二个问题:增减服务器节点均是在"物理节点环"上完成,与“虚拟节点环”没有关系
第三个问题:除了热备,还可以在热备的基础上实现负载均衡
目录
相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
946 0
|
缓存 监控 定位技术
|
NoSQL 算法 安全
分布式锁—1.原理算法和使用建议
本文主要探讨了Redis分布式锁的八大问题,包括非原子操作、忘记释放锁、释放其他线程的锁、加锁失败处理、锁重入问题、锁竞争问题、锁超时失效及主从复制问题,并提供了相应的优化措施。接着分析了Redis的RedLock算法,讨论其优缺点以及分布式专家Martin对其的质疑。此外,文章对比了基于Redis和Zookeeper(zk)的分布式锁实现原理,包括获取与释放锁的具体流程。最后总结了两种分布式锁的适用场景及使用建议,指出Redis分布式锁虽有性能优势但模型不够健壮,而zk分布式锁更稳定但部署成本较高。实际应用中需根据业务需求权衡选择。
|
弹性计算 资源调度 搜索推荐
阿里云ECS中长期成本节省计划解析:从原理到实战,助力企业降本提效
阿里云ECS节省计划的推出为企业用户提供了一种全新的成本优化方案。通过一次性购买的方式享受长期按量付费的折扣权益,客户不仅可以大幅降低ECS资源的使用成本还可以享受更高的灵活性和便捷性。本文将从多个维度深入剖析阿里云ECS节省计划,包括其核心优势、详尽的购买使用指引、与传统付费模式的全面对比,以及一客户成功案例,以供大家了解和参考。
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
1305 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
存储 Dubbo Java
分布式 RPC 底层原理详解,看这篇就够了!
本文详解分布式RPC的底层原理与系统设计,大厂面试高频,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 RPC 底层原理详解,看这篇就够了!
|
运维 数据挖掘 索引
服务器数据恢复—Lustre分布式文件系统服务器数据恢复案例
5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致这5台节点服务器进水,每台服务器都有至少2块硬盘出现故障。每台服务器中的RAID5阵列短时间内同时掉线2块或以上数量的硬盘,导致RAID崩溃,服务器中数据无法正常读取。
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
1010 4
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
339 3
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
412 1

热门文章

最新文章