加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

调研Redis高可用两种方案

发布时间:2019-05-15 18:28:12 所属栏目:评测 来源:高可用架构
导读:副标题#e# 导读:Redis是被广泛使用的基础软件之一。对于工程师和,架构师,运维人员来说,了解Redis的高可用方案和背后的原理,是必备的基础知识。本文作者深入分析了Redis高可用的方方面面,并且做了有效总结,相信对广大读者可以起到很好的领路作用。 作
副标题[/!--empirenews.page--]

导读:Redis是被广泛使用的基础软件之一。对于工程师和,架构师,运维人员来说,了解Redis的高可用方案和背后的原理,是必备的基础知识。本文作者深入分析了Redis高可用的方方面面,并且做了有效总结,相信对广大读者可以起到很好的领路作用。

作者 codedump codedump.info 博主,多年从事互联网服务器后台开发工作。可访问作者博客阅读 codedump 更多文章。

Redis中为了实现高可用(High Availability,简称HA),采用了如下两个方式:

  • 主从复制数据。

  • 采用哨兵监控数据节点的运行情况,一旦主节点出现问题由从节点顶上继续进行服务。

主从复制

Redis中主从节点复制数据有全量复制和部分复制之分。

旧版本全量复制功能的实现

全量复制使用snyc命令来实现,其流程是:

  • 从服务器向主服务器发送sync命令。

  • 主服务器在收到sync命令之后,调用bgsave命令生成最新的rdb文件,将这个文件同步给从服务器,这样从服务器载入这个rdb文件之后,状态就会和主服务器执行bgsave命令时候的一致。

  • 主服务器将保存在命令缓冲区中的写命令同步给从服务器,从服务器执行这些命令,这样从服务器的状态就跟主服务器当前状态一致了。

调研Redis高可用两种方案

旧版本全量复制功能,其最大的问题是从服务器断线重连时,即便在从服务器上已经有一部分数据了,也需要进行全量复制,这样做的效率很低,于是新版本的Redis在这部分做了改进。

新版本全量复制功能的实现

新版本Redis使用psync命令来代替sync命令,该命令既可以实现完整全同步也可以实现部分同步。

复制偏移量

执行复制的双方,主从服务器,分别会维护一个复制偏移量:

  • 主服务器每次向从服务器同步了N字节数据之后,将修改自己的复制偏移量+N。

  • 从服务器每次从主服务器同步了N字节数据之后,将修改自己的复制偏移量+N。

复制积压缓冲区

主服务器内部维护了一个固定长度的先进先出队列做为复制积压缓冲区,其默认大小为1MB。

在主服务器进行命令传播时,不仅会将写命令同步到从服务器,还会将写命令写入复制积压缓冲区。

调研Redis高可用两种方案

服务器运行ID

每个Redis服务器,都有其运行ID,运行ID由服务器在启动时自动生成,主服务器会将自己的运行ID发送给从服务器,而从服务器会将主服务器的运行ID保存起来。

从服务器Redis断线重连之后进行同步时,就是根据运行ID来判断同步的进度:

  • 如果从服务器上面保存的主服务器运行ID与当前主服务器运行ID一致,则认为这一次断线重连连接的是之前复制的主服务器,主服务器可以继续尝试部分同步操作。

  • 否则,如果前后两次主服务器运行ID不相同,则认为是完成全同步流程。

psync命令流程

有了前面的准备,下面开始分析psync命令的流程:

  • 如果从服务器之前没有复制过任何主服务器,或者之前执行过slaveof no one命令,那么从服务器就会向主服务器发送psync ? -1命令,请求主服务器进行数据的全量同步。

  • 否则,如果前面从服务器已经同步过部分数据,那么从服务器向主服务器发送psync <runid> <offset>命令,其中runid是上一次主服务器的运行id,offset是当前从服务器的复制偏移量。

前面两种情况主服务器收到psync命令之后,会出现以下三种可能:

  • 主服务器返回+fullresync <runid> <offset>回复,表示主服务器要求与从服务器进行完整的数据全量同步操作。其中,runid是当前主服务器运行id,而offset是当前主服务器的复制偏移量。

  • 如果主服务器应答+continue,那么表示主服务器与从服务器进行部分数据同步操作,将从服务器缺失的数据同步过来即可。

  • 如果主服务器应答-err,那么表示主服务器版本低于2.8,识别不了psync命令,此时从服务器将向主服务器发送sync命令,执行完整的全量数据同步。

调研Redis高可用两种方案

哨兵机制概述

Redis使用哨兵机制来实现高可用(HA),其大概工作原理是:

  • Redis使用一组哨兵(sentinel)节点来监控主从redis服务的可用性。

  • 一旦发现Redis主节点失效,将选举出一个哨兵节点作为领导者(leader)。

  • 哨兵领导者再从剩余的从Redis节点中选出一个Redis节点作为新的主Redis节点对外服务。

以上将Redis节点分为两类:

  • 哨兵节点(sentinel):负责监控节点的运行情况。

  • 数据节点:即正常服务客户端请求的Redis节点,有主从之分。

以上是大体的流程,这个流程需要解决以下几个问题:

  • 如何对Redis数据节点进行监控?

  • 如何确定一个Redis数据节点失效?

  • 如何选择出一个哨兵领导者节点?

  • 哨兵节点选择新的主Redis节点的依据是什么?

以下来逐个回答这些问题。

三个监控任务

哨兵节点通过三个定时监控任务监控Redis数据节点的服务可用性。

info命令

每隔10秒,每个哨兵节点都会向主、从Redis数据节点发送info命令,获取新的拓扑结构信息。

Redis拓扑结构信息包括了:

  • 本节点角色:主或从。

  • 主从节点的地址、端口信息。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读