前言:本书是对分布式系统架构涉及到的相关技术的一本科普书籍。由于很难作为开发参考,只能但求了解。所以通篇浅读,对分布式系统进行大致的了解。因为写的非常好,感觉非常有意思,自己也做不出总结。所谓的读书笔记也就演变成了摘抄。

简介

一个大型、稳健、成熟的分布式系统的背后,往往会设计众多的支撑系统,我们将这些支撑系统成为分布式系统的基础设施。除了前面所介绍的分布式协作及配置管理系统ZooKeeper,我们进行系统架构设计所依赖的基础设施,还包括分布式缓存系统、持久化存储、分布式消息系统、搜索引擎、以及CDN系统、负载均衡系统、运维自动化系统等,还有实时计算系统、离线计算系统、分布式文件系统、日志收集系统、监控系统、数据仓库等。

分布式缓存

在高并发环境下,大量的读、写请求涌向数据库,磁盘的处理速度与内存显然不在一个量级,从减轻数据库的压力和提供系统响应速度两个角度来考虑,一般都会在数据库之前加一层缓存。由于单台机器的内存资源和承载能力有限,并且如果大量使用本地缓存,也会使相同的数据被不同的节点存储多份,对内存资源造成较大的浪费,因此才催生出了分布式缓存。
接下来将介绍分布式缓存的典型代表memcache,以及分布式缓存的应用场景。最为典型的场景莫过于分布式session。

memcache

memcache是一款开源的高性能的分布式内容对象缓存系统,被许多大型网站所采用,用于在应用中减少对数据库的访问,提高应用的访问速度,并降低数据库的负载。为了在内存中提供数据的高速查找能力,memcache使用key-value形式存储和访问数据,在内存中维护一张巨大的HashTable,使得对数据查询的时间复杂度降低到O(1),保证了对数据的高性能访问。内存的空间总是有限的,当内存没有更多的空间来存储新的数据时,memcache就会使用LRU(Least Recently Used)算法,将最近不常访问的数据淘汰掉,以腾出空间来存放新的数据。memcache存储支持的数据格式也是灵活多样的,通过对象的序列化机制,可以将更高层的对象转换成为二进制数据,存储在缓存服务器中,当前端应用需要时,又可以通过二进制内容反序列化,将数据还原成原有对象。

memcache客户端与服务端通过构建在TCP协议之上的memcache协议来进行通信,协议支持两种数据的传递,这两种数据分别为文本行和非结构化数据。文本行主要用来承载客户端的命令及服务端的响应,而非结构化数据则主要用于客户端和服务端数据的传递。由于非结构化数据采用字节流的形式在客户端和服务端之间进行传输和存储,因此使用方式非常灵活,缓存数据存储几乎没有任何限制,并且服务端也不需要关心存储的具体内容及字节序。

memcache的分布式实现

memcache本身并不是一种分布式的缓存系统,它的分布式是由访问它的客户端来实现的。一种比较简单的实现方式是根据缓存的key来进行Hash,当后端有N台缓存服务器时,访问的服务器为hash(key)%N,这样可以将前端的请求均衡地映射到后端的缓存服务器。但这样也会导致一个问题,一旦后端某台缓存服务器宕机,或者是由于集群压力过大,需要新增缓存服务器时,大部分的key将会重新分布。对于高并发系统来说,这可能会演变成一场灾难,所有的请求将如洪水般疯狂地涌向后端的数据库服务器,而数据库服务器的不可用,将会导致整个应用的不可用,形成所谓的“雪崩效应”。

consistent Hash算法

使用consistent Hash算法能够在一定程度上改善上述问题。该算法早在1997年就在论文Consistent hashing and random trees中被提出,它能够在移除/添加一台缓存服务器时,尽可能小地改变已存在的key映射关系,避免大量key的重新映射。

consistent Hash的原理是这样的,它将Hash函数的值域空间组织成一个圆环,假设Hash函数的值域空间为0~(2的32次方-1),也就是Hash值是一个32位的无符号整型,整个空间按照顺时针的方向进行组织,然后对相应的服务器节点进行Hash,将他们映射到Hash环上,假设有4台服务器分别为node1,node2,node3,node4,它们在环上的位置如图所示。

接下来使用相同的Hash函数,计算出对应的key的Hash值在环上对应的位置。根据consistent Hash算法,按照顺时针方向,分布在node1与node2之间的key,它们的访问请求会被定位到node2,而node2与node4之间的key,访问请求会被定位到node4,以此类推。
假设有新的节点node5增加进来时,假设它被Hash到node2与node4之间,那么受影响的只有node2和node5之间的key,它们将被重新映射到node5,而其他key的映射关系将不会发生改变,这样避免了大量key的重新映射。
当然上面描绘的知识一种理想的情况,各个节点在环上分布得十分均匀。正常情况下,当节点数据较少时,节点的分布可能十分不均匀,从而导致数据访问的倾斜,大量的key被映射到同一台服务器上。为了避免这种情况的出现,可以引入虚拟节点的机制,对每一个服务器节点都计算多个Hash值,每一个Hash值都对应环上一个节点的位置,该节点称为虚拟节点,而key的映射方式不变,只是多了一步从虚拟节点再映射到真实节点的过程。这样,如果虚拟节点的数量足够多,即使只有很少的实际节点,也能够使key分布得相对均衡。

