Redis中为了实现高可用(High Availability,简称HA),采用了如下两个方式:
主从复制数据。
采用哨兵监控数据节点的运行情况,一旦主节点出现问题由从节点顶上继续进行服务。
主从复制
Redis中主从节点复制数据有全量复制和部分复制之分。
旧版本全量复制功能的实现
全量复制使用snyc命令来实现,其流程是:
从服务器向主服务器发送sync命令。
主服务器在收到sync命令之后,调用bgsave命令生成***的rdb文件,将这个文件同步给从服务器,这样从服务器载入这个rdb文件之后,状态就会和主服务器执行bgsave命令时候的一致。
主服务器将保存在命令缓冲区中的写命令同步给从服务器,从服务器执行这些命令,这样从服务器的状态就跟主服务器当前状态一致了。
旧版本全量复制功能,其***的问题是从服务器断线重连时,即便在从服务器上已经有一部分数据了,也需要进行全量复制,这样做的效率很低,于是新版本的Redis在这部分做了改进。
新版本全量复制功能的实现
Redis的最新版本采用psync命令替代了sync命令,psync命令不仅可以实现完全同步,还可以实现部分同步。
复制偏移量
执行复制的双方,主从服务器,分别会维护一个复制偏移量:
主服务器每次向从服务器同步了N字节数据之后,将修改自己的复制偏移量+N。
从服务器每次从主服务器同步了N字节数据之后,将修改自己的复制偏移量+N。
复制积压缓冲区
主服务器内部维护了一个固定长度的先进先出队列做为复制积压缓冲区,其默认大小为1MB。
在主服务器进行命令传播时,不仅会将写命令同步到从服务器,还会将写命令写入复制积压缓冲区。
服务器运行ID
每个Redis服务器,都有其运行ID,运行ID由服务器在启动时自动生成,主服务器会将自己的运行ID发送给从服务器,而从服务器会将主服务器的运行ID保存起来。
从服务器Redis断线重连之后进行同步时,就是根据运行ID来判断同步的进度:
如果从服务器上面保存的主服务器运行ID与当前主服务器运行ID一致,则认为这一次断线重连连接的是之前复制的主服务器,主服务器可以继续尝试部分同步操作。
否则,如果前后两次主服务器运行ID不相同,则认为是完成全同步流程。
psync命令流程
有了前面的准备,下面开始分析psync命令的流程:
如果从服务器之前没有复制过任何主服务器,或者之前执行过slaveof no one命令,那么从服务器就会向主服务器发送psync ? -1命令,请求主服务器进行数据的全量同步。
否则,如果前面从服务器已经同步过部分数据,那么从服务器向主服务器发送psync
命令,其中runid是上一次主服务器的运行id,offset是当前从服务器的复制偏移量。
前面两种情况主服务器收到psync命令之后,会出现以下三种可能:
主服务器返回+fullresync
回复,表示主服务器要求与从服务器进行完整的数据全量同步操作。当前主服务器的运行id为runid,复制偏移量为offset。 如果主服务器应答+continue,那么表示主服务器与从服务器进行部分数据同步操作,将从服务器缺失的数据同步过来即可。
如果主服务器应答-err,那么表示主服务器版本低于2.8,识别不了psync命令,此时从服务器将向主服务器发送sync命令,执行完整的全量数据同步。
哨兵机制概述
Redis使用哨兵机制来实现高可用(HA),其大概工作原理是:
Redis使用一组哨兵(sentinel)节点来监控主从redis服务的可用性。
一旦发现Redis主节点失效,将选举出一个哨兵节点作为***(leader)。
哨兵***再从剩余的从Redis节点中选出一个Redis节点作为新的主Redis节点对外服务。
以上将Redis节点分为两类:
哨兵节点(sentinel):负责监控节点的运行情况。
数据节点:即正常服务客户端请求的Redis节点,有主从之分。
以上是大体的流程,这个流程需要解决以下几个问题:
如何对Redis数据节点进行监控?
如何确定一个Redis数据节点失效?
如何选择出一个哨兵***节点?
哨兵节点选择新的主Redis节点的依据是什么?
以下来逐个回答这些问题。
三个监控任务
哨兵节点通过三个定时监控任务监控Redis数据节点的服务可用性。
info命令
每隔10秒,每个哨兵节点都会向主、从Redis数据节点发送info命令,获取新的拓扑结构信息。
Redis拓扑结构信息包括了:
本节点角色:主或从。
主从节点的地址、端口信息。
这样,哨兵节点就能从info命令中自动获取到从节点信息,因此那些后续才加入的从节点信息不需要显式配置就能自动感知。
向__sentinel__:hello频道同步信息
每隔2秒,每个哨兵节点将会向Redis数据节点的__sentinel__:hello频道同步自身得到的主节点信息以及当前哨兵节点的信息,由于其他哨兵节点也订阅了这个频道,因此实际上这个操作可以交换哨兵节点之间关于主节点以及哨兵节点的信息。
这一操作实际上完成了两件事情: * 发现新的哨兵节点:如果有新的哨兵节点加入,此时保存下来这个新哨兵节点的信息,后续与该哨兵节点建立连接。用下列方式重写: * 交换主节点的状态信息,以便后续客观地判断主节点是否已下线。
向数据节点做心跳探测
每隔1秒,每个哨兵节点向主、从数据节点以及其他sentinel节点发送ping命令做心跳探测,这个心跳探测是后续主观判断数据节点下线的依据。
主观下线和客观下线
主观下线
上面三个监控任务中的第三个探测心跳任务,如果在配置的down-after-milliseconds之后没有收到有效回复,那么就认为该数据节点“主观下线(sdown)”。
为什么称为“主观下线”?因为在一个分布式系统中,有多个机器在一起联动工作,网络可能出现各种状况,仅凭一个节点的判断还不足以认为一个数据节点下线了,这就需要后面的“客观下线”。
客观下线
当一个哨兵节点认为主节点主观下线时,该哨兵节点需要通过”sentinel is-master-down-by addr”命令向其他哨兵节点咨询该主节点是否下线了,如果有超过半数的哨兵节点都回答了下线,此时认为主节点“客观下线”。
选举哨兵***
当主节点客观下线时,需要选举出一个哨兵节点做为哨兵***,以完成后续选出新的主节点的工作。
这个选举的大体思路是:
每个哨兵节点通过向其他哨兵节点发送”sentinel is-master-down-by addr”命令来申请成为哨兵***。
而每个哨兵节点在收到一个”sentinel is-master-down-by addr”命令时,只允许给***个节点投票,其他节点的该命令都会被拒绝。
如果一个哨兵节点收到了半数以上的同意票,则成为哨兵***。
如果前面三步在一定时间内都没有选出一个哨兵***,将重新开始下一次选举。
可以看到,这个选举***的流程很像raft中选举leader的流程。
选出新的主节点
在剩下的Redis从节点中,按照以下顺序来选择新的主节点:
过滤掉“不健康”的数据节点:比如主观下线、断线的从节点、五秒内没有回复过哨兵节点ping命令的节点、与主节点失联的从节点。
如果存在slave-priority(从节点优先级)***的从节点,则返回该节点;否则继续执行后续流程。
选择复制偏移量***的从节点,这意味着这个从节点上面的数据最完整,如果存在则返回不存在则继续后面的流程。
到了这里,所有剩余从节点的状态都是一样的,选择runid最小的从节点。
提升新的主节点
选择了新的主节点之后,还需要***的流程让该节点成为新的主节点:
哨兵***向上一步选出的从节点发出“slaveof no one”命令,让该节点成为主节点。
哨兵***向剩余的从节点发送命令,让它们成为新主节点的从节点。
哨兵节点集合会将原来的主节点更新为从节点,当其恢复之后命令它去复制新的主节点的数据。
以上是Redis高可用的两种实现方案是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。 Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显着提升其性能。

