redis读写分离支撑读请求超过百万

redis高并发跟系统其他高并发组件之间的关系

mysql的高并发,主要是通过分库分表,QPS达到几万就比较高了;
redis的高并发,需要把底层的缓存搞好:

  • 真正的超高并发QPS达到上百万,光是靠redis肯定是不够的,但是redis在支撑高并发的架构里面,是非常重要的一个组件。
  • 底层的缓存必须支撑起高并发,再经过整体缓存架构设计,包括多级缓存架构、热点缓存,支撑上百万的高并发。

redis的瓶颈及支撑超过百万的高并发

  • 单机的redis所能支撑QPS也就上万,达不到十万;
  • 对缓存来说,读写分离一般都是用来支撑读高并发的,写的请求是比较少的,也就一秒一两千左右。大量的请求都是读,一秒几十万次。

redis replication

目的

实现redis的主从架构 + 读写分离架构 + 可支持水平扩展的读高并发架构。

基本原理及核心机制

redis_replication.png

1.redis采用异步方式复制数据到slave节点;
2.一个master节点可以配置多个slave节点;
3.slave节点也可以连接其他slave节点;
4.slave节点复制的时候,不会block master节点的正常工作;
5.slave节点复制时也不会block对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候会暂停对外服务,同时删除旧数据集,加载新数据集;
6.slave节点主要用来进行横向扩容,做读写分离,从而提高读的吞吐量。

master节点持久化的重要意义

master节点持久化对于主从架构具有重要的意义:

  • 不建议用slave节点作为master节点的数据热备,因为没有master的持久化,重启的时候数据是空的,然后一复制salve节点上的数据也丢失了。
  • 采用高可用机制,slave节点可以自动接管master节点,但是有可能sentinal还没有检测到master failure,master节点就自动重启了,还可能导致所有slave节点数据清空故障。

主从架构核心原理

主从架构.png
  • 当启动一个slave节点的时候,它会发送一个PSYNC命令给master节点;
  • 如果是slave节点第一次连接master节点,那么会触发一次full resynchronization;否则如果是重新连接master节点,那么仅仅复制缺少的这部分数据;
  • 开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再加载到内存中。
  • 最后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
  • slave节点如果遇到网络故障断开了连接,会自动跟master节点重连。master节点如果发现有多个slave节点都来重新连接,仅仅会启动一个rdb save操作,用一份数据去同步所有slave节点。

主从复制的断点续传

断点续传.png

redis支持主从复制的断点续传:

  • 如果在主从复制过程中网络断了,那么可以接着上次复制的地方继续下去,而不是从头开始复制一份;
  • master节点会在内存中保存一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络断掉了,slave会让master从上次的replica offset开始继续复制;
  • 但是如果没有找到对应的offset,那么就会执行一次resynchronization

无磁盘化复制

redis支持无磁盘化复制:master节点在内存中直接创建rdb,然后发送给slave,不会保存本地。

repl-diskless-sync
repl-diskless-sync-delay

后面那个是等待一定时长再开始复制,因为要等更多slave重新连接过来。

过期key处理

slave的key不会过期,只会等待master的key过期。如果master的key过期,或者通过LRU淘汰了key,那么会发送一条模拟的del命令给slave。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。