Redis高可用方案
mhr18 2024-11-22 17:41 24 浏览 0 评论
Freemen App是一款专注于IT程序员求职招聘的一个求职平台,旨在帮助IT技术工作者能更好更快入职及努力协调IT技术者工作和生活的关系,让工作更自由!
Redis的性能瓶颈在于内存和网络IO上,针对内存上的性能瓶颈,Redis总共采用了三种技术方案,分别是增加内存、内存淘汰策略以及集群。集群不仅解决了内存瓶颈还是提供了高可用和分布式性能。Redis高可用方案从演变的过程大致分为三种,分别是主从复制模式,哨兵模式、集群模式。
众所周知,单机模式下,如果Redis服务器出现故障,内存中的数据将不复存在,而对应的客户端请求都将打到数据库服务器上,当访问量非常大的情况下,数据库服务器是会崩的。虽然Redis服务恢复了正常,可以通过RDB和AFO从磁盘中恢复数据,但是如果磁盘出现了故障,数据仍旧是不可用的,并且,在单机模式下,读写是不分离的,大量的请求也会出现IO性能瓶颈。
如果同一个数据服务器部署到多台机器上,当一台机器宕机,只要有一个机器仍旧可用就不会影响正常使用。这也正是Redis最初想到的高可用性能方案之一主从复制模式。
一、主从复制模式
主从复制模式就是让一个服务器去复制另一个服务器。我们称被复制的服务器叫主服务器,而对主服务器进行复制的服务器叫从服务器。
Redis的复制功能分为两个部分:同步 和 命令传播 两个操作。当客户端向从服务器发送异步SLAVEOF命令,就意味着让从服务器复制一个主服务器。
1)同步,在Redis2.8版本开始使用了PSYNC命令替代了2.8版本之前的SYNC命令,用来执行复制时的同步操作。PSYNC的命令具有完整重同步和部分重同步两种模式。而SYNC仅支持完整重同步。
2)命令传播,在执行同步完成之后,主从服务器两者的数据达到一致的状态,此时主服务器只需要将自己执行的写命令发送给从服务器,而从服务器只需要一直执行主服务器发来的写命令就可以保证主从服务器的一致性了。
注意:心跳检测,在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令REPLCONF ACK 偏移量 。主要有三个作用,分别是检测网络连接状态、辅助实现min-slaves选项、检测命令丢失。主要是为了保证数据能够安全同步到从服务器并且保证数据状态一致不丢失。
- 完整重同步:它适用于初次复制情况,主要是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。(缓冲区,是因为在发送RDB的同时,有新的写命令过来,而不在RDB文件中的那一部分命令)
- 部分重同步:它适用于断线后的重复制情况,当服务器断线后重新连接了主服务器。如果条件允许,主服务器可以将主服务器连接断开期间所执行的写命令发送给从服务器。从服务器只需要接收并执行这些命令即可,就可以将数据库更新至主服务器当前所处的状态。
1、PSYNC和SYNC同步有什么区别呢?
PSYNC和SYNC同步的区别主要在于,PSYNC支持部分重同步,而SYNC的每次同步都是由主服务器全量的创建并传递RDB文件给从服务器,非常占用网络资源和从服务器导入时的阻塞时间。
2、部分重同步有什么特点呢?
- 主服务器和从服务器分别维护一个复制偏移量
- 标记同步的进度,偏移量相同则完全同步,偏移量不相同则数据未处于一致状态。
- 主服务器的复制积压缓冲区
- 1)主服务器的复制积压缓冲区里面会保存一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。
- 2)通过偏移量,可以得知从服务器所丢失的数据是否在积压缓冲区中,如果存在则进行部分重同步,如果不存在则进行完整重同步。
- 服务器的运行ID
- 1)从服务器初次复制主服务器数据时,主服务器会将自己的运行ID传递给从服务器,而从服务器会存储起来。
- 2)如果从服务器断电后,重新连接上一个主服务器,它会将之前存储的运行ID传递过去。
- 3)如果发送的运行ID和当前连接的服务器运行ID相同,则主服务器可以执行部分重同步操作。否则进行完整重同步操作。
3、主从模式的优缺点
- 优点:支持读写分离,数据备份,提高效率。
- 缺点:不支持自动容错和恢复功能,主节点故障,集群无法正常工作,从节点升级为主节点需要人工干预。
二、哨兵模式
哨兵是实现Redis高可用的解决方案,它是由一个或多个哨兵实例组成的系统。它可以监视任意多个主服务器以及属下的从服务器。当主服务器进入下线状态,它将从下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器替代已下线的服务器继续处理命令请求。
如上图所示,哨兵的核心还是主从复制模式,只是在主服务器下线时多了一个监听的对象,并通过哨兵系统实现了竞选机制,从主服务器下属的从服务器中选择一个最优质的作为新的主服务器。哨兵系统也是有多个哨兵实例组成的,所以哨兵本身也是会出现单点故障,哨兵实例之间也会相互监视。
1、启动并初始化哨兵
哨兵其实就是一个运行在特殊模式下的redis服务器,和普通服务器不同的是,它不会加载RDB或AOF文件,因为哨兵的执行工作和普通服务器执行的工作不同,所以初始化的过程并不完全相同。
哨兵状态中的masters字典结构中记录了所有被哨兵监视的主服务器的信息,字典的键是主服务器的名字,字典的值是被监视主服务器对应的实例结构,这个实例可以是主服务器、从服务器又或者是一个哨兵。
2、创建连向主服务器的网络连接
初始化哨兵之后,会创建连向被监视的主服务器的网络连接,哨兵将成为主服务器的客户端。哨兵会创建两个连向主服务器的异步网络连接。
- 命令连接,用于向主服务器发送命令,并接受命令回复
- 订阅连接,用于订阅主服务器_sentinel_:hello频道
这两个连接主要是为了防止不丢失_sentinel_:hello频道信息,另一方面是用来和主服务器发送命令来进行通信,以及哨兵还必须向主服务器创建命令连接。哨兵需要和多个实例创建网络连接,所以哨兵使用的是异步连接。
3、获取主服务器信息
- 每隔10s向master和 slave发送info命令。作用是获取当前数据库信息,比如发现新增从节点时,会建立连接,并加入到监控列表中,当主从数据库的角色发生变化进行信息更新。
- 每隔2s向主数据里和从数据库的_sentinel_:hello频道发送自己的信息。作用是将自己的监控数据和哨兵分享。每个哨兵会订阅数据库的_sentinel:hello频道,当其他哨兵收到消息后,会判断该哨兵是不是新的哨兵,如果是则将其加入哨兵列表,并建立连接。
- 每隔1s向所有主从节点和所有哨兵节点发送ping命令,作用是监控节点是否存活。
4、主观下线和客观下线
哨兵节点发送ping命令时,当超过一定时间(down-after-millisecond)后,如果节点未回复,则哨兵认为主观下线。
主观下线表示当前哨兵认为该节点已经下线,如果该节点为主数据库,哨兵会进一步判断是否需要进行故障切换,这时候就要发送命令询问其他哨兵节点是否认为该主节点是主观下线,当其他哨兵那里接收到了足够数量(quorum)的已下线判断之后,哨兵就会认为是客观下线,并对主服务器执行故障转移操作。
5、故障转移操作
- 选举领头哨兵
- 选举从服务器优先级最高的服务器,优先级可以通过slave-priority配置
- 优先级相同,则通过复制偏移量越大优先级越高
- 如果以上条件都相同,则选出运行id最小的从数据库
- 选出从数据库后,哨兵通过slave no one命令升级为主服务器
- 最后发送slaveof 命令将其他从节点的主数据库设置为新的主数据库
6、哨兵优缺点
优点
- 解决了主从模式下的故障自动转移切换的问题
缺点
- 始终只有一台主服务器处理请求,写操作受到单机的瓶颈。
- 仍旧复用主从模式,所有从节点的数据都是全量的费内存。
- 主服务器故障,在选举的过程中,服务器会开启保护机制禁止写操作,影响客户端的正常使用。
三、集群模式
Redis集群是Redis提供的分布式数据库方案,相当于每台redis服务器上存储不同的数据,实现了数据解耦,同时解决了Redis容量有限的问题。集群通过分片来进行数据共享,采用多主多从模式,并提供复制和故障转移功能。
集群关键词:节点、槽指派、命令执行、重新分片、转向、故障转移、消息等。
1、节点
一个节点就是一个运行在集群模式下的Redis服务器,它会继续使用所有在单机模式中使用服务器组件。比如:
- 文件事件处理器处理命令请求和返回数据
- 时间事件处理器执行serverCron函数,而serverCron函数会调用集群模式下的clusterCron函数。clusterCron函数主要负责执行集群模式下给其他节点发送Gossip消息,检查节点是否断线,以及自动故障转移等
- 使用数据库保存键值对数据。RDB持久化以及AOF持久化。发布与订阅模式。复制模块等进行节点的复制工作,以及Lua脚本环境执行客户端输入的Lua脚本。
- 节点会继续使用redisServer结构存储服务器状态,继续使用redisClient结构保存客户端状态,以及集群模式下的clusterNode结构存储集群模式下用到的数据以及节点的当前状态(节点的创建时间、名字、当前配置纪元、节点的Ip地址、端口号等等)。
注意:节点和单机服务器的一个区别是,节点只能使用0号数据库,而单机服务器没有这个限制。
2、槽指派
Redis集群通过分片的方式来存储数据库中的键值对。集群的整个数据被分为16384个槽。数据库中的每个键都属于16384个槽的其中一个。集群中的每个节点可以处理0个或最多16384个槽。
数据库中的16384个槽都有被节点处理时,集群才处于在线状态,否则处于下线状态。将槽指派分配给节点的命令是:CLUSTER ADDSLOTS 槽。
一个节点处理哪些槽也都记录在clusterNode结构体中。槽指派主要是使用结构体中的slots(一个二进制位数组)存储。当前节点不仅将槽指派存储在结构体中,它还通过消发送给其他节点告知它们我处理了哪些槽。
因此,集群中的每个节点都会知道数据库中的16384个槽分别被指派给了集群中的哪些节点。
最后,数据库中的16384个槽都进行了指派之后,集群就处于上线状态,此时,客户端就可以向集群中的节点发送数据命令了。
3、命令执行
当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己。
- 若槽就是指派给了当前节点,那么节点直接执行命令。
- 若槽没有指派给当前节点,则节点会向客户端发送一个MOVED错误(客户端看不见的错误隐示操作,其中MOVED错误中包含了正确的节点IP地址和端口号)指引客户端转向正确的节点进行重试。(一个集群客户端通常会与集群中的多个节点创建套接字连接,所谓的节点转向其实就是转换了一个套接字来发送命令,各个节点直接可以计算出命令属于哪个节点)。
4、重新分片&转向
Redis集群的重新分片可以将某个节点(源节点)的槽指派给另一个节点(目标节点)。同时该槽的键值对也会移动到目标节点。重新分片可以在线操作,集群不需要下线,也不影响两个节点的正常工作。
重新分片是通过Redis集群管理软件redis-trib负责执行的。
ASK错误,如果在重新分片的过程中遇到了键的命令请求,可能会触发ASK错误。类似于MOVED错误,ASK错误也是会被隐藏的,并返回目标分片ip和端口号。而对于集群模式下的redis-cli接收到ASK错误,也不会打印错误,而是根据返回的ip+端口号直接转向。若想看到ASK错误,可以在单机模式的redis-cli客户端下访问。
ASK错误和MOVED错误都会导致客户端转向,但是它们也是有区别的。
- MOVED错误表示当前访问的键所在的槽不在当前节点,并且返回正确的节点ip+端口号。客户端每次遇到MOVED错误都会转向。
- ASK错误只是两个节点在迁移槽临时使用的措施,客户端只会在迁移的过程中执行一次命令中转向。
5、故障转移
Redis集群中的节点分为主节点和从节点,主节点用于处理槽,而从节点则用于复制主节点。若主节点下线,则从从节点中选择优质节点替代已下线的主节点。
集群中的每个节点都会定期向其他节点发送ping消息,用来检测对方是否在线。如果对方没有在规定的时间内返回pong,则发送ping的节点可以认为对方疑似下线。
在一个集群里面,半数以上的负责处理槽的主节点都发现某个主节点都疑似下线,那么这个主节点将被标记为下线。将主节点标记为下线的其他主节点并向集群广播主节点下线的消息。所有收到消息的节点都会立即将那个主节点标记为已下线。
一个从节点发现自己复制的主节点下线了,则进行故障转移:
- 选举新的主节点(详细请查阅资料)
- 被选中的从节点会执行 slaveof on one 命令,成为新的主节点
- 新的主节点会撤销所有对已下线主节点的槽指派,并将槽全部指向自己
- 新的主节点向集群广播一条pong消息,告知其他主节点和从节点,自己已成为新的主节点之一,并且接管了已下线的节点所负责的槽。
6、消息
集群中的各个节点通过发送和接收消息来进行通信。节点发送的消息主要有以下5种。
- MEET消息
- PING消息
- PONG消息
- FAIL消息
- PUBLISH消息
注意:一条消息由消息头和消息正文组成。
7、拓展
Codis代理:https://developer.aliyun.com/article/848655
Twemproxy代理
相关推荐
- 【推荐】一个开源免费、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)