‘壹’ 对于SSD来说缓存很重要吗为什么许多SSD都没有缓存
1、任何ssd都有缓存的,只是有的做到了主控里,有的外置了,有的小有的大而已。
2、不同的主控算法对缓存大小的需求不同。
无缓存是当前固态硬盘的主流发展方向,这是价格导向决定的。DRAM缓存对于固态硬盘来说并不是必须的,而且固态硬盘的缓存跟机械硬盘的缓存不同,里边存储的是FTL闪存映射表,而非用户读写的数据缓冲,不直接影响到读写性能表现。
虽然无缓存的硬盘理论上4K读取会比有缓存的低一些,但并不绝对。譬如东芝TR200就属于无缓存的SATA固态硬盘,但是在CPU主频足够的情况下,4K QD1随机读取可以达到50多MB/s,不比任何有缓存的固态硬盘差。
优势:
在SSD作为缓存的方案中,缓存控制器——位于阵列前部或在服务器内部位置——可以监控热点I/O应用并制作其复本放在SSD上作为缓存,这样可以较传统的磁盘实现更快速的访问速率。这种方式的好处在于任何繁忙的应用程序可以获得性能上的提升,并且这种环境中的性能通常当缓存加入后可以立即提升。
以上内容参考:网络-SSD缓存
‘贰’ 如何使用redis做mysql的缓存
应用Redis实现数据的读写,同时利用队列处理器定时将数据写入MySQL。
同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。
这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很推荐。
《内存数据库和mysql的同步机制》
redis如何做到和mysql数据库的同步
【方案一】http://www.hu.com/question/23401553?sort=created
程序实现mysql更新、添加、删除就删除redis数据。
程序查询redis,不存在就查询mysql并保存redis
redis和mysql数据的同步,代码级别大致可以这样做:
读: 读redis->没有,读mysql->把mysql数据写回redis
写: 写mysql->成功,写redis(捕捉所有mysql的修改,写入和删除事件,对redis进行操作)
【方案二】http://www.linuxidc.com/Linux/2015-01/380.htm
实时获取mysql binlog进行解析,然后修改redis
MySQL到Redis数据方案
无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。
那么理论上我们也可以用同样方式,分析MySQL的binlog文件并将数据插入Redis。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的。
因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQL UDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易操作。
【方案三】
使用mysql的udf,详情请看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然后通过trigger在表update和insert之后进行函数的调用,写入到redis中去。大致是这个样子。
【http://www.hu.com/question/27738066】
1.首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是数据库操作上,再继续往下看。
2.明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等,redis要自己去实现分布式缓存(貌似最新版本的已集成),自己去实现一致性hash。因为不知道你们的应用场景,不好说一定要用memcache还是redis,说不定用MongoDB会更好,比如在存储日志方面。
3.缓存量大但又不常变化的数据,比如评论。
4.你的思路是对的,清晰明了,读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。
5.考虑是否需要主从,读写分离,考虑是否分布式部署,考虑是否后续水平伸缩。
6.想要一劳永逸,后续维护和扩展方便,那就将现有的代码架构优化,按你说的替换数据库组件需要改动大量代码,说明当前架构存在问题。可以利用现有的一些框架,比如SpringMVC,将你的应用层和业务层和数据库层解耦。再上缓存之前把这些做好。
7.把读取缓存等操作做成服务组件,对业务层提供服务,业务层对应用层提供服务。
8.保留原始数据库组件,优化成服务组件,方便后续业务层灵活调用缓存或者是数据库。
9.不建议一次性全量上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换至核心业务。
10.刷新内存,以memcached为例,新增,修改和删除操作,一般采用lazy load的策略,即新增时只写入数据库,并不会马上更新Memcached,而是等到再次读取时才会加载到Memcached中,修改和删除操作也是更新数据库,然后将Memcached中的数据标记为失效,等待下次读取时再加载。
‘叁’ Redis 都有哪些应用场景
缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。
共享Session:对于一些依赖 session 功能的服务来说,如果需要从单机变成集群的话,可以选择 redis 来统一管理 session。
消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功 能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功 能基本可以满足。比如在分布式爬虫系统中,使用 redis 来统一管理 url队列。
分布式锁:在分布式服务中。可以利用Redis的setnx功能来编写分布式的锁,虽然这个可能不是太常用。 当然还有诸如排行榜、点赞功能都可以使用 Redis 来实现,但是 Redis 也不是什么都可以做,比如数据量特别大时,不适合 Redis,我们知道 Redis 是基于内存的,虽然内存很便宜,但是如果你每天的数据量特别大,比如几亿条的用户行为日志数据,用 Redis 来存储的话,成本相当的高。
‘肆’ redis一般用来干嘛
redis是一个单线程的NoSQL数据库,主要用来做数据缓存,一般大型网站的应用和数据库之间的那一层就是Redis。比如京东商城的页面查找功能,用户接触到的查询的第一层就是Redis数据缓存层,缓存中找不到的数据,再进入数据库查询。Redis中缓存热点数据,能够保护数据库,提高查询效率。
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
‘伍’ SpringBoot进阶之缓存中间件Redis
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 “基础知识” 的铺垫
“大佬可以绕过 ~”
本节给大家讲讲 “Java的SpringBoot框架” , 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以 springboot 来构建项目了,一个稳健的系统需要引入稳定的技术~
如果你是一路看过来的,很高兴你能够耐心看完。前几期都是带大家学习了 SpringBoot 的基础使用以及集成 mybatis 开发,这也是我们写业务的基础,如果你还不熟悉这些,请先看完它们。接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ,本期将会给大家讲解最热门的缓存中间件技术 Redis ,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
Redis 是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。全称叫 Remote Dictionary Server(远程数据服务) 是由 C语言 编写的,Redis是一个 key-value 存储系统,它支持丰富的数据类型,如: string、list、set、zset(sorted set)、hash 。
它本质上是一种键值对数据库,我们之前学习的 mysql 它是持久层的关系型数据库,而 redis 它的存储主要存在 内存 中。我们都知道在 内存 中的数据读取是非常快的,就好比你把一个变量存到磁盘读取和直接放到代码中运行,肯定是在代码中拿到的速度快,因为运行时期,都是直接存到内存的。
给大家总结一下:
有了基本的概念之后,我们下面进行环境搭建,在学习阶段,安装 redis 很简单,生产环境一般我们也会选择云产品,一切为了服务保障,虽说它只是做缓存用,但也是系统的一把 保护伞
如果你是 mac 用户,你可以运行如下命令:
安装完成后会提示你运行命令,运行即可。
win 用户也很简单,直接下载 redis 软件,双击运行即可,运行之后它会有一个小方块的图案,和 locahost:6379 的log,说明运行成功了。初始阶段没有配置的 redis 默认 host 就是本地, port 就是 6379 , 而且是 没有密码 就可以访问的。
推荐一个客户端软件 Redis Desktop Manager ,它是 redis 的客户端界面软件,方便面我们学习的时候 清理缓存 使用,生产慎连。
我们不给大家讲它的基本命令使用,它也有语法,可以通过类似命令执行,如果想学习的小伙伴,可以自行搜索。本期重点内容是在 sprinboot 中的使用,我们平时开发不可能是去命令行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以操作它了,不用记一些繁琐的命令,下面我们就实际操作一下:
修改 pom.xml
修改 application.yml :
redis 默认是有 16 个库,不是 15 个啊,从 0 开始算的,我们随便连一个
通过代码很好理解, 首先需要引入 StringRedisTemplate ,然后需要设置一个 key ,那么思考一下,这个 key 允许重复吗
我们进客户端看一下,发现 key 还是只有一个,但是值变成了新的值了,所以可以得知 key 是唯一的,我们重新设置的时候相当于刷新了它。
在 redis 中删除缓存有两种方式,一种是自我消亡,也就是 过期 销毁,还有有一种是 主动 销毁,我们先看一下,过期时间如何设置
我们设置了 10s 后过期,过完10s后发现,这个```key data``消失了。我们在看看如何主动删除
我们可以利用 Redis 做一个计数器,实现自增功能,你可以用它做网站访问统计
通常做法,我们会把它封装一下,后续使用直接引入封装好的即可,把它直接交给 Springboot容器 管理
其实这个类,你还可以继续进一步封装,比如约束 key 的规范,约束过期时间,约束数据类型等等,这一切也都是为了规范和后期维护,防止滥用缓存
缓存的主要场景是用于解决热点数据问题,因为这些数据是访问频率比较高的,当大量的请求进来, mysql 可能压力很大,这样一来,数据查询效率就很慢,用户肯不高兴等了,这样用户体验很不好。所以我们一般做法,都是把这些热点数据放到缓存里,因为缓存读取速度很快。当有新数据的时候,我们再及时更新它,一般流程是先查询缓存,查到了直接返回缓存数据,查不到再走数据库,然后再刷回缓存。
但是并发足够大的时候,还是会暴露出很多问题,比如面试常问的一些高频问题 缓存雪崩、缓存穿透、缓存雪崩 ,这些问题后边会给大家专门讲,和如何去防范。所以总的来说,引入任何一门技术并不是万事大吉,还需我们不断的在实践中积累经验
本期到这里就结束了,总结一下,我们了解了什么是 redis ,以及在 springboot 中如何去使用它们,很简单,没什么复杂的东西。但这里想多说一点的是,缓存的设计却是很复杂的,因为工具是死的,人是活的,我们如何正确设计,需要我们在项目中不断的积累。
我们之前教大家查询列表数据,都是所有数据返回,还没有教大家如何去做分页,下期将带大家学习一下 mybatis 分页插件的使用 ,下期不见不散, 关注我,不迷路~
‘陆’ 全面的硬盘知识
硬盘,英文“hard-disk”简称HD 。是一种储存量巨大的设备,作用是储存计算机运行时需要的数据。
体现硬盘好坏的主要参数为传输率,其次的为转速、单片容量、寻道时间、缓存、噪音和S.M.A.R.T.
1956年IBM公司制造出世界上第一块硬盘350 RAMAC(Random Access Method of Accounting and Control),它的数据为:容量5MB、盘片直径为24英寸、盘片数为50片、重量上百公斤。盘片上有一层磁性物质,被轴带着旋转,有磁头移动着存储数据,实现了随机存取。
1970年磁盘诞生
1973年IBM公司制造出了一台640MB的硬盘、第一次采用“温彻斯特”技术,是现在硬盘的开端,因为磁头悬浮在盘片上方,所以镀磁的盘片在密封的硬盘里可以飞速的旋转,但有好几十公斤重。
1975年Soft-adjacent layer(软接近层)专利的MR磁头结构产生
1979年IBM发明了薄膜磁头,这意味着硬盘可以变的很小,速度可以更快,同体积下硬盘可以更大。
1979年IBM 3370诞生,它是第一款采用thin-film感应磁头及Run-Length-Limited(RLL)编码配置的硬盘,"2-7"RLL编码将能减小硬盘错误
1986年IBM 9332诞生,它是第一款使用更高效的1-7 run-length-limited(RLL)代码的硬盘。
1989年第一代MR磁头出现
1991年IBM磁阻MR(Magneto Resistive)磁头硬盘出现。带动了一个G的硬盘也出现。磁阻磁头对信号变化相当敏感,所以盘片的存储密度可以得到几十倍的提高。意味着硬盘的容量可以作的更大。意味着硬盘进入了G级时代。
1993年GMR(巨磁阻磁头技术)推出,这使硬盘的存储密度又上了一个台阶。
认识硬盘
硬盘是电脑中的重要部件,大家所安装的操作系统(如:Windows 9x、Windows 2k…)及所有的应用软件(如:Dreamwaver、Flash、Photoshop…)等都是位于硬盘中,或许你没感觉到吧!但硬盘确实非常重要,至少目前它还是我们存储数据的主要场所,那你对硬盘究竟了解多少了?可能你对她一窍不通,不过没关系,请见下文。
一、硬盘的历史与发展
从第一块硬盘RAMAC的产生到现在单碟容量高达15GB多的硬盘,硬盘也经历了几代的发展,下面就介绍一下其历史及发展。
1.1956年9月,IBM的一个工程小组向世界展示了第一台磁盘存储系统IBM 350 RAMAC(Random Access Method of Accounting and Control),其磁头可以直接移动到盘片上的任何一块存储区域,从而成功地实现了随机存储,这套系统的总容量只有5MB,共使用了50个直径为24英寸的磁盘,这些盘片表面涂有一层磁性物质,它们被叠起来固定在一起,绕着同一个轴旋转。此款RAMAC在那时主要用于飞机预约、自动银行、医学诊断及太空领域内。
2.1968年IBM公司首次提出“温彻斯特/Winchester”技术,探讨对硬盘技术做重大改造的可能性。“温彻斯特”技术的精隋是:“密封、固定并高速旋转的镀磁盘片,磁头沿盘片径向移动,磁头悬浮在高速转动的盘片上方,而不与盘片直接接触”,这也是现代绝大多数硬盘的原型。
3.1973年IBM公司制造出第一台采用“温彻期特”技术的硬盘,从此硬盘技术的发展有了正确的结构基础。
4.1979年,IBM再次发明了薄膜磁头,为进一步减小硬盘体积、增大容量、提高读写速度提供了可能。
5.80年代末期IBM对硬盘发展的又一项重大贡献,即发明了MR(Magneto Resistive)磁阻,这种磁头在读取数据时对信号变化相当敏感,使得盘片的存储密度能够比以往20MB每英寸提高了数十倍。
6.1991年IBM生产的3.5英寸的硬盘使用了MR磁头,使硬盘的容量首次达到了1GB,从此硬盘容量开始进入了GB数量级。
7.1999年9月7日,Maxtor宣布了首块单碟容量高达10.2GB的ATA硬盘,从而把硬盘的容量引入了一个新里程碑。
8.2000年2月23日,希捷发布了转速高达15,000RPM的Cheetah X15系列硬盘,其平均寻道时间只有3.9ms,这可算是目前世界上最快的硬盘了,同时它也是到目前为止转速最高的硬盘;其性能相当于阅读一整部Shakespeare只花.15秒。此系列产品的内部数据传输率高达48MB/s,数据缓存为4~16MB,支持Ultra160/m SCSI及Fibre Channel(光纤通道) ,这将硬盘外部数据传输率提高到了160MB~200MB/s。总得来说,希捷的此款("積架")Cheetah X15系列将硬盘的性能提高到了一个新的里程碑。
9.2000年3月16日,硬盘领域又有新突破,第一款“玻璃硬盘”问世,这就是IBM推出的Deskstar 75GXP及Deskstar 40GV,此两款硬盘均使用玻璃取代传统的铝作为盘片材料,这能为硬盘带来更大的平滑性及更高的坚固性。另外玻璃材料在高转速时具有更高的稳定性。此外Deskstar 75GXP系列产品的最高容量达75GB,这是目前最大容量的硬盘,而Deskstar 40GV的数据存储密度则高达14.3 十亿数据位/每平方英寸,这再次涮新数据存储密度世界记录。
二、硬盘分类
目前的硬盘产品内部盘片有:5.25,3.5,2.5和1.8英寸(后两种常用于笔记本及部分袖珍精密仪器中,现在台式机中常用3.5英寸的盘片);如果按硬盘与电脑之间的数据接口,可分为两大类:IDE接口及SCSI接口硬盘两大阵营。
三、技术规格
目前台式机中硬盘的外形差不了多少,在技术规格上有几项重要的指标:
1.平均寻道时间(average seek time),指硬盘磁头移动到数据所在磁道时所用的时间,单位为毫秒(ms)。注意它与平均访问时间的差别,平均寻道时间当然是越小越好,现在选购硬盘时应该选择平均寻道时间低于9ms的产品。
2.平均潜伏期(average latency),指当磁头移动到数据所在的磁道后,然后等待所要的数据块继续转动(半圈或多些、少些)到磁头下的时间,单位为毫秒(ms)。
3.道至道时间(single track seek),指磁头从一磁道转移至另一磁道的时间,单位为毫秒(ms)。
4.全程访问时间(max full seek),指磁头开始移动直到最后找到所需要的数据块所用的全部时间,单位为毫秒(ms)。
5.平均访问时间(average access),指磁头找到指定数据的平均时间,单位为毫秒。通常是平均寻道时间和平均潜伏时间之和。注意:现在不少硬盘广告之中所说的平均访问时间大部分都是用平均寻道时间所代替的。
6.最大内部数据传输率(internal data transfer rate),也叫持续数据传输率(sustained transfer rate),单位Mb/S(注意与MB/S之间的差别)。它指磁头至硬盘缓存间的最大数据传输率,一般取决于硬盘的盘片转速和盘片数据线密度(指同一磁道上的数据间隔度)。注意,在这项指标中常常使用Mb/S或Mbps为单位,这是兆位/秒的意思,如果需要转换成MB/S(兆字节/秒),就必须将Mbps数据除以8(一字节8位数)。例如,WD36400硬盘给出的最大内部数据传输率为131Mbps,但如果按MB/S计算就只有16.37MB/s(131/8)。
7.外部数据传输率:通称突发数据传输率(burst data transfer rate),指从硬盘缓冲区读取数据的速率,在广告或硬盘特性表中常以数据接口速率代替,单位为MB/S。目前主流硬盘普通采用的是Ultra ATA/66,它的最大外部数据率即为66.7MB/s,而在SCSI硬盘中,采用最新的Ultra 160/m SCSI接口标准,其数据传输率可达160MB/s,采用Fibra Channel(光纤通道),最大外部数据传输将可达200MB/s。在广告中我们有时能看到说双Ultra 160/m SCSI的接口,这理论上将最大外部数据传输率提高到了320MB/s,但目前好像还没有结合有此接口的产品推出。
8.主轴转速:是指硬盘内主轴的转动速度,目前ATA(IDE)硬盘的主轴转速一般为5400~7200rpm,主流硬盘的转速为7200RPM,至于SCSI硬盘的主轴转速可达一般为7200~10,000RPM,而最高转速的SCSI硬盘转速高达15,000RPM(即希捷“積架X15”系列硬盘)。
9.数据缓存:指在硬盘内部的高速存储器:目前硬盘的高速缓存一般为512KB~2MB,目前主流ATA硬盘的数据缓存应该为2MB,而在SCSI硬盘中最高的数据缓存现在已经达到了16MB。对于大数据缓存的硬盘在存取零散文件时具有很大的优势。
10.硬盘表面温度:它是指硬盘工作时产生的温度使硬盘密封壳温度上升情况。这项指标厂家并不提供,一般只能在各种媒体的测试数据中看到。硬盘工作时产生的温度过高将影响薄膜式磁头(包括GMR磁头)的数据读取灵敏度,因此硬盘工作表面温度较低的硬盘有更好的数据读、写稳定性。如果对于高转速的SCSI硬盘一般来说应该加一个硬盘冷却装置,这样硬盘的工作稳定性才能得到保障。
11.MTBF(连续无故障时间):它指硬盘从开始运行到出现故障的最长时间,单位是小时。一般硬盘的MTBF至少在30000或40000小时。这项指标在一般的产品广告或常见的技术特性表中并不提供,需要时可专门上网到具体生产该款硬盘的公司网址中查询。
四、接口标准
ATA接口,这是目前台式机硬盘中普通采用的接口类型。
ST-506/412接口:
这是希捷开发的一种硬盘接口,首先使用这种接口的硬盘为希捷的ST-506及ST-412。ST-506接口使用起来相当简便,它不需要任何特殊的电缆及接头,但是它支持的传输速度很低,因此到了1987年左右这种接口就基本上被淘汰了,采用该接口的老硬盘容量多数都低于200MB。早期IBM PC/XT和PC/AT机器使用的硬盘就是ST-506/412硬盘或称MFM硬盘,MFM(Modified Frequency Molation)是指一种编码方案 。
ESDI接口:
即(Enhanced Small Drive Interface)接口,它是迈拓公司于1983年开发的。其特点是将编解码器放在硬盘本身之中,而不是在控制卡上,理论传输速度是前面所述的ST-506的2…4倍,一般可达到10Mbps。但其成本较高,与后来产生的IDE接口相比无优势可言,因此在九十年代后就补淘汰了
IDE及EIDE接口:
IDE(Integrated Drive Electronics)的本意实际上是指把控制器与盘体集成在一起的硬盘驱动器,我们常说的IDE接口,也叫ATA(Advanced Technology Attachment)接口,现在PC机使用的硬盘大多数都是IDE兼容的,只需用一根电缆将它们与主板或接口卡连起来就可以了。 把盘体与控制器集成在一起的做法减少了硬盘接口的电缆数目与长度,数据传输的可靠性得到了增强,硬盘制造起来变得更容易,因为厂商不需要再担心自己的硬盘是否与其它厂商生产的控制器兼容,对用户而言,硬盘安装起来也更为方便。
ATA-1(IDE):
ATA是最早的IDE标准的正式名称,IDE实际上是指连在硬盘接口的硬盘本身。ATA在主板上有一个插口,支持一个主设备和一个从设备,每个设备的最大容量为504MB,ATA最早支持的PIO-0模式(Programmed I/O-0)只有3.3MB/s,而ATA-1一共规定了3种PIO模式和4种DMA模式(没有得到实际应用),要升级为ATA-2,你需要安装一个EIDE适配卡。
ATA-2(EIDE Enhanced IDE/Fast ATA):
这是对ATA-1的扩展,它增加了2种PIO和2种DMA模式,把最高传输率提高到了16.7MB/s,同时引进了LBA地址转换方式,突破了老BIOS固有504MB的限制,支持最高可达8.1GB的硬盘。如你的电脑支持ATA-2,则可以在CMOS设置中找到(LBA,LogicalBlock Address)或(CHS,Cylinder,Head,Sector)的设置。其两个插口分别可以连接一个主设备和一个从设置,从而可以支持四个设备,两个插口也分为主插口和从插口。通常可将最快的硬盘和CD—ROM放置在主插口上,而将次要一些的设备放在从插口上,这种放置方式对于486及早期的Pentium电脑是必要的,这样可以使主插口连在快速的PCI总线上,而从插口连在较慢的ISA总线上。
ATA-3(FastATA-2):
这个版本支持PIO-4,没有增加更高速度的工作模式(即仍为16.7MB/s),但引入了简单的密码保护的安全方案,对电源管理方案进行了修改,引入了S.M.A.R.T(Self-Monitoring,Analysis and Reporting Technology,自监测、分析和报告技术)
ATA-4(UltraATA、UltraDMA、UltraDMA/33、UltraDMA/66):
这个新标准将PIO-4下的最大数据传输率提高了一倍,达到33MB/s,或更高的66MB/s。它还在总线占用上引入了新的技术,使用PC的DMA通道减少了CPU的处理负荷。要使用Ultra-ATA,需要一个空闲的PCI扩展槽,如果将UltraATA硬盘卡插在ISA扩展槽上,则该设备不可能达到其最大传输率,因为ISA总线的最大数据传输率只有8MB/s 。其中的Ultra ATA/66(即Ultra DMA/66)是目前主流桌面硬盘采用的接口类型,其支持最大外部数据传输率为66.7MB/s。
Serial ATA:
新的Serial ATA(即串行ATA),是英特尔公司在今年IDF(Intel Developer Forum,英特尔开发者论坛) 发布的将于下一代外设产品中采用的接口类型,就如其名所示,它以连续串行的方式传送资料,在同一时间点内只会有1位数据传输,此做法能减小接口的针脚数目,用四个针就完成了所有的工作(第1针发出、2针接收、3针供电、4针地线)。这样做法能降低电力消耗,减小发热量。最新的硬盘接口类型ATA-100就是Serial ATA是初始规格,它支持的最大外部数据传输率达100MB/s,上面介绍的那两款IBM Deskstar 75GXP及Deskstar 40GV就是第一次采用此ATA-100接口类型的产品。在2001年第二季度将推出Serial ATA 1x标准的产品,它能提高150MB/s的数据传输率。对于Serial ATA接口,一台电脑同时挂接两个硬盘就没有主、从盘之分了,各设备对电脑主机来说,都是Master,这样我们可省了不少跳线功夫。
SCSI接口:
SCSI就是指Small Computer System Interface(小型计算机系统接口),它最早研制于1979,原是为小型机的研制出的一种接口技术,但随着电脑技术的发展,现在它被完全移植到了普通PC上。现在的SCSI可以划分为SCSI-1和SCSI-2(SCSI Wide与SCSI Wind Fast),最新的为SCSI-3,不过SCSI-2是目前最流行的SCSI版本。 SCSI广泛应用于如:硬盘、光驱、ZIP、MO、扫描仪、磁带机、JAZ、打印机、光盘刻录机等设备上。它的优点非常多主要表现为以下几点:
1、适应面广; 使用SCSI,你所接的设备就可以超过15个,而所有这些设备只占用一个IRQ,这就可以避免IDE最大外挂15个外设的限制。
2、多任务;不像IDE,SCSI允许对一个设备传输数据的同时,另一个设备对其进行数据查找。这将在多任务操作系统如Linux、Windows NT中获得更高的性能。
3、宽带宽;在理论上,最快的SCSI总线有160MB/s的带宽,即Ultra 160/s SCSI;这意味着你的硬盘传输率最高将达160MB/s(当然这是理论上的,实际应用中可能会低一点)。
4、少CPU占用率
从最早的SCSI到现在Ultra 160/m SCSI,SCSI接口具有如下几个发展阶段
1、SCSI-1 —最早SCSI是于1979年由美国的Shugart公司(Seagate希捷公司的前身)制订的,并于1986年获得了ANSI(美国标准协会)承认的SASI(Shugart Associates System Interface施加特联合系统接口) ,这就是我们现在所指的SCSI -1,它的特点是,支持同步和异步SCSI外围设备;支持7台8位的外围设备最大数据传输速度为5MB/S;支持WORM外围设备。
2、SCSI-2 —90年代初(具体是1992年),SCSI发展到了SCSI-2,当时的SCSI-2 产品(通称为Fast SCSI)是能过提高同步传输时的频率使数据传输率提高为10MB/S,原本为8位的并行数据传输称为:Narrow SCSI;后来出现了16位的并行数据传输的WideSCSI,将其数据传输率提高到了20MB/S 。
3、SCSI-3 —1995年推出了SCSI-3,其俗称Ultra SCSI,全称为SCSI-3 Fast-20 Parallel Interface(数据传输率为20M/S)它采用了同步传输时钟频率提高到20MHZ以提高数据传输的技术,因此使用了16位传输的Wide模式时,数据传输即可达到40MB/s。其允许接口电缆的最大长度为1.5米。
4、1997年推出了Ultra 2 SCSI(Fast-40),其采用了LVD(Low Voltage Differential,低电平微分)传输模式,16位的Ultra2SCSI(LVD)接口的最高传输速率可达80MB/S,允许接口电缆的最长为12米,大大增加了设备的灵活性。
5、1998年9月更高的数据传输率的Ultra160/m SCSI(Wide下的Fast-80)规格正式公布,其最高数据传输率为160MB/s,这将给电脑系统带来更高的系统性能。
现有最流行的串行硬盘技术
随着INTEL的915平台的发布,最新的ICH6-M也进入了我们的视野。而ICH6除了在一些电源管理特性方面有所增强外,也正式引入了SATA(串行ATA,以下简称SATA)和PCI-E概念。对于笔记本来说,从它诞生的那天起就一直使用着PATA(并行ATA,以下简称PATA)来连接硬盘,SATA的出现无疑是一项硬盘接口的革命。而如今随着INTEL的积极推动,笔记本也开始迈入SATA的阵营。
关于SATA的优势,笔者相信诸位也都有了解。确实,比起PATA,SATA有着很多不可比拟的优势,而笔者将在本文中透过技术细节来多其进行分析。相信您读完本文后会对SATA有着更深入的了解。另外由于本文主要针对笔记本和台式机,所以诸如RAID等技术不在本文讨论范围之内。
串行通信和并行通信
再进行详细的介绍之前,我们先了解一下串行通信和并行通信的特点。
一般来说,串行通信一般由二根信号线和一根地线就可完成互相的信息的传送。如下图,我们看到设备A和设备B之间的信号交换仅用了两根信号线和一根地线就完成了。这样,在一个时钟内,二个bit的数据就会被传输(每个方向一个bit,全双工),如果能时钟频率足够高,那么数据的传输速度就会足够快。
如果为了节省成本,我们也可以只用一根信号线和一根地线连接。这样在一个时钟内只有一个bit被传输(半双工),我们也同样可以提高时钟频率来提升其速度。
而并行通信在本质上是和串行通信一样的。唯一的区别是并行通信依靠多条数据线在一个时钟周期里传送更多的bit。下图中,数据线已经不是一条或者是两条,而是多条。我们很容易知道,如果有8根数据线的话,在同一时钟周期内传送的的数据量是8bit。如果我们的数据线足够多的话,比如PCI总线,那一个周期内就可以传送32bit的数据。
在这里,笔者想提醒各位读者,对于一款产品来说,用最低的成本来满足带宽的需要,那就是成功的设计,而不会在意你是串行通信还是并行通信,也不会管你的传输技术是先进还是落后。
PATA接口的速度
我们知道,ATA-33的速度为33MB/S,ATA-100的速度是100MB/S。那这个速度是如何计算出来的呢?
首先,我们需要知道总线上的时钟频率,比如ATA-100是25MHz,PATA的并行数据线有16根,一次能传送16bit的数据。而ATA-66以上的规范为了降低总线本身的频率,PATA被设计成在时钟的上下沿都能传输数据(类似DDR的原理),使得在一个时钟周期内能传送32bit。
这样,我们很容易得出ATA-100的速度为:25M*16bit*2=800Mbps=100MByte/s。
PATA的局限性
在相同频率下,并行总线优于串行总线。随着当前硬盘的数据传输率越来越高,传统的并行ATA接口日益逐渐暴露出一些设计上的缺陷,其中最致命的莫过于并行线路的信号干扰问题。
那各信号线之间是如何干扰的呢?
1,首先是信号的反射现象。从南桥发出的PATA信号,通过扁长的信号线到达硬盘(在笔记本上对应的也有从南桥引出PATA接口,一直布线到硬盘的接口)。学过微波通信的读者肯定知道,信号在到达PATA硬盘后不可避免的会发生反弹,而反弹的信号必将叠加到当前正在被传输的信号上,导致传输中数据的完整性被破坏,引起接受端误判。
所以在实际的设计中,都必须要设计相应的电路来保证信号的完整性。
我们看到,从南桥发出的PATA信号一般都需要经过一个排阻才发送到PATA的设备。我们必须加上至少30个电阻(除了16根数据线,还有一些控制信号)才能有效的防止信号的反弹。而在硬盘内部,硬盘厂商会在里面接上终端电阻以防止引号反弹。这不仅对成本有所上升,也对PCB的布局也造成了困扰。
当然,信号反弹在任何高速电路里都会发生,在SATA里我们也会看到终端电阻,但因为SATA的数据线比PATA少很多,并且采用了差分信号传输,所以这个问题并不突出。
2,其次是信号的偏移问题
理论上,并行总线的数据线的长度应该是一致的。而在实际上,这点很难得到保证。信号线长度的不一致性会导致某个信号过快/过慢到达接受端,导致逻辑误判。不仅如此,导致信号延迟的原因还有很多,比如线路板上的分布电容、信号线在高频时产生的感抗等都会引起信号的延迟。
如图,在左侧南桥端我们发送的数据为[1,1,1,0],在发送到硬盘的过程中,第四个信号由于某种原因出现延迟,在判断时刻还没到达接受端。这样,接受端判断接受到的信号为[1,1,1,1],出现错误。由此也可看出,并行数据线越多,出现错误的概率也越大。
下图是SONY Z1的硬盘转接线,我们看到,设计师做了不少蛇行走线以满足PATA数据线的长度一致性要求。
我们可以很容易想象,信号的时钟越快,被判断信号判断的时间就越短,出现误判的可能性就越大。在较慢的总线上(上),允许数据信号和判断信号的时间误差为a,而在高速的总线上(下),允许误差为b。速度越快,允许的误差越小。这也是PATA的总线频率提升的局限性,而总线频率直接影响着硬盘传输速度。。。
3,还有是信号线间的干扰(串音干扰)
这种干扰几乎存在与任何电路。和信号偏移一样,串音干扰也是并行通信的通病。由于并行通信需要多条信号线并行走线(以满足长度、分布电容等参数的一致性),而串音干扰就是在这时候导致的。由于信号线在传输数据的过程中不停的以0,1间变换,导致其周边的磁场变化甚快。通过法拉第定律我们知道,磁场变化越快,切割磁力线的导线上的电压越大。这个电压将导致信号的变形,信号频率越高,干扰愈加严重,直至完全无法工作。串音干扰可以说这是对并行的PATA线路影响最大的不利因素,并且大大限制了线路的长度。
硬盘的恢复主要是靠备份,还有一些比较专业的恢复技术就是要专业学习的了.不过我不专业,现在最常用的就是GHOST,它可以备份任何一个盘付,并生成一个备份文件必要的时候可以用来恢复数据
现在市场上的主要几款硬盘就是迈托,西部数据(WD),希捷(ST),三星,东之,松下,还有最新的那个易拓保密硬盘
‘柒’ 网站缓存功能什么意思
1.减少 HTTP 请求数:一个页面中包含的图片,JS,CSS等每一个资源都会生成一个 HTTP 下载请求,由浏览器发向网站服务器,如果减少这个请求数,会缩短网络传输的时间。
另外图片尽量采用压缩格式的,例如 jpg 就属于一种压缩图片格式,bmp属于无压缩无失真图片。这个需要网页/网站设计人员综合考虑这个因素。
优点:缩短网络传输事件,网络传输量小,减少服务器端负载;
缺点:减少HTTP请求,有时候无法满足网站发布信息的需求,盗链的出现也会增加HTTP请求;
2、采用缓存技术(webcache):这个是目前网站加速最主要的方式。如果利用代理/缓存加速服务器去实现的话,网站在不需要做任何改动的情况下,就可实现大跨度的实现加速效果。实现的基本方式为:将指定的网站页面周期性的缓存起来,缓存时间可从几秒到几天,在缓存时间内,页面只需要生成一次,以后有用户访问这个页面的时候,网站服务器和数据库就不再需要重新生成相同的页面了,极大的减少了网站服务器和数据库负荷。我们做个简单的对比,假设一个新闻热点页面,在一个小时可被访问1万次,如果这个新闻页面每次被访问的时候,都会通过读取数据库后再一遍一遍的编译生成,在一个小时内将会重复性的生成1万次;如果这个页面被周期性的缓存10分钟,也就是每间隔10分钟才会被生成一次,一个小时内只会被生成6次,如果两种方式一对比,效果就超级明显,两种比较下服务器负荷的压力比差别1000倍以上,缓存技术将使得网站负载在高峰期游刃有余。Fikker网站加速软件实际上是一款代理服务器软件,通过Fikker网站加速服务器提供的页面缓存(webcache)功能,将需要缓存的网站URL配置到页面缓存中(支持正则表达式,通配符和精确地址匹配),并设定一定的缓存时间(几秒到几天),不需要重启Fikker立即生效,如果有重要页面变动,可通过清理缓存将指定的缓存页面清理出去。
优点:网站不需要做任何改动,大幅减少服务器和数据库的负荷。
3、使用gzip压缩:页面压缩主要是降低传输尺寸,提高传输效率。常用的 html,asp,php,jsp,txt,css,js等文本页面,通过gzip压缩可降低75%左右尺寸,也就是原来需要传输 100KB 的页面,gzip压缩后只需要 25KB 的传输数据了,加速的效果是非常明显的。Fikker内置了gzip模块,自动对压缩的文件压面进行压缩传输。
4、使用非阻塞网络技术(non-block):提高网络响应速度,Linux 从 2.6 内核开始,专门引入 epoll 事件机制,相对于传统的 select 事件机制,效率大大的增强,尤其在高并发情况下越发的明显,几个线程即可并发支持上万并发连接,使用尽量少的线程除了减少内存开支还可减少频繁的线程切换的开销。Fikker软件的Linux版本全面支持epoll事件机制,支持从连接建立到连接结束,从域名解析开始到结束的全非阻塞网络设计。
5、提高带宽,加速页面传输:利用带宽加速方式常用是CDN,通过CDN运营商的网络将页面分发出去,用户访问时可就从最近的节点获取,达到加速目的。但这里面有一个前提,就是需要页面是静态的,或动态页面首先需要被生成出来,然后才能利用 CDN 的高速网络传输出去,从这个角度理解,CDN 与 缓存加速具有很强的互补性,即利用缓存技术加快页面生成,利用CDN加快传输,缺一不可。
希望对你有事帮助。
‘捌’ 京东面试官:Redis 这些我必问
缓存好处:高性能 + 高并发
数据库查询耗费了800ms,其他用户对同一个数据再次查询 ,假设该数据在10分钟以内没有变化过,并且 10 分钟之内有 1000 个用户 都查询了同一数据,10 分钟之内,那 1000 每个用户,每个人查询这个数据都感觉很慢 800ms
比如 :某个商品信息,在 一天之内都不会改变,但是这个商品每次查询一次都要耗费2s,一天之内被浏览 100W次
mysql 单机也就 2000qps,缓存单机轻松几万几十万qps,单机 承载并发量是 mysql 单机的几十倍。
在中午高峰期,有 100W 个用户访问系统 A,每秒有 4000 个请求去查询数据库,数据库承载每秒 4000 个请求会宕机,加上缓存后,可以 3000 个请求走缓存 ,1000 个请求走数据库。
缓存是走内存的,内存天然可以支撑4w/s的请求,数据库(基于磁盘)一般建议并发请求不要超过 2000/s
redis 单线程 ,memcached 多线程
redis 是单线程 nio 异步线程模型
一个线程+一个队列
redis 基于 reactor 模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler,这个文件事件处理器是单线程的,所以redis 是单线程的模型,采用 io多路复用机制同时监听多个 socket,根据socket上的事件来选择对应的事件处理器来处理这个事件。
文件事件处理器包含:多个 socket,io多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令恢复处理器、连接应答处理器)
文件事件处理器是单线程的,通过 io 多路复用机制监听多个 socket,实现高性能和线程模型简单性
被监听的 socket 准备好执行 accept,read,write,close等操作的时候,会产生对应的文件事件,调用之前关联好的时间处理器处理
多个 socket并发操作,产生不同的文件事件,i/o多路复用会监听多个socket,将这些 socket放入一个队列中排队。事件分派器从队列中取出socket给对应事件处理器。
一个socket时间处理完后,事件分派器才能从队列中拿到下一个socket,给对应事件处理器来处理。
文件事件:
AE_READABLE 对应 socket变得可读(客户端对redis执行 write操作)
AE_WRITABLE 对应 socket 变得可写(客户端对 redis执行 read操作)
I/O 多路复用可以同时监听AE_REABLE和 AE_WRITABLE ,如果同时达到则优先处理 AE_REABLE 时间
文件事件处理器:
连接应答处理器 对应 客户端要连接 redis
命令请求处理器 对应 客户端写数据到 redis
命令回复处理器 对应 客户端从 redis 读数据
流程:
一秒钟可以处理几万个请求
普通的 set,get kv缓存
类型 map结构,比如一个对象(没有嵌套对象)缓存到 redis里面,然后读写缓存的时候,可以直接操作hash的字段(比如把 age 改成 21,其他的不变)
key=150
value = {
}
有序列表 ,元素可以重复
可以通过 list 存储一些列表型数据结构,类似粉丝列表,文章评论列表。
例如:微信大 V的粉丝,可以以 list 的格式放在 redis 里去缓存
key=某大 V value=[zhangsan,lisi,wangwu]
比如 lrange 可以从某个元素开始读取多少个元素,可以基于 list 实现分页查询功能,基于 redis实现高性能分页,类似微博下来不断分页东西。
可以搞个简单的消息队列,从 list头怼进去(lpush),list尾巴出来 (brpop)
无序集合,自动去重
需要对一些数据快速全局去重,(当然也可以基于 HashSet,但是单机)
基于 set 玩差集、并集、交集的操作。比如:2 个人的粉丝列表整一个交集,看看 2 个人的共同好友是谁?
把 2 个大 V 的粉丝都放在 2 个 set中,对 2 个 set做交集(sinter)
排序的 set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序
排行榜:
zadd board score username
例如:
zadd board 85 zhangsan
zadd board 72 wangwu
zadd board 96 lis
zadd board 62 zhaoliu
自动排序为:
96 lisi
85 zhangsan
72 wangwu
62 zhaoliu
获取排名前 3 的用户 : zrevrange board 0 3
96 lisi
85 zhangsan
72 wangwu
查看zhaoliu的排行 :zrank board zhaoliu 返回 4
内存是宝贵的,磁盘是廉价的
给key设置过期时间后,redis对这批key是定期删除+惰性删除
定期删除:
redis 默认每隔 100ms随机抽取一些设置了过期时间的 key,检查其是否过期了,如果过期就删除。
注意:redis是每隔100ms随机抽取一些 key来检查和删除,而不是遍历所有的设置过期时间的key(否则CPU 负载会很高,消耗在检查过期 key 上)
惰性删除:
获取某个key的时候, redis 会检查一下,这个key如果设置了过期时间那么是否过期,如果过期了则删除。
如果定期删除漏掉了许多过期key,然后你也没及时去查,也没走惰性删除,如果大量过期的key堆积在内存里,导致 redis 内存块耗尽,则走内存淘汰机制。
内存淘汰策略:
LRU 算法:
缓存架构(多级缓存架构、热点缓存)
redis 高并发瓶颈在单机,读写分离,一般是支撑读高并发,写请求少,也就 一秒一两千,大量请求读,一秒钟二十万次。
一主多从,主负责写,将数据同步复制到其他 slave节点,从节点负责读,所有读的请求全部走从节点。主要是解决读高并发。、
主从架构->读写分离->支撑10W+读QPS架构
master->slave 复制,是异步的
核心机制:
master持久化对主从架构的意义:
如果开启了主从架构,一定要开启 master node的持久化,不然 master宕机重启数据是空的,一经复制,slave的数据也丢了
主从复制原理:
第一次启动或者断开重连情况:
正常情况下:
master 来一条数据,就异步给 slave
全年 99.99%的时间,都是出于可用的状态,那么就可以称为高可用性
redis 高可用架构叫故障转移,failover,也可以叫做主备切换,切换的时间不可用,但是整体高可用。
sentinal node(哨兵)
作用:
quorum = 1 (代表哨兵最低个数可以尝试故障转移,选举执行的哨兵)
master 宕机,只有 S2 存活,因为 quorum =1 可以尝试故障转移,但是没达到 majority =2 (最低允许执行故障转移的哨兵存活数)的标准,无法执行故障转移
如果 M1 宕机了,S2,S3 认为 master宕机,选举一个执行故障转移,因为 3 个哨兵的 majority = 2,所以可以执行故障转移
丢数据:
解决方案:
sdown 主观宕机,哨兵觉得一个 master 宕机(ping 超过了 is-master-down-after-milliseconds毫秒数)
odown 客观宕机,quorum数量的哨兵都觉得 master宕机
哨兵互相感知通过 redis的 pub/sub系统,每隔 2 秒往同一个 channel里发消息(自己的 host,ip,runid),其他哨兵可以消费这个消息
以及同步交换master的监控信息。
哨兵确保其他slave修改master信息为新选举的master
当一个 master被认为 odown && marjority哨兵都同意,那么某个哨兵会执行主备切换,选举一个slave成为master(考虑 1. 跟master断开连接的时长 2. slave 优先级 3.复制 offset 4. runid)
选举算法:
quorum 数量哨兵认为odown->选举一个哨兵切换->获得 majority哨兵的授权(quorum majority 需要 majority个哨兵授权,quorum >= majority 需要 quorum 哨兵授权)
第一个选举出来的哨兵切换失败了,其他哨兵等待 failover-time之后,重新拿confiuration epoch做为新的version 切换,保证拿到最新配置,用于 configuration传播(通过 pu/sub消息机制,其他哨兵对比 version 新旧更新 master配置)
高并发:主从架构
高容量:Redis集群,支持每秒几十万的读写并发
高可用:主从+哨兵
持久化的意义在于故障恢复数据备份(到其他服务器)+故障恢复(遇到灾难,机房断电,电缆被切)
AOF 只有一个,Redis 中的数据是有一定限量的,内存大小是一定的,AOF 是存放写命令的,当大到一定的时候,AOF 做 rewrite 操作,就会基于当时 redis 内存中的数据,来重新构造一个更小的 AOF 文件,然后将旧的膨胀很大的文件给删掉,AOF 文件一直会被限制在和Redis内存中一样的数据。AOF同步间隔比 RDB 小,数据更完整
优点:
缺点:
AOF 存放的指令日志,数据恢复的时候,需要回放执行所有指令日志,RDB 就是一份数据文件,直接加载到内存中。
优点:
缺点:
AOF 来保证数据不丢失,RDB 做不同时间的冷备
支持 N 个 Redis master node,每个 master node挂载多个 slave node
多master + 读写分离 + 高可用
数据量很少,高并发 -> replication + sentinal 集群
海量数据 + 高并发 + 高可用 -> redis cluster
hash算法->一致性 hash 算法-> redis cluster->hash slot算法
redis cluster :自动对数据进行分片,每个 master 上放一部分数据,提供内置的高可用支持,部分master不可用时,还是可以继续工作
cluster bus 通过 16379进行通信,故障检测,配置更新,故障转移授权,另外一种二进制协议,主要用于节点间进行高效数据交换,占用更少的网络带宽和处理时间
key进行hash,然后对节点数量取模,最大问题只有任意一个 master 宕机,大量数据就要根据新的节点数取模,会导致大量缓存失效。
key进行hash,对应圆环上一个点,顺时针寻找距离最近的一个点。保证任何一个 master 宕机,只受 master 宕机那台影响,其他节点不受影响,此时会瞬间去查数据库。
缓存热点问题:
可能集中在某个 hash区间内的值特别多,那么会导致大量的数据都涌入同一个 master 内,造成 master的热点问题,性能出现瓶颈。
解决方法:
给每个 master 都做了均匀分布的虚拟节点,这样每个区间内大量数据都会均匀的分布到不同节点内,而不是顺时针全部涌入到同一个节点中。
redis cluster 有固定 16384 个 hash slot,对每个key计算 CRC16 值,然后对16384取模,可以获取 key对应的 hash slot
redis cluster 中每个 master 都会持有部分 slot ,当一台 master 宕机时候,会最快速度迁移 hash slot到可用的机器上(只会短暂的访问不到)
走同一个 hash slot 通过 hash tag实现
集群元数据:包括 hashslot->node之间的映射表关系,master->slave之间的关系,故障的信息
集群元数据集中式存储(storm),底层基于zookeeper(分布式协调中间件)集群所有元数据的维护。好处:元数据的更新和读取,时效性好,一旦变更,其他节点立刻可以感知。缺点:所有元数据的更新压力全部集中在一个地方,可能会导致元数据的存储有压力。
goosip: 好处:元数据的更新比较分散,有一定的延时,降低了压力。缺点:更新有延时,集群的一些操作会滞后。(reshared操作时configuration error)
自己提供服务的端口号+ 10000 ,每隔一段时间就会往另外几个节点发送ping消息,同时其他几点接收到ping之后返回pong
故障信息,节点的增加和移除, hash slot 信息
meet:某个节点发送 meet给新加入的节点,让新节点加入集群中,然后新节点就会开始于其他节点进行通信
ping:每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据
ping:返回ping和meet,包含自己的状态和其他信息
fail:某个节点判断另一个节点fail之后,就发送 fail 给其他节点,通知其他节点,指定的节点宕机了
ping 很频繁,且携带元数据,会加重网络负担
每个节点每秒会执行 10 次 ping,每次选择 5 个最久没有通信的其他节点
当如果发现某个节点通信延迟达到了 cluster_node_timeout /2 ,那么立即发送 ping, 避免数据交换延迟过长,落后时间太长(2 个节点之间 10 分钟没有交换数据,整个集群处于严重的元数据不一致的情况)。
每次ping,一个是带上自己的节点信息,还有就是带上1/10其他节点的信息,发送出去,进行数据交换
至少包含 3 个其他节点信息,最多包含总节点-2 个其他节点的信息
客户端发送到任意一个redis实例发送命令,每个redis实例接受到命令后,都会计算key对应的hash slot,如果在本地就本地处理,否则返回moved给客户端,让客户端进行重定向 (redis-cli -c)
通过tag指定key对应的slot,同一个 tag 下的 key,都会在一个 hash slot中,比如 set key1:{100} 和 set key2:{100}
本地维护一份hashslot->node的映射表。
JedisCluster 初始化的时候,随机选择一个 node,初始化 hashslot->node 映射表,同时为每个节点创建一个JedisPool连接池,每次基于JedisCluster执行操作,首先JedisCluster都会在本地计算key的hashslot,然后再本地映射表中找到对应的节点,如果发现对应的节点返回moved,那么利用该节点的元数据,更新 hashslot->node映射表(重试超过 5 次报错)
hash slot正在迁移,那么会返回ask 重定向给jedis,jedis 接受到ask重定向之后,,会重定向到目标节点去执行
判断节点宕机:
如果一个节点认为另外一个节点宕机了, 就是pfail,主观宕机
如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机(跟哨兵原理一样)
在cluster-node-timeout内,某个节点一直没有返回 pong,那么就被认为是 pfail
如果一个节点认为某个节点pfail了,那么会在gossip消息中,ping给其他节点,如果超过半数的节点认为pfail了,那么就会变成fail。
从节点过滤:
对宕机的 mster node ,从其所有的 slave node中,选择一个切换成 master node
检查每个 slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没资格切换成 master(和哨兵一致)
从节点选举:
每个从节点,根据自己对 master 复制数据的 offset,设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,所有的 master node 开始投票,给要进行选举的 slave进行投票,如果大部分 master node(N/2 +1) 都投票给某个从节点,那么选举通过,从节点执行主备切换,从节点切换成主节点
总结:和哨兵很像,直接集成了 replication 和 sentinal
方案:
事前:保证 redis 集群高可用性 (主从+哨兵或 redis cluster),避免全盘崩溃
事中:本地 ehcache 缓存 + hystrix 限流(保护数据库) & 降级,避免 MySQL被打死
事后: redis持久化,快速恢复缓存数据,继续分流高并发请求
限制组件每秒就 2000 个请求通过限流组件进入数据库,剩余的 3000 个请求走降级,返回一些默认 的值,或者友情提示
好处 :
4000 个请求黑客攻击请求数据库里没有的数据
解决方案:把黑客查数据库中不存在的数据的值,写到缓存中,比如: set -999 UNKNOWN
读的时候,先读缓存,缓存没有,就读数据库,然后取出数据后放入缓存,同时返回响应
更新的时候,删除缓存,更新数据库
为什么不更新缓存:
更新缓存代价太高(更新 20 次,只读 1 次),lazy思想,需要的时候再计算,不需要的时候不计算
方案:先删除缓存,再修改数据库
方案:写,读路由到相同的一个内存队列(唯一标识,hash,取模)里,更新和读操作进行串行化(后台线程异步执行队列串行化操作),(队列里只放一个更新查询操作即可,多余的过滤掉,内存队列里没有该数据更新操作,直接返回 )有该数据更新操作则轮询取缓存值,超时取不到缓存值,直接取一次数据库的旧值
TP 99 意思是99%的请求可以在200ms内返回
注意点:多个商品的更新操作都积压在一个队列里面(太多操作积压只能增加机器),导致读请求发生大量的超时,导致大量的读请求走数据库
一秒 500 写操作,每200ms,100 个写操作,20 个内存队列,每个队列积压 5 个写操作,一般在20ms完成
方案:分布式锁 + 时间戳比较
10台机器,5 主 5 从,每个节点QPS 5W ,一共 25W QPS(Redis cluster 32G + 8 核 ,Redis 进程不超过 10G)总内存 50g,每条数据10kb,10W 条数据1g,200W 条数据 20G,占用总内存不到50%,目前高峰期 3500 QPS
作者: mousycoder