`

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

 
阅读更多
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地址)计算哈希值的办法尚待进一步考虑和验证
第二个问题:增减服务器节点均是在"物理节点环"上完成,与“虚拟节点环”没有关系
第三个问题:除了热备,还可以在热备的基础上实现负载均衡
 
分享到:
评论

相关推荐

    网站架构技术

    分布式缓存集群的伸缩性设计 memcached分布式缓存集群的访问模型 memcached分布式缓存集群的伸缩性挑战 分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql...

    JAVA高并发高性能高可用高扩展架构视频教程

    企业级分布式缓存技术之(redis详解) 企业高并发基石(Tomcat服务器性能优化) spring事务处理 课程文档 高并发之基础数据MySql调优 mongodb 三级联动课程资料 应用架构之灵魂设计模式 应用架构之魂设计模式实战演练...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等...

    Java思维导图xmind文件+导出图片

    Dubbo设计原理及源码分析 基于Dubbo构建大型分布式电商平台实战雏形 Dubbo容错机制及扩展性分析 分布式解决方案 分布式全局ID生成方案 session跨域共享及企业级单点登录解决方案实战 分布式事务解决方案实战 ...

    自己动手写搜索引擎(罗刚著).doc

    7.3.5 搜索页面的索引缓存与更新 190 7.4 实现关键词高亮显示 191 7.5 实现多维视图 194 7.6 实现相似文档搜索 200 7.7 实现AJAX自动完成 203 7.7.1 总体结构 203 7.7.2 服务器端处理 203 7.7.3 浏览器端处理 205 ...

    ASP3《高级编程》(第一部分)

    13.1 分布式应用程序的结构 408 13.1.1 分层应用程序 408 13.1.2 Windows DNA 410 13.1.3 Windows DNA服务 411 13.1.4 网络结构 413 13.2 组件 415 13.2.1 组件定义 415 13.2.2 COM和COM+ 415 13.2.3 组件...

    ASP3《高级编程》(第二部分)

    13.1 分布式应用程序的结构 408 13.1.1 分层应用程序 408 13.1.2 Windows DNA 410 13.1.3 Windows DNA服务 411 13.1.4 网络结构 413 13.2 组件 415 13.2.1 组件定义 415 13.2.2 COM和COM+ 415 13.2.3 组件...

    基于SpringBoot+Mybatis开发的主从架构的Steam商城,详情请看README+源代码+文档说明+数据库sql

    服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。 # 项目的运行 在...

    亮剑.NET深入体验与实战精要2

    15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪...

    JiveJdon v4.6.1.zip

    JiveJdon基于对象缓存设计原理,大大提升运行速度,并具有良好的可伸缩性,可借助开源云计算内存技术Terracotta(兵马俑 )达到分布式云计算强大处理能力,具体讨论按这里。 2011年jivejdon 4.4的测试样本(Jmeter可...

    亮剑.NET深入体验与实战精要3

    15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪...

    大数据技术及应用教学课件第3章-大数据存储技术.pptx

    分布式存储架构由三个部分组成:客户端、元数据服务器和数据服务器。客户端负责发送读写请求,缓存文件元数据和文件数据。元数据服务器负责管理元数据和处理客户端的请求,是整个系统的核心组件。数据服务器负责...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    高性能MySQL(第3版).part2

    7.11分布式(XA)事务307 7.11.1内部XA事务307 7.11.2外部XA事务308 7.12查询缓存309 7.12.1MySQL如何判断缓存命中309 7.12.2查询缓存如何使用内存311 7.12.3什么情况下查询缓存能发挥作用313 7.12.4如何配置...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    我们掌握了数据库及其应用技术、数据库原理、计算机网络技术等课程,对数据库的设计、应用、维护及局域网的组成有了深刻的认识与一定的动手实践能力,考取了信息处理、程序设计、数据库技术等国家IT认证。...

    Delphi 5编程实例与技巧

    第15章 分布式程序设计 329 15.1 CORBA结构 329 15.1.1 CORBA在数据库的应用 335 15.1.2 远程访问 341 15.1.3 OSFind 341 15.2 远程数据集 342 15.2.1 基础 342 15.2.2 扩展服务器 346 15.2.3 参数传递 353 15.2.4 ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

Global site tag (gtag.js) - Google Analytics