对线面试官-Redis(六 如何保证 Redis 高并发 主从复制原理)

136 阅读5分钟

面试官 :既然聊了这么多Redis,还没有说到Redis线程模型:

派大星:因为Redis基于reactor模式开发了网络事件处理器,这个事件处理器叫做:文件事件处理器(File Event Handler),这个文件事件处理器是单线程的,从而Redis才叫做单线程的模型。采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理这个事件。

面试官 :不错,那如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?

面试官心里剖析:其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?

派大星:如果你用 Redis 缓存技术的话,肯定要考虑如何用 Redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 Redis 保证自己不是挂掉以后就直接死掉了,即 Redis 高可用。

派大星:这部分可以主要从两方面:

  1. Redis主从架构,

Redis实现高并发主要依靠主从架构,一主多从,一般来说,很多项目其实已经足够了,,单住用来写入数据,单机几万QPS,多从用来查询数据,,多个实例可以提供每秒近上万(10w)的QPS。

当然如果想要在实现高并发的同时,容纳大量的数据,那么就需要Redis集群,使用Redis集群之后,可以提供每秒近几十万的读写并发也是可以的。

  1. Redis基于哨兵实现高可用。

Redis高可用,如果是做主从架构部署,那么加上哨兵即可,就i可以实现,任何一个实例宕机,可以进行主备切换。或者还有Redis官方的Cluster 集群模式,Redis Cluster是一种服务器 Sharding 技术,3.0版本开始正式提供

面试官 :什么是Redis主从架构

主要从核心机制和工作流程两个方面来回答

派大星:Redis replication的核心机制:

  • Redis采用异步方式复制数据到slave node上,不过从Redis2.8开始,slave node会周期性的确认自己每次复制的数据量;
  • 一个master node是可以配置多个slave node的。
  • slave node也可以连接其它的slave node。
  • slave node做复制的时候,不会block master node的正常工作。
  • slave node做复制的时候,也不会block自己的查询操作,它会用旧数据来提供服务,但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。
  • slave node主要用来进行横向扩容,做读写分离,扩容的slave node也可以提高读的吞吐量。

派大星:Redis 主从复制的核心原理(面试问题最多的问题,也可理解为工作流程):

当启动一个slave node的时候,它会发送一个PSYNC命令个master node,如果这是slave node初次连接到master node,那么会触发一次full resynchronization全量复制。此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中。RDB文件生成完毕后,,master会将这个RDB发送给slave,,slave会先写入磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据。从Redis2.8开始,支持了主从复制的断点续传,

同时我们如果像开启无磁盘化复制:也就是master在内存中直接创建RDB,然后发送给slave,不会落盘,只需要在配置文件中repl-diskless-sync yes即可。

repl-diskless-sync yes

# 等待 5s 后再开始复制,因为要等更多 slave 重新连接过来
repl-diskless-sync-delay 5

另外,master 的各种备份方案,也需要做。万一本地的所有文件丢失了,从备份中挑选一份 rdb 去恢复 master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制,slave node 可以自动接管 master node,但也可能 sentinel 还没检测到 master failure,master node 就自动重启了,还是可能导致上面所有的 slave node 数据被清空。

面试官 :那主从复制的时候如何处理的过期key的呢?

派大星:slave不会过期key,只会等待master过期key,如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一个del命令发送给slave node

面试官 :刚刚有提到断点续传,可以聊一聊主从复制断点续传的原理:

派大星:好的,首先master node会在内存中维护一个back log,master 和 slave都会保存一个replica offset还有一个master run id,offset就是保存在backlog中的。如果master 和slave网络连接断掉了,slave会让master从上次replica offset开始继续复制,如果没有找到对应的offset,会执行一次resynchronization

面试官 :不错,那我们继续聊一了Redis 高可用这个问题吧。

派大星:下次吧,这次有点累啦,嘿嘿。

注意,如果采用了主从架构,那么建议必须开启 master node 的持久化,不建议用 slave node 作为 master node 的数据热备,因为那样的话,如果你关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave node 的数据也丢了。

如有问题,欢迎加微信交流:w714771310,或关注微信公众号【码上遇见你】。