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

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

简介

一个大型、稳健、成熟的分布式系统的背后,往往会设计众多的支撑系统,我们将这些支撑系统成为分布式系统的基础设施。除了前面所介绍的分布式协作及配置管理系统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,它们在环上的位置如图所示。
image
接下来使用相同的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比较是有有效期的,使用缓存存储,也便于利用缓存的失效机制。使用缓存的缺点是,一旦缓存重启,里面保存的会话也就丢失了,需要重新建立会话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宁波保哥后院_如何抛出终极后院电影之夜

宁波保哥后院Most people have the basics of throwing a movie night down: you get a movie, you get snacks, you get comfortable, and boom, you’re done. When it comes to throwing a movie party in the backyard, however, things get a little trickier. Read on as…

大厂前端高频面试问题与答案精选

近日,GitHub上一位名为木易杨(yygmind)的开发者,在 GitHub 中建了一个名为Advanced-Frontend/Daily-Interview-Question项目,该项目每天会更新一道前端大厂面试题,并邀请开发者在issue区中作答,…

Maven打包小技巧--持续更新

NO.1 跳过测试,打包指定环境 mvn clean install -Dmaven.test.skiptrue -P dev 其中:clean将target目录中的文件移除; install根据配置文件,将本地工程打包成jar/war包; -Dmaven.test.skiptrue,打包时路过测…

OpenLayers学习笔记5——使用jQuery UI实现查询并标注(UI篇)

近期事情非常多,老板给的压力也非常大。经常出差,另外项目和个人研究还都要跟上,本月要交论文,还要写专利,仅仅能抽时间来学习其它的东西了。 关于OpenLayers的在博客中不会写太多详细的实现(网上有非常多o…

C++ 排序函数 sort(),qsort()的用法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名功能描述sort对给定区间所有元素进行排序stable_s…

.net core 实现默认图片

web 上 如果图片不存在 一般是打xx 这时候 一般都是会设置默认的图片 代替 现在用中间件的方式实现统一设置 一次设置 全部作用 .net core 实现默认图片 Startup 文件 app.UseDefaultImage(defaultImagePath: Configuration.GetSection("defaultImagePath").Va…

spring cloud config将配置存储在数据库中

转载请标明出处: https://blog.csdn.net/forezp/...本文出自方志朋的博客 Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓库,放在本地是将将所有的配置文件统一写在Config Server工程目录下,如果需要修改配置&#xff0…

VMware虚拟机VMware Authorization Service不能启动问题

出现VMware Authorization Service不能启动问题,注意要在安装VMware Player时使用管理员权限转载于:https://www.cnblogs.com/mingzhang/p/9152873.html

PHP替换回车换行的三种方法

一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,世界是多样的!本来在Unix世界换行用/n来代替换行,Windows为了体现不同,就用/r/n,更有意思的是,Mac中又用了/r。所以&a…

全球的weex资源都在这里

WeeX FAQ QQ: Weex大前端 516682889Weexbox: 943913583WeeX相关资源 weex官方资源 weex官网 Weex Market 已挂 : 一个提供 Weex 第三方组件的网站,您可以在这里找到你需要的 Weex 组件。 Playground : Playground在线,直接在线编写代码并预览…

初步解决博客园代码高亮的一个方案

今天我要推荐的是一个免费而且支持markdown语法的软件——Typora 它有很多优点,支持多种类型代码的高亮风格,方便的排版处理,支持Latex等,最重要的一点是真正做到了所见即所得ヽ(゚∀゚)メ(&#x…

git工作原理

工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。版本库&#xf…

【前端基础进阶】JS-Object 功能详解

Object.assign(target,source1,source2,...)该方法主要用于对象的合并,将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性,不拷贝继承的属性。Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说&am…

解决“无法从套接字读取更多数据”

重启下Oralce服务即可。转载于:https://www.cnblogs.com/fkeyta/p/9153297.html

网页下载Google Play 的App

网页下载Google Play 的App 文章目录[点击展开](?)[] 前言 当你想在google play上下载某个应用,而无奈手机的系统并没有安装google servicess,此刻是否有些捉急? 本文分享的是一个网站,它可以无需手机而直接通过网页下载Google P…

“硬核”代码重构

在学习编程的路上,相信大家这几个词一定不少听,什么 面相对象、封装继承多态、内功心法21种设计模式 等等 。但是却很少用到,或者说用到的都是被动使用。大牛们在写代码前早就构思好了,接口,基类等等。自己写代码的时候…

上传jar包到nexus私服

进入maven管理页面&#xff0c;登录管理员账号 完成后可以进入对应目录下查看pom依赖 通过maven的方式depoly 在maven的conf/setting.xml 配置nexus私服的管理账号 在servers标签下添加server <server><id>nexus-snapshots</id><username>repouser<…

手把手教你写高质量Android技术博客,画图工具,录像工具,Markdown写法

前言 作为程序员&#xff0c;写博客是一件很有意义的事情&#xff0c;可以加深自己对技术的理解&#xff0c;可以结交更多的朋友&#xff0c;记录自己的技术轨迹&#xff0c;而且分享可以让更多的人从中受益&#xff0c;独乐乐不如众乐乐嘛。 但是要写好博客也不是件容易的事&a…

【Android】RxJava的使用(四)线程控制 —— Scheduler

前言 经过前几篇的介绍&#xff0c;对RxJava对模式有了一定的理解&#xff1a;由Observable发起事件&#xff0c;经过中间的处理后由Observer消费。&#xff08;对RxJava还不了解的可以出门左拐&#xff09;之前的代码中&#xff0c;事件的发起和消费都是在同一个线程中执行&am…

sed: -e expression #1, unknown option to `s'解决办法

报错如下&#xff1a; sed: -e expression #1, char 13: unknown option to s 需要替换的行为&#xff1a; monitor.urlhttp://192.168.25.100:8443/rest 查询资料得知&#xff0c;报错是因为替换的字符串包含有分隔符/ 所以这行改一下分隔符就可以解决问题了 改成感叹号!或者|…