MySQL的高并发是经过一系列的复杂的分库与分表作到,而Redis搞高并发,就是搞好底层的缓存node
单机; 一个Redis,可以承载的QPS大概是上万到几万不等,假如,有超过10万级的数据过来,有可能会将Redis搞崩溃缓存
读写分离,通常来讲写的请求比较少,大量的数据用来读,咱们能够将架构作成主从架构,一主多从,主负责写,而且将数据同步到其余的节点,其余的节点负责读。网络
master node将数据异步的复制到 slave node架构
(1)Redis采用异步的方式复制数据到slave节点,不过从Redis2.8开始,slave node 会周期性的确认本身每次复制的数据量并发
(2)一个master node能够配置多个slave nodeless
(3)一个slave node能够链接多个slave node异步
(4)slave node作复制的时候,是不会影响master node 的工做的socket
(5)slave node在作复制的时候,是不会影响对本身的查询工做,它会用就得数据提供服务,只有在复制完成的时后,须要剔除旧的数据,加载新的数据集的时候,这个时候就会暂停对外的服务了。高并发
(6)slave node 能够进行横向扩容,作读写分离ui
不建议使用slave node做为master node的数据备份,由于那样的话,假如,你关闭了master的持久化,可能在master宕机的时候重启的话,数据是空的,而后一经复制,slave node 的数据也丢了,RDB和AOF都关闭的状况下,就会照成在重启的状况下没有本地数据能够恢复
(1)第一次链接
当启动一个slave node 的时候,它会发送一个PSYNC的命令给master node ,那么master node就会触发一次full resynchronization,master 会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端接受到的命令写进缓存之中。RDB文件生成以后,master会将这个RDB文件发给slave,slave会先写入本地磁盘,而后从磁盘中加载到内存中。而后master node会将内存中缓存的文件文件发送给slave,slave也会同步这些文件。slave若是跟master 有网络故障,断开链接,就会从新链接,master若是发现多个slave都来从新链接,仅仅会启动一个DRB保存操做,用一份数据服务全部的slave。
(2)非第一次链接
master仅仅复制给slave缺乏的数据。
(3)从Redis2.8 开始,支持断点续传,若是主从复制的过程当中,网络链接断了,那么能够接着上一次的复制的地方继续复制下去,而不是从头开始复制一个master node。由于master和slave都会保存一个replica offset,还有一个master ID,若是网络链接断了,slave就会让master从上一次的replica offset开始的位置继续复制,若是没有找到,就会进行一次resynchronization
(4)无磁盘化复制
repl-diskless-sync yes
master在内存中直接建立RDB,而后发送给slave,不会再本身本地落地磁盘上了
repl-diskless-sync-delay 等待必定时长再开始复制,由于要等更多的slave从新链接过来
(5)过时的key的处理
slave不会过时key,只会等待master过时key。若是master过时了一个key,或者经过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
(1)slave node启动,仅仅保存master node的信息,包括master node的host,和IP信息,可是复制流程尚未开始。
(2)slave node内部有一个定时任务,每一秒检查是否有新的master node 要链接和复制,若是发现,就跟master node创建socket链接。
(3)slave node 发送ping命令给master node
(4)若是master node设置了口令认证requirepass,那么salve node必须发送masterauth的口令过去进行认证
(5)master node第一次执行全量复制,将多有的数据发送给slave node
(6)master node后续持续将命令,异步的赋值给slave node
(1)master和slave都会维护一个offset
master会不断地累加本身的offset,slave也会不断的累加本身的offset,slave每一秒回报告本身的offset给master,同时master也会保存每个slave的offset (主要是master 和salve都保留本身的offset,才能知道相互之间的数据不一致的状况)
(2)backlog
master log 中有一个backlog,默认是一个MB的大小,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 不一样就作全量复制。
(1)master 执行bgsave,在本地生成一份RGB文件
(2)master node 将RDB快件发送到salve node,若是RDB复制时间超过60秒,那么slave node就会认为复制失败,能够适当调节大这个参数。
(3)对于千兆网卡的机器,通常每一秒会传输100MB,6G的文件,极可能会超过60S
(4)master node在生成RDB的时候,会将全部的新的写命令缓存到内存中,在salve node保存了RDB以后,再讲新的命令复制给salve node
(5)client-output-buffer-limit slave 256M 64M 60 ,若是在复制的时候,内存缓存区持续消耗64M,或者一次性超过256,那么就会中止复制,复制就会失败。
(6) slave node 接收到RDB以后,清空本身的旧数据,而后从新加载RDB到本身的内存之中,
(1)若是全量复制过程之中,master-slave网络部分链接断掉,那么salve从新链接master时,会触发增量复制
(2)master直接从本身的backlog中获取部分丢失的数据,发送给slave node,默认的backlog是1M
(3)master就是跟住slave发送的psync中的offset来从backlog中获取数据的。
主从节点互相都会发送heartbeat信息
master默认每隔10秒发送一次heartbeat,slave node每隔1秒发送一个heartbeat。
master每一次接收到命令以后,先在内部写入数据,而后异步的发送给slave node