Redis 三种集群方案:深度剖析与对比
mhr18 2024-12-03 11:38 21 浏览 0 评论
一、Redis 集群的重要性
Redis 在现代服务开发中扮演着至关重要的角色,为了避免单机故障和读写瓶颈,Redis 引入了集群方案。其主从模式、哨兵模式和集群模式的发展历程,充分体现了开发者对高可用性、可扩展性和数据分片存储的不断追求。
在服务开发中,单机的 Redis 可能会面临诸多问题。例如,一旦单机出现故障,整个服务可能会陷入瘫痪,导致数据丢失和业务中断。同时,单机的读写性能也存在极限,当面对大量的并发读写请求时,可能会出现性能瓶颈,影响用户体验。为了解决这些问题,Redis 集群方案应运而生。
主从模式是 Redis 集群的基础模式之一。在主从模式中,一个主服务器可以有多个从服务器,主服务器负责处理写操作,当写操作导致数据变化时,会自动将数据同步给从服务器。从服务器一般只负责处理读操作,通过将读请求分散到不同的从服务器上,可以有效地提高系统的读性能。此外,主从模式还可以通过数据备份提高数据的安全性,当主服务器出现故障时,可以手动将从服务器提升为主服务器,继续提供服务。
哨兵模式则在主从模式的基础上增加了故障自动转移的功能。哨兵是一个独立的进程,它会持续监控 Redis 主从服务器的状态。当主服务器出现故障时,哨兵会自动将从服务器提升为主服务器,并通知其他从服务器切换主服务器,从而实现故障的自动转移,提高系统的可用性。
集群模式是 Redis 为了应对大规模数据存储和高并发读写需求而推出的一种高级模式。在集群模式下,Redis 将整个数据集划分为多个槽,每个槽可以存储一个键值对。每个 Redis 节点负责存储一部分槽,通过这种方式实现数据的分片存储。同时,集群模式还支持节点的自动发现和故障转移,当某个节点出现故障时,其他节点会自动接管其负责的槽,保证系统的持续运行。
综上所述,Redis 集群方案对于提高系统的可用性、可扩展性和性能至关重要。通过不断发展和完善的主从模式、哨兵模式和集群模式,Redis 为服务开发提供了强大的支持,满足了不同场景下的需求。
二、主从模式
1. 基本原理
Redis 提供复制功能,实现 master 数据库中的数据更新后自动同步到 slave 数据库上。一个 master 可以有多个 slave 节点,从节点可以有下级从节点,呈级联结构。具体来说,当从服务器启动后或断开重连后(重连不满足增量同步条件),会向 master 数据库发送 SYNC 命令。master 节点收到 SYNC 命令后会开始在后台保存快照(即 RDB 持久化,在主从复制时,会无条件触发 RDB),并将保存快照期间接收到的命令缓存起来。master 节点执行 RDB 持久化完成后,向所有 slave 节点发送快照 RDB 文件,并在发送快照期间继续记录被执行的写命令。slave 节点收到快照文件后丢弃所有旧数据 (会清空所有数据),载入收到的快照。
master 节点快照发送完毕、slave 节点载入快照完毕后,master 节点开始向 slave 节点发送缓冲区中的写命令。slave 节点完成对快照的载入,开始接收命令请求,并执行来自主数据库缓冲区的写命令。(从数据库初始化完成)master 节点每执行一个写命令就会向 slave 节点发送相同的写命令,slave 节点接收并执行收到的写命令。(命令传播操作,slave 节点初始化完成后的操作)。
2. 优缺点
- 优点:读写分离,提高效率;数据备份,提供多个副本。
- 一个 Master 可以同步多个 Slaves,Slave 还可以接受其他的 Slave 的连接和同步,即所谓的级联结构,有效的减轻 Master 的压力。
- 主从同步期间,主从节点均是非阻塞,不影响服务的查询和写入,可以很好的实现读写分离的架构,系统的伸缩性得到提高。
- 数据备份和恢复:从节点可以作为数据备份,保证在主节点宕机或丢失数据时可以快速恢复。
- 当主节点宕机时,从节点可以自动切换为主节点继续提供服务,保持服务的高可用性和持久性。
- 通过加入更多的从节点,可以实现横向扩展,增加集群处理能力。
- 缺点:不具备自动容错和恢复功能,主节点故障后集群无法工作,从节点升主节点需人工干预。
- 主机的宕机会非常严重,导致整个数据不一致的问题。
- 全量的复制的过程中,必须保证主节点必须有足够的内存。若快照的文件过大,还会对集群的服务能力产生影响。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复。主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性。
- Redis 的主从复制采用全量复制,复制过程中主机会 fork 出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
- 如果所有从节点挂掉,那么这个集群的容灾能力就很差了。
- 由于 Redis 的异步复制机制,当主节点数据有修改而还未同步到从节点时,此时主节点宕机,数据可能会出现不一致的情况。
三、哨兵模式
1. 基本原理
在主从模式基础上增加竞选机制,当主服务器宕机后,从所有从节点竞选出新的主节点。通过启动 sentinel 进程进行监控,不仅监控主从数据库,哨兵之间也相互监控。具体来说,每个哨兵节点维护了三个定时任务:一是通过向主从节点发送 info 命令获取最新的主从结构;二是通过发布订阅功能获取其他哨兵节点的信息;三是通过向其他节点发送 ping 命令进行心跳检测,判断是否下线。
2. 作用及实现原理
- 作用:监控所有服务器运行状态,故障切换后通知其他从服务器修改配置并切换 master。
- 哨兵通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到 master 宕机,会自动将 slave 切换成 master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
- Sentinel 系统用于管理多个 Redis 服务器,执行监控、提醒和自动故障迁移三个任务。监控即不断检查主从服务器是否运作正常;提醒是当被监控的 Redis 服务器出现问题时,可通过 API 向管理员或其他应用程序发送通知;自动故障迁移是当主服务器不能正常工作时,将失效主服务器的其中一个从服务器升级为新的主服务器,并让其他从服务器改为复制新的主服务器,同时向客户端返回新主服务器的地址。
- 实现原理:读取配置文件找出主数据库,与主数据库建立两条连接,定时执行不同操作监控节点状态。
- 哨兵与 Redis Node:Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送 info 命令获取其拓扑结构和状态信息。
- 哨兵与哨兵:基于 Redis 的订阅发布功能,每个 Sentinel 节点会向主节点的 sentinel:hello 频道上发送该 Sentinel 节点对于主节点的判断以及当前 Sentinel 节点的信息,同时每个 Sentinel 节点也会订阅该频道,来获取其他 Sentinel 节点的信息以及它们对主节点的判断。通过以上两步,所有的 Sentinel 节点以及它们与所有的 Redis 节点之间都已经彼此感知到,之后每个 Sentinel 节点会向主节点、从节点、以及其余 Sentinel 节点定时发送 ping 命令作为心跳检测,来确认这些节点是否可达。
3. 主观下线和客观下线
哨兵节点发送 ping 命令,超过一定时间未回复则认为主观下线。当达到指定数量哨兵节点认为主节点主观下线时,即为客观下线。
- 主观下线:每个 sentinel 哨兵节点每隔 1s 向所有的 master、slave 以及其他 sentinel 节点发送一个 PING 命令,作用是通过心跳检测,检测主从服务器的网络连接状态。如果 master 节点回复 PING 命令的时间超过 down-after-milliseconds 设定的阈值(默认 30s),则这个 master 会被 sentinel 标记为主观下线,修改其 flags 状态为 SRI_S_DOWN。
- 客观下线:当 sentinel 哨兵节点将 master 标记为主观下线后,会向其余所有的 sentinel 发送 sentinel is-master-down-by-addr 消息,询问其他 sentinel 是否同意该 master 下线。每个 sentinel 收到命令之后,会根据发送过来的 ip 和 port 检查自己判断的结果,回复自己是否认为该 master 节点已经下线了。回复内容主要包含三个参数(由于上面发送的 runid 参数是 *,这里先忽略后两个参数)down_state(1 表示已下线,0 表示未下线)、leader_runid(领头 sentinal id)、leader_epoch(领头 sentinel 纪元)。sentinel 收到回复之后,如果同意 master 节点进入主观下线的 sentinel 数量大于等于 quorum,则 master 会被标记为客观下线,即认为该节点已经不可用。
四、Cluster 模式
1. 基本概念
Redis Cluster 是一个由多个 Redis 节点组成的分布式数据库系统。它通过将数据分散存储在不同节点上,实现了横向扩展和高可用性。在 Redis Cluster 中,节点之间通过 Gossip 协议进行通信和数据复制,自动维护集群拓扑结构和分片信息。
2. 节点组成及数据分片
- 节点分为主节点和从节点,主节点负责处理读写请求,从节点复制主节点数据并在主节点故障时切换。
- 在 Redis Cluster 中,节点被分为主节点(Master)和从节点(Slave)。主节点主要负责处理读写请求,是数据的主要存储和处理单元。从节点则复制主节点的数据,以实现数据的备份和高可用性。当主节点出现故障时,从节点可以自动切换升为主节点,继续对外服务。
- 通过哈希槽实现数据分片,Redis 集群共有 16384 个哈希槽,每个节点负责一部分槽。
- Redis Cluster 通过哈希槽(Hash Slots)实现数据分片。整个集群共有 16384 个哈希槽,每个节点负责一部分槽位的数据存储。当客户端发送一个请求时,Redis Cluster 会根据请求的键值计算出对应的哈希槽,然后将请求转发到负责该哈希槽的节点上进行处理。这种方式可以将数据均匀地分布在不同的节点上,提高集群的性能和可扩展性。
3. 高可用性
主节点故障时从节点自动切换升为主节点继续对外服务,支持手动主从切换和故障转移操作。
- 在 Redis Cluster 中,主节点故障时从节点会自动切换升为主节点继续对外服务。这种自动故障转移机制可以保证集群的高可用性,即使某个主节点出现故障,也不会影响整个集群的正常运行。此外,Redis Cluster 还支持手动主从切换和故障转移操作,管理员可以根据实际情况进行手动干预,以确保集群的稳定性和可靠性。
五、三种集群方案对比
1. 部署和维护难度
- 主从模式:相对简单,但故障切换需人工干预。
在主从模式下,部署主要涉及配置主从关系,相对较为简单。然而,当主节点出现故障时,需要人工手动将从节点提升为主节点,这个过程较为繁琐,且需要一定的专业知识和操作经验。
- 哨兵模式:引入哨兵进程增加了一定复杂性,但提高了故障自动处理能力。
哨兵模式在主从模式的基础上增加了哨兵进程,用于监控主从节点的状态。部署时需要配置哨兵的参数,如监控的主节点信息、投票阈值等,这增加了一定的复杂性。但是,当主节点出现故障时,哨兵能够自动进行故障转移,将从节点提升为主节点,提高了系统的可用性和稳定性。
- Cluster 模式:部署相对复杂,但功能强大,自动维护集群信息。
Redis Cluster 模式的部署相对复杂,需要配置多个节点,并且要确保节点之间能够正常通信。同时,还需要处理数据分片和节点故障转移等问题。然而,一旦部署成功,Cluster 模式能够自动维护集群信息,实现数据的自动分片和节点的自动故障转移,功能非常强大。
2. 性能表现
- 主从模式:可实现读写分离,但受限于单机性能。
主从模式中,主节点负责处理写操作,从节点负责处理读操作,实现了读写分离。这种方式可以提高系统的读性能,但是由于数据存储在单机上,受限于单机的性能,当数据量较大或并发请求较高时,可能会出现性能瓶颈。
- 哨兵模式:性能与主从模式类似,但在故障切换时可能有短暂性能影响。
哨兵模式在性能上与主从模式类似,同样可以实现读写分离。但是,在主节点故障切换时,可能会出现短暂的性能影响。因为在故障转移过程中,需要进行投票选举新的主节点,并且从节点需要与新的主节点进行同步,这个过程可能会导致一定的延迟。
- Cluster 模式:数据分片和节点通信机制使其在大规模数据和高并发场景下性能更优。
Redis Cluster 模式通过数据分片将数据分散存储在多个节点上,每个节点只负责一部分数据,提高了数据的存储容量和处理能力。同时,节点之间通过 Gossip 协议进行通信,实现了自动故障转移和数据的自动平衡。这种数据分片和节点通信机制使得 Cluster 模式在大规模数据和高并发场景下性能更优。
3. 可扩展性
- 主从模式:难以在线扩容,容量受限于单机配置。
主从模式下,由于数据存储在单机上,容量受限于单机的配置。如果需要扩容,只能通过增加从节点的方式来提高读性能,但无法增加存储容量。而且,主从模式难以在线扩容,需要停机进行操作,这会对业务造成一定的影响。
- 哨兵模式:在主从模式基础上有所改善,但仍有限。
哨兵模式在主从模式的基础上增加了故障自动转移功能,提高了系统的可用性。但是,在可扩展性方面,哨兵模式仍然有限。虽然可以通过增加从节点的方式来提高读性能,但无法增加存储容量。而且,扩容过程也需要停机进行操作,对业务有一定的影响。
- Cluster 模式:支持动态增加新节点进行扩容,提升性能。
Redis Cluster 模式支持动态增加新节点进行扩容。当需要扩容时,可以直接添加新的节点到集群中,集群会自动将数据分片分配到新的节点上,实现了在线扩容。这种方式可以有效地提升系统的性能和存储容量,满足业务不断增长的需求。
六、总结
Redis 的三种集群方案在不同的应用场景下各有其优势和不足。主从模式适用于简单的读写分离场景,部署相对简单,但故障切换需人工干预,且难以在线扩容。哨兵模式在主从模式的基础上增加了自动故障转移功能,提高了系统的可用性,但引入哨兵进程增加了一定的复杂性。Cluster 模式功能强大,通过数据分片和节点通信机制,在大规模数据和高并发场景下性能更优,并且支持动态增加新节点进行扩容。
在实际应用中,应根据业务需求选择合适的 Redis 集群方案。如果对系统的高可用性和性能要求较高,且数据量较大、并发请求高,可以选择 Cluster 模式;如果对可用性要求不是非常高,且希望配置和部署相对简单,可以选择哨兵模式或主从模式。同时,在选择集群方案时,还需要考虑部署和维护的难度、性能表现以及可扩展性等因素,以确保系统能够稳定、高效地运行。
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)