分布式session

对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同服务器之间跳转。那么如何保持服务器之间的session同步呢?传统网站一般通过将一部分数据存储在cookie中,来规避分布式环境下session的操作。这样做的弊端很多,一方面cookie的安全性一直广为诟病,另一方面cookie存储数据的大小是有限制的。随着移动互联网的发展,很多情况下还得兼顾移动端的session需求,使得采用cookie来进行session同步的方式的弊端更为凸显。分布式session正是在这种情况下应运而生的。
对于系统可靠性要求较高的用户,可以将session持久化到DB中,这样可以保证宕机时会话不易丢失,但缺点也是显而易见的,系统的整体吞吐将受到很大的影响。另一种解决方案便是将session统一存储到缓存集群上,如memcache,这样可以保证较高的读、写性能,这一点对于并发量大的系统来说非常重要;并且从安全性考虑,session比较是有有效期的,使用缓存存储,也便于利用缓存的失效机制。使用缓存的缺点是,一旦缓存重启,里面保存的会话也就丢失了,需要重新建立会话。

[读书笔记]大型分布式网站架构设计与实践.分布式缓存相关推荐

  1. java路由架构_《大型分布式网站架构设计与实践》读书笔记之 服务的路由和负载均衡...

    服务的路由和负载均衡 公共的业务被拆分出来,形成可共用的服务,最大程度的保证了代码和逻辑的复用,避免重复建设,这种设计也被成为SOA(Service-Oriented Architecture) SO ...

  2. 大型分布式网站架构设计与实践 笔记

    一.分布式系统的基础设施 二.面向服务的架构 三.面向安全性的架构 四.面向稳定性的架构 1.在线日志分析 2.集群监控   转载于:https://www.cnblogs.com/renwei/p/ ...

  3. 大型分布式网站架构设计与实践

    阅读文本大概需要3分钟. SOA和RPC 随着互联网规模发展,面向服务的体系架构(SOA)成为主流的架构方式,SOA的本质思想是高内聚.低耦合地实现分治,各个系统之间通过服务的方式进行交互,这样保证了 ...

  4. 大型分布式网站架构设计与实践3

    第3章 互联网安全架构 3.1 常见的web攻击手段 3.1.1 XSS攻击 1.xss攻击的全称是跨站脚本攻击,即攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时,脚本程序便开始在客户端的浏览器上 ...

  5. 大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》

    第一章 面向服务的体系架构(SOA) 伴随着互联网的快速发展和演进,不断变化的商业环境所带来的五花八门.无穷无尽的业务需求,使得原有的单一应用架构越来越复杂,越来越难以支撑业务体系的发展,因此,系统拆 ...

  6. 后台开发经典书籍--大型分布式网站架构设计与实践

  7. [读书笔记]《APP研发录》之App图片缓存设计

    图片缓存在Android开发中十分重要,从网络获取图片.显示.回收任一环节有问题都会导致OOM.尤其是列表项,会加载大量网络上的图片.当我们快速滑动列表的时候会很卡,甚至会导致内存溢出而崩溃. 为解决 ...

  8. 大型门户网站架构设计的可伸缩性

    转自:http://siteguide.jzxue.com/jianzhanjingyan/200910/08-2877.html 我们知道,对于一个大型门户网站来说,可伸缩性是非常重要的,怎么样在纵 ...

  9. [读书笔记]读《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》(一)...

    第一条:了解Objective-C 语言的起源 Objective-C为C语言添加了面向对象特性,是其超集.Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型.接收一条消 ...

最新文章

  1. java子类和父类构造函数_java 子类和父类构造函数关系
  2. Scala模式匹配细节说明
  3. WCF技术剖析之十一:异步操作在WCF中的应用(上篇)
  4. mysql定时清空表数据_Mysql实现定时清空一张表的旧数据并保留几条数据
  5. Java中Lambda表达式与方法引用和构造器引用
  6. PHP学习笔记:利用百度api实现手机归属地查询
  7. LINUX下的FTP服务器
  8. 使用SmartSVN打分支与合并代码
  9. 字符串中第一个只出现一次的字符
  10. javaweb面试题目整理
  11. System.Data.SQLite 支持所有(32位、64位的资源下载包)
  12. SCRT同网段的ping不通
  13. Few Shot Vid2Vid 论文心得
  14. 训练深度学习模型时电脑自动重启
  15. 推动铅蓄电池绿色“转身”
  16. 零基础如何学习JAVA编程开发
  17. WPS做好一个PPT后,用microsoft系列的放映软件打开,出现空白页
  18. Matlab模拟分子的布朗运动
  19. Python-Tkinter组件-Text简介
  20. 设置非阻塞socket收发数据

热门文章

  1. gitlab备份及恢复
  2. 2017软件工程实践总结
  3. 机器学习的简单逻辑回归的Advanced Optimization
  4. java中的动态代理----自己手动实现
  5. 补发《超级迷宫》站立会议三
  6. jquery不同版本冲突导致低版本功能不能用
  7. 内存泄露检测 vld
  8. 最常用计算机信息呼唤标准代码,计算机考试题
  9. 计算机 用户创建失败,电脑用户加载错误,无法创建新的配置文件的解决方法...
  10. 客户机-服务器系统,什么是客户机/服务器计算