Redis和SQL数据库的主要区别在于:Redis是内存数据库,适用于高性能和灵活性需求;SQL数据库是关系型数据库,适用于复杂查询和数据一致性需求。具体来说,1)Redis提供高速数据访问和缓存服务,支持多种数据类型,适用于缓存和实时数据处理;2)SQL数据库通过表格结构管理数据,支持复杂查询和事务处理,适用于电商和金融系统等需要数据一致性的场景。

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

Redis与其他数据库相比,具有以下独特优势:1)速度极快,读写操作通常在微秒级别;2)支持丰富的数据结构和操作;3)灵活的使用场景,如缓存、计数器和发布订阅。选择Redis还是其他数据库需根据具体需求和场景,Redis在高性能、低延迟应用中表现出色。

Redis在数据存储和管理中扮演着关键角色,通过其多种数据结构和持久化机制成为现代应用的核心。1)Redis支持字符串、列表、集合、有序集合和哈希表等数据结构,适用于缓存和复杂业务逻辑。2)通过RDB和AOF两种持久化方式,Redis确保数据的可靠存储和快速恢复。

Redis是一种NoSQL数据库,适用于大规模数据的高效存储和访问。1.Redis是开源的内存数据结构存储系统,支持多种数据结构。2.它提供极快的读写速度,适合缓存、会话管理等。3.Redis支持持久化,通过RDB和AOF方式确保数据安全。4.使用示例包括基本的键值对操作和高级的集合去重功能。5.常见错误包括连接问题、数据类型不匹配和内存溢出,需注意调试。6.性能优化建议包括选择合适的数据结构和设置内存淘汰策略。

Redis在现实世界中的应用包括:1.作为缓存系统加速数据库查询,2.存储Web应用的会话数据,3.实现实时排行榜,4.作为消息队列简化消息传递。Redis的多功能性和高性能使其在这些场景中大放异彩。

Redis脱颖而出是因为其高速、多功能性和丰富的数据结构。1)Redis支持字符串、列表、集合、散列和有序集合等数据结构。2)它通过内存存储数据,支持RDB和AOF持久化。3)从Redis6.0开始引入多线程处理I/O操作,提升了高并发场景下的性能。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器