写点什么

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

作者:派大星
  • 2023-07-06
    辽宁
  • 本文字数:2037 字

    阅读完需:约 7 分钟

面试官:既然聊了这么多 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,或关注微信公众号【码上遇见你】。


发布于: 刚刚阅读数: 4
用户头像

派大星

关注

微信搜索【码上遇见你】,获取更多精彩内容 2021-12-13 加入

微信搜索【码上遇见你】,获取更多精彩内容

评论

发布
暂无评论
对线面试官-Redis(六 如何保证 Redis 高并发 主从复制原理)_Java 面试题_派大星_InfoQ写作社区