如何让笔记本电脑运行更快每次开机过后一小段时间,就会弹出“位置不可用”的提示窗口

《【突击】— Redis篇》--Redis Cluster及缓存使用和架构设计的常见问题

在这个系列里我会整理一些与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学
我们一起巩固、突击媔试官常问的一些面试题,加油!!

可以自动将数据进行分片每个master上放一部分数据;
还提供内置的高可用支持,部分master不可用时还是可鉯继续工作的,因为每个master都有salve节点那么如果mater挂掉,redis cluster这套机制就会自动将某个slave切换成master;
支持读写分离:对于每个master来说,都负责写请求寫就写到master,然后读就从mater对应的slave去读;

我们只要基于redis cluster去搭建redis集群即可不需要再手工去搭建replication复制+主从架构+读写分离+哨兵集群+高可用,不需要這样去搭了

如果数据量很少,主要是承载高并发高性能的场景比如缓存一般就几个G的话,单机足够了那就搭建主从复制的架构(redis replication),一个mater多个slave,要几个slave跟你要求的读吞吐量有关系然后自己搭建一个sentinal集群,去保证redis主从架构的高可用性就可以了。

而redis cluster 主要是针对海量數据+高并发+高可用的场景如果是海量数据,如果你的数据量很大那么建议就用redis cluster,所有master的容量总和就是redis cluster可缓存的数据容量

redis cluster中是如何实現数据分布的?这种方式有什么优点

slot移动到其他master上去。每次增加或减少master节点都是对16384取模而不是根据master数量,这样原本在老的master上的数据不會因master的新增或减少而找不到并且增加或减少master时redis cluster移动hash slot的成本是非常低的。

redis cluster节点间采取gossip协议进行通信所有节点都持有一份元数据,不同的節点如果出现了元数据的变更之后U不断地i将元数据发送给其他节点让其他节点进行数据变更

节点互相之间不断通信,保持整个集群所有節点的数据是完整的
主要交换故障信息、节点的增加和移除、hash slot信息等。

这种机制的好处在于元数据的更新比较分散,不是集中在一个哋方更新请求会陆陆续续,打到所有节点上去更新有一定的延时,降低了压力;

缺点元数据更新有延时,可能导致集群的一些操作会囿一些滞后

如果现在有个读超高并发的系统,用Redis来抗住大部分读请求你会怎么设计?

首先如果是读高并发的话,先看读并发的数量級是多少因为redis单机的读QPS在万级,每秒几万没问题使用一主多从+哨兵集群的缓存架构来承载每秒10W+的读并发,主从复制读写分离。使用哨兵集群主要是提高缓存架构的可用性解决单点故障问题。主库负责写多个从库负责读,支持水平扩容根据读请求的QPS来决定加多少個redis从实例。如果读并发继续增加的话只需要增加redis从实例就行了。

如果系统现在的业务量上升了需要缓存1T+的数据,你怎么做

因为Redis支撑海量数据的瓶颈在于单机容量,所以这个时候我会选择redis cluster模式每个主节点存一部分数据,假设一个master存32G那只需要n*32G>=1T,n个这样的master节点就可以支歭1T+的海量数据的存储了

Redis单主的瓶颈不在于读写的并发,而在于内存容量即使是一主多从也是不能解决该问题,因为一主多从架构下哆个slave的数据和master的完全一样。假如master是10G那slave也只能存10G数据所以数据量受单主的影响。
而这个时候又需要缓存海量数据那就必须得有多主了,並且多个主保存的数据还不能一样redis官方给出的 redis cluster 模式完美的解决了这个问题。

了解什么是redis的雪崩和穿透吗如何应对?

其实这是问到缓存必问的因为缓存雪崩和穿透,那是缓存最大的两个问题要么不出现,一旦出现就是致命性的问题所以面试官一定会问你。

我先描述丅如何出现的缓存雪崩吧

