明了 | Redis高可用实现解决方案

小小将会在本文讲解Redis高可用的相关内容。
Redis高可用分为主从复制,哨兵,集群,以及中间件等几种高可用方式。
本文将会依次介绍主从复制和哨兵这两种高可用的方式

主从复制

什么是主从复制

在正常的项目中,对redis进行应用的时候,都不会作为单点的,因为当为单点应用的时候,容易出现宕机不可用,不能保证可用性。同时读和写的指令在同一个服务里,同时也会影响性能,所以对redis读写操作进行分离,选择一主多从的集群方式。

图如下

  1. 对于主中的数据有两个副本,即redis1,和 redis2,当一台服务器宕机,其余两台会继续提供服务。
  2. 主中的数据和从上的数据会进行实时的同步,当主写入数据时通过主从复制会复制到两个从服务上。
  3. 只有一个主redis,可以有多个redis。
  4. 主从复制不会阻塞 master,在同步数据的时,master也可以继续处理 client请求。

对于一个redis节点来说,一个redis节点,即可以是主,也可以是从。
如下图所示。

主从复制的过程

当slave第一次启动连接master,或者被认为是第一次连接,是主从采用全量复制,全量复制的执行过程如下。
1. slave redis 会启动,会从redis.conf 中读取 master ip 和 host。
2. 定时任务每秒会检查是否有新的 master 需要连接,如果发现就与 master 建立 socket 连接。
3. slave 会发送 ping 指令到 master。
4. 如果 master 配置 require pass,slave 需要发送认证给 master。
5. salve 会发送sync命令到master。
6. master 会启动一个后台进程,将 redis 中的数据快照 rdb保存到文件中。
7. 启动后台进程的同时,master 会把保存的数据快照期间接收到的写命令缓存起来。
8. master 完成写文件操作后,把 rdb发送给salve。
9. 当salve 完成数据快照的恢复以后,master 会把这期间收集的写命令发送给salve端。
10. 后续master收集到的写命令都会通过之前建立的连接,增量的发送给salve端。

流程图如下

增量复制

当slave节点与master全量同步以后,master节点上的数据会再次发生更新,就会触发增量复制。
当我们在master服务器增减数据的时候,会触发一个相关的函数,接下来在Master服务器上调用每一个命令都会使用相关的函数来同步到slave服务,当然在执行此函数之前,master服务都会判断用户执行的命令是否有数据更新,如果有数据更新,并且slave服务器不为空,才会执行此函数,函数的主要工作就是把用户执行的命令发送到所有的slave服务,让slave服务器执行。

流程图如下

端点续传

端点续传,是针对master和slave之间断开连接进行优化的。
主要过程如下
1. 从服务器向主服务器发送psync命令,携带主服务器的runid和复制偏移量。
2. 主服务器验证runid和自身的runid是否一致,如果不一致,就会进行全量复制。
3. 主服务器验证复制偏移量是否积压在缓冲区内,如不一致,就会进行全量复制。
4. 如果都验证通过,则主服务器将会保持在积压区内的偏移量后的所有数据发送给从服务器,主服务器将会再次回到一致的状态。
流程图如下

优点

  1. 高可靠性,一方面,采用主库出现故障的时自动进行主备切换,从库提升为主库提供服务,保证服务平稳运行,另外一方面,开启数据持久化和配置合理的备份,能够有效的解决掉数据错误操作和数据异常丢失的问题。
  2. 读写分离,从节点可以扩展主节点的读能力,有效应对大并发的读操作。

缺点

  1. 故障恢复复杂。
  2. 主库的写受到单击的限制。
  3. 主库的存储受到单机的限制。

哨兵

什么是哨兵

哨兵是一个分布式架构,其中包含若干个哨兵节点和Redis数据节点,每个哨兵节点会有多个哨兵节点进行监控,当发现节点不可达的时,会对节点做下线的标识,如果标识是主节点,还会和其他哨兵节点进行协调,当大多数哨兵节点都认为主节点不可达的时,会选举出一个哨兵节点来完成自动的故障转移的工作,同时会把这个变化实时的通知给redis应用方,整个过程完全自动,不需要人工介入,所以做到了redis高可用的问题。

哨兵流程

哨兵的流程如下所示

基本的故障转移过程

  1. 主节点出现故障,此时两个从节点与主节点失去连接,主从复制出现失败。

  2. 每个哨兵节点通过定期监控发现主节点出现故障

  3. 多个哨兵节点对主节点的故障达成一致会选举出一个节点作为领导者,进行故障转移。

  4. 哨兵领导者节点执行了故障转移,整个过程和手动的调整一致,只是自动化完成的。

  5. 故障转移以后整个结构如下所示,重新选举了新的主节点。

优缺点

优点

  1. 哨兵部署简单。
  2. 能够解决掉redis主从模式下的高可用切换的问题。
  3. 很方便的实现redis数据节点的线性扩展,轻松突破redis自身的瓶颈,满足要求。
  4. 可以实现一套哨兵监控一组redis数据节点或者多组数据节点。

缺点

  1. 部署相当复杂。
  2. 资源浪费。
  3. 不能解决掉读写分离的问题,实现复杂。

其余

其余有集群,中间件Codis等,用的不太多,所以不在详细说明,这里使用最多的是哨兵,即,一主,二从,三哨兵。

发表评论

电子邮件地址不会被公开。 必填项已用*标注