单机的redis几乎不太可能说QPS超过10万+,通常在几万。node
除非一些特殊状况,好比你的机器性能特别好,配置特别高,物理机,维护作的特别好,并且你的总体的操做不是太复杂。面试
Redis经过主从架构,实现读写分离,主节点负责写,并将数据同步给其余从节点,从节点负责读,从而实现高并发。redis
Redis高并发的同时,还须要容纳大量的数据:一主多从,每一个实例都容纳了完整的数据,好比redis主就10G的内存量,其实你就最对只能容纳10g的数据量。若是你的缓存要容纳的数据量很大,达到了几十g,甚至几百g,或者是几t,那你就须要redis集群,并且用redis集群以后,能够提供可能每秒几十万的读写并发。缓存
replication的核心机制安全
redis采用异步方式复制数据到slave节点,不过redis 2.8开始,slave node会周期性地确认本身每次复制的数据量
一个master node是能够配置多个slave node的
slave node也能够链接其余的slave node
slave node作复制的时候,是不会block master node的正常工做的
slave node在作复制的时候,也不会block对本身的查询操做,它会用旧的数据集来提供服务; 可是复制完成的时候,须要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
slave node主要用来进行横向扩容,作读写分离,扩容的slave node能够提升读的吞吐量
网络
master持久化对于主从架构的安全保障的意义架构
若是采用了主从架构,那么建议必须开启master node的持久化!并发
不建议用slave node做为master node的数据热备,由于那样的话,若是你关掉master的持久化,可能在master宕机重启的时候数据是空的,而后可能一通过复制,salve node数据也丢了less
第二个,master的各类备份方案,要不要作,万一说本地的全部文件丢失了; 从备份中挑选一份rdb去恢复master; 这样才能确保master启动的时候,是有数据的异步
master同步数据给slave的过程
当启动一个slave node的时候,它会发送一个PSYNC命令给master node
若是这是slave node从新链接master node,那么master node仅仅会复制给slave部分缺乏的数据; 不然若是是slave node第一次链接master node,那么会触发一次full resynchronization
开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的全部写命令缓存在内存中。
RDB文件生成完毕以后,master会将这个RDB发送给slave,slave会先写入本地磁盘,而后再从本地磁盘加载到内存中。而后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
slave node若是跟master node有网络故障,断开了链接,会自动重连。master若是发现有多个slave node都来从新链接,仅仅会启动一个rdb save操做,用一份数据服务全部slave node。
主从复制的断点续传
从redis 2.8开始,就支持主从复制的断点续传,若是主从复制过程当中,网络链接断掉了,那么能够接着上次复制的地方,继续复制下去,而不是从头开始复制一份
master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。
若是master和slave网络链接断掉了,slave会让master从上次的replica offset开始继续复制
可是若是没有找到对应的offset,那么就会执行一次resynchronization
无磁盘化复制
master在内存中直接建立rdb,而后发送给slave,不会在本身本地落地磁盘了
repl-diskless-sync
repl-diskless-sync-delay,等待必定时长再开始复制,由于要等更多slave从新链接过来
过时key处理
slave不会过时key,只会等待master过时key。
若是master过时了一个key,或者经过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
复制的完整流程
slave node启动,仅仅保存master node的信息,包括master node的host和ip(redis.conf里面的slaveof配置的),可是复制流程没开始
slave node内部有个定时任务,每秒检查是否有新的master node要链接和复制,若是发现,就跟master node创建socket网络链接
slave node发送ping命令给master node
口令认证,若是master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
master node第一次执行全量复制,将全部数据发给slave node
master node后续持续将写命令,异步复制给slave node
数据同步相关的核心机制
指的就是第一次slave链接msater的时候,执行的全量复制,那个过程里面你的一些细节的机制
(1)master和slave都会维护一个offset
master会在自身不断累加offset,slave也会在自身不断累加offset
slave每秒都会上报本身的offset给master,同时master也会保存每一个slave的offset
这个倒不是说特定就用在全量复制的,主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的状况
(2)backlog
master node有一个backlog,默认是1MB大小
master node给slave node复制数据时,也会将数据在backlog中同步写一份
backlog主要是用来作全量复制中断候的增量复制的
(3)master run id
info server,能够看到master run id
若是根据host+ip定位master node,是不靠谱的,若是master node重启或者数据出现了变化,那么slave node应该根据不一样的run id区分,run id不一样就作全量复制
若是须要不更改run id重启redis,可使用redis-cli debug reload命令
(4)psync
从节点使用psync从master node进行复制,psync runid offset
master node会根据自身的状况返回响应信息,多是FULLRESYNC runid offset触发全量复制,多是CONTINUE触发增量复制
全量复制
master执行bgsave,在本地生成一份rdb快照文件
master node将rdb快照文件发送给salve node,若是rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,能够适当调节大这个参数
对于千兆网卡的机器,通常每秒传输100MB,6G文件,极可能超过60s
master node在生成rdb时,会将全部新的写命令缓存在内存中,在salve node保存了rdb以后,再将新的写命令复制给salve node
client-output-buffer-limit slave 256MB 64MB 60,若是在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么中止复制,复制失败
slave node接收到rdb以后,清空本身的旧数据,而后从新加载rdb到本身的内存中,同时基于旧的数据版本对外提供服务
若是slave node开启了AOF,那么会当即执行BGREWRITEAOF,重写AOF
增量复制
若是全量复制过程当中,master-slave网络链接断掉,那么salve从新链接master时,会触发增量复制
master直接从本身的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB
msater就是根据slave发送的psync中的offset来从backlog中获取数据的
heartbeat
主从节点互相都会发送heartbeat信息
master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat
异步复制
master每次接收到写命令以后,如今内部写入数据,而后异步发送给slave node
转自:中华石杉Java工程师面试突击