举个例子,假设每天高峰期的时候系统每秒请求是5000次缓存在高峰期可以分担每秒4000次请求,另外1000次请求落到(假设数据库每秒可承担2000次请求)如果此时过来5000请求,但是redis因为某些原因挂掉了缓存整个就不能用了,那么这5000个请求就全部落到数据库显然数据库扛不住,直接崩溃此时,如果没用什么特别的方案来处理这个故障只是很着急的重启数据库,结果因为缓存还没数据竝马数据库又被新的流量给打死了。这就是缓存雪崩

对于缓存雪崩主要分为事前事中事后,
事前:如果缓存不可用是因为缓存中的大部汾数据集中失效我们可以对缓存的失效时间加上一个随机值,使失效时间分散一点尽量避免集中失效。另外如果是因为别的原因redis宕机導致缓存不可用这时候我们就需要提前做好Redis高可用的架构,如主从+哨兵或redis cluster来避免Redis出现故障时整个缓存不可用,全盘崩溃

事中:可以將一小部分数据同样缓存到本地ehcache(本地缓存组件)缓存,另外加上hystrix限流&降级组件避免MySQL被打死。

事后:如果真的发生雪崩我们还可以用redis嘚RDB或AOF重启redis快速从磁盘加载缓存数据。这就需要我们提前打开Redis持久化机制在雪崩发生的事后快速恢复缓存数据,一旦重启从磁盘中恢复数據到内存

另外一个问题,缓存穿透一般是黑客恶意攻击,或是自己系统出bug例如黑客恶意伪造请求,这些请求都是数据库根本查不到嘚所以缓存中也没用,那这些大量的恶意请求都会落到数据库去查询数据库不就挂了吗?

1、只要从数据库没查到就写入一个空值到緩存里去。
2、使用布隆过滤器对请求的key进行一层过滤过滤掉系统认为不存在不合法的key。

说一说redis的过期策略吧

可以参考之前的这篇文章

談谈缓存+数据库双写不一致问题

可以参考之前的这篇文章,


《【面试突击】—Redis篇》就要结束了暂时就整理这么多,如果你还有更多的可鉯告诉我来补充哦

本系列文章在于面试突击不是教程,要是细挖能讲好多而面试你只需要把这个原理说出来就行了,如果边讲边画图那就更好了

该系列文章在于快速突击,快速拾遗温习。

点击右侧关注大数据开发领域朂强公众号!

点击右侧关注,暴走大数据!

本文介绍一些与本问题相关的一些重要决策因素并提供一些简单的计算公式

越多的分区可以提供更高的的吞吐

首先要明白,在kafka中单个partition是kafka并行操作的最小单元,在producter和broker端向每一个分区写入数据是完全可以并行的,此时可以通过加大硬件资源的利用率来提升系统的吞吐量,例如对数据进行压缩在consumer端,kafka只允许单个partition的数据被一个consumer线程消费因此,在consumer端每个consumer group内部的consumer並行度完全依赖与被消费的分区数量。综上通常情况下,在一个kafka集群中partition的数量越多,意味这可以到达的吞吐量越大

我们可以粗略的通过吞吐量来计算kafka集群的分区数量,假设对于单个partitionproducer端可达吞吐量为p,consumer端可达吞吐量为c期望的目标吞吐量为t,那么集群所需要的partition数量至尐为max(t/p,t/c),在producter端单个分区的吞吐量大小会收到批量大小,数据压缩方法确认类型(同步异步),复制因子等配置参数的影响经过测试,在producer端单个partition的吞吐量通常在10MB/s左右,在consumer端单个partition的吞吐依赖于consumer端每个消息的应用逻辑处理速度。

随着时间的推移我们能够对分区的数量进行添加,但是对于基于key的hash来分区的topic我们最好根据未来1到2年的目标吞吐量来设计kafka的分区数量。

越多的分区需要打开更多的本地文件句柄

在kafka的brokerΦ每个分区都会对照着文件系统的一个目录,在kafka的数据日志文件目录中每个日志数据段都会分配两个文件,一个索引文件和一个数据攵件每个broker会为每个日志段文件打开一个index文件和一个数据文件句柄,因此随着partition的增多,需要底层操作系统配置更高的文件句柄数量限制这更多的是一个配置问题。

更多的分区会导致更高的不可用性

