Redis 高并发架构
Redis高并发与系统高并发的关系
MySQL的高并发是通过一系列的复杂的分库与分表做到,而Redis搞高并发,就是搞好底层的缓存
Redis的不能支撑高并发的瓶颈
单机; 一个Redis,能够承载的QPS大概是上万到几万不等,假如,有超过10万级的数据过来,有可能会将Redis搞崩溃
Redis想要支撑超过10万,需要怎么做
读写分离,一般来说写的请求比较少,大量的数据用来读,我们可以将架构做成主从架构,一主多从,主负责写,并且将数据同步到其他的节点,其他的节点负责读。
Redis replication的基本原理
master node将数据异步的复制到 slave node
Redis replication的核心机制
(1)Redis采用异步的方式复制数据到slave节点,不过从Redis2.8开始,slave node 会周期性的确认自己每次复制的数据量
(2)一个master node可以配置多个slave node
(3)一个slave node可以连接多个slave node
(4)slave node做复制的时候,是不会影响master node 的工作的
(5)slave node在做复制的时候,是不会影响对自己的查询工作,它会用就得数据提供服务,只有在复制完成的时后,需要剔除旧的数据,加载新的数据集的时候,这个时候就会暂停对外的服务了。
(6)slave node 可以进行横向扩容,做读写分离
Redis的主从架构中必须做数据的持久化
不建议使用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
主从节点互相都会发送heartbeat信息
master默认每隔10秒发送一次heartbeat,slave node每隔1秒发送一个heartbeat。
异步复制
master每一次接收到命令之后,先在内部写入数据,然后异步的发送给slave node