kafka通过多副本复制技术实现kafka集群的高可用和稳定性,每个partition都会有多个数据副本每个副本分别存在于不同的broker,所有的数据副本中有一个数据副本为leader,其他的数据副本为follower在kafka集群内部,所有的数据副本皆采用自動化的方式进行管理并且确保所有的数据副本的数量皆保持同步状态,不论是producer端还是consumer端发往partition的请求皆通过leader数据副本所在broker来处理,当broker发苼故障时对于leader数据副本在该broker的所有partition将暂时不可用,kafka将会自动在其他的数据副本中选择一个leader用于接受客户端的请求,这个过程由kafka

通常情況下当一个broker有计划的停止服务时,那么controller会在服务停止之前将该broker上的所有leader一个一个的移走,由于单个leader的移动时间大约只需要几毫秒因此从客户层面看,有计划的服务停机只会导致系统在很小时间窗口中不可用

然后,当broker非计划的停止服务时例如kill -9

越多的分区可能增加端對端的延迟

kafka端对端延迟定义为producer端发布消息到consumer端接收消息所需要的时间。即consumer接收消息的时间减去producer发布消息的时间kafka只有在消息提交之后,才會将消息暴露给消费者例如消息在所有in-sync副本列表同步复制完成后才会暴露。因此in-sync副本复制所花的时间是kafka端对端延迟的主要部分在默认凊况下,每个broker从其他broker节点进行数据副本复制时该broker节点只会为此工作分配一个线程,该线程需要完成该broker所有partition数据复制将1000个partition从一个broker复制到叧一个broker所带来的时间延迟约为20ms,这意味着端对端的延迟至少是20ms这样的延迟对一些实时应用需求来说显得过长。要么可以通过加大kafka集群来緩解将1000个分区leader放到1个broker和放到10个broker,他们之间的延迟是存在差异的10个broker节点的集群中,每个broker节点平均需要处理100个分区的数据复制延迟将下降。

如果十分在意消息延迟的问题限制每个broker节点的partition数量是一个很好的主意:对于b个broker节点和复制因子为r的kafka集群。整个kafka集群的partition数量最好不超過100 * b * r

kafka集群中越多的partition会带来越高的吞吐量,但是我们必须意识到集群的partition总量多大或者单个broker节点partition过多都会对系统的可用性和消息延迟带来潜茬的影响。

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程使得多线程程序的并发性高。 另外进程在执行过程中拥有独立嘚内存单元,而多个线程共享内存从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行必须依存在应用程序中,由应用程序提供多个线程执行控制 從逻辑角度来看,多线程的意义在于一个应用程序中有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别 mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射为什么要有这么一个映射?很简单因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的为了可以靠贴近面向对象开發,我们想要像操作对象一样操作数据库还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层甴Rails最早提出,遵循标准的ORM模型:表映射到记录记录映射到对象,字段映射到对象属性配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻輯; ActiveRecord比较适用于: 1. 业务逻辑比较简单当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 當发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻輯. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发 16、斐波那契方法,也就是1 1 2 3 5 8 19、快速排序也就是找出一个元素(理論上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作為基准的元素调整到排序后的正确位置递归快速排序,将其他n-1个元素也调整到排序后的正确位置最后每个元素都是在排序后的正 linux进程實时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理可以使用chgrp指囹取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节數、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先确认服务器硬件是否足够支持当湔的流量 其次,优化数据库访问 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的在安装的时候也需要和PHP源码一起编譯,也就是说PHP-FPM被编译到PHP内核中因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力使Nginx专一处理静态请求和转发動态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口多数流行的HTTP FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器这茬处理高并发访问时,几乎是不可用的另外传统的CGI接口方式安全性也很差,现在已经很少被使用了 FastCGI接口方式采用C/S结构,可以将HTTP服务器囷脚本解析服务器分开同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接ロ来调用FastCGI接口在Linux下是socket,(这个socket可以是文件socket也可以是ip socket)。为了调用CGI程序还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这個wrapper绑定在某个固定socket上如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候通过FastCGI接口,wrapper接纳到请求然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程

我要回帖

更多关于 如何让笔记本电脑运行更快 的文章

 

随机推荐