Redis集群与扩展知识点分析

Redis集群与扩展知识点分析

Redis的高可用

1.为什么要高可用

  • 防止单点故障,造成整个集群不可用

  • 实现高可用通常的做法是将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务

  • Redis实现高可用有三种部署模式:主从模式,哨兵模式,集群模式

2.主从模式

  • 主节点负责读写操作

  • 从节点只负责操作

  • 从节点的数据来自主节点,实现原理就是主从复制机制

  • 主从复制包括全量复制,增量复制两种

  • 当slave名列前茅次启动连接master,或者认为是名列前茅次连接就采用全量复制
    Redis集群与扩展知识点分析

  • slave与master全量同步之后,master上的数据如果再次发生更新,就会触发增量复制
    Redis集群与扩展知识点分析

3.哨兵模式

  • 主从模式中,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,显然多数业务场景都不能接受这种故障处理方式,Redis从2.8开始正式提供了Redis Sentinel(哨兵)架构来解决这个问题

  • 哨兵模式是由一个或多个Sentinel实例组成的Sentinel系统,可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时自动将下线主服务器属下的某个从节点升级为新的主节点

  • 但是一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点),因此可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行监控
    Redis集群与扩展知识点分析

  • 简单来说,哨兵模式就三个作用

1.发送命令,等待Redis服务器(包括主服务器和从服务器)返回监控其运行状态2.哨兵监测到主节点宕机会自动将从节点切换成主节点,然后通过发布订阅模式通知其他的从节点修改配置文件,让它们切换主机3.哨兵之间还会相互监控,从而达到高可用
  • 故障切换过程如下

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行 failover 过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线当后面的哨兵也检测到主服务器不可用并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作切换成功后通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线这样对于客户端而言,一切都是透明的
  • 哨兵的工作模式

每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他Sentinel实例发送一个PING命令如果实例距离最后一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线一般情况下,每个Sentinel会以每10秒一次的频率向它已知的所有Master,Slave发送INFO命令当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除;若Master重新向Sentinel的PING命令返回有效回复,Master 的主观下线状态就会被移除

4.Cluster集群模式

  • 哨兵模式基于主从模式,实现读写分离,还可以自动切换,系统可用性更高,但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容,因此Cluster集群应运而生,它在Redis3.0加入的

  • Cluster集群实现Redis的分布式存储,对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题,并且它也提供复制和故障转移的功能

  • Redis Cluster集群通过Gossip协议进行通信,节点之间不断交换信息,交换的信息内容包括节点出现故障、新节点加入、主从节点变更信息、slot信息等等,常用的Gossip消息分别是ping、pong、meet、fail

ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息meet消息:通知新节点加入,消息发送者通知接收者加入到当前集群,meet消息通信正常完成后,接收节点会加入到集群中并进行周期性的ping、pong消息交换pong消息:当接收到ping、meet消息时,作为响应消息回复给发送方确认消息正常通信;pong消息内部封装了自身状态数据,节点也可以向集群内广播自身的pong消息来通知整个集群对自身状态进行更新fail消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态
  • Hash Slot插槽算法

既然是分布式存储,Cluster集群使用的分布式算法是一致性Hash嘛?并不是,而是Hash Slot插槽算法插槽算法把整个数据库被分为16384个slot(槽),每个进入Redis的键值对根据key进行散列,分配到这16384插槽中的一个使用的哈希映射也比较简单,用CRC16算法计算出一个16位的值,再对16384取模,数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点都可以处理这16384个槽集群中的每个节点负责一部分的hash槽,比如当前集群有A、B、C个节点,每个节点上的哈希槽数 =16384/3,那么就有:	节点A负责0~5460号哈希槽	节点B负责5461~10922号哈希槽	节点C负责10923~16383号哈希槽Redis Cluster集群中,需要确保16384个槽对应的node都正常工作,如果某个node出现故障,它负责的slot也会失效,整个集群将不能工作为了保证高可用,Cluster集群引入了主从复制,一个主节点对应一个或者多个从节点,当其它主节点ping一个主节点A时,如果半数以上的主节点与 A通信超时,那么认为主节点A宕机,如果主节点宕机时,就会启用从节点Redis的每一个节点上都有两个玩意,一个是插槽slot(0~16383),另外一个是cluster,可以理解为一个集群管理的插件,当我们存取的key到达时,Redis会根据Hash Slot插槽算法取到编号在0~16383之间的哈希槽,通过这个值去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

5.实现高可用后的故障转移问题

  • 主观下线: 某个节点认为另一个节点不可用,即下线状态,这个状态并不是最终的故障判定,只能代表一个节点的意见,可能存在误判情况
    Redis集群与扩展知识点分析

  • 客观下线: 标记一个节点真正的下线,集群内多个节点都认为该节点不可用,从而达成共识的结果,如果是持有槽的主节点故障,需要为该节点进行故障转移
    Redis集群与扩展知识点分析

  • 故障恢复:故障发现后,如果下线节点的是主节点,则需要在它的从节点中选一个替换它,以保证集群的高可用
    Redis集群与扩展知识点分析

Redis分布式锁带来的系列问题及解决

1.Redisson

  • 分布式锁可能存在锁过期释放,业务没执行完的问题

  • 能不能将锁的过期时间设置得长点来解决此问题呢?显然是不太好的,业务的执行时间是不确定的

  • Redisson解决该问题,给获得锁得线程开启定时守护线程,每隔一段时间检查锁是否存在,存在则延长锁的过期时间,防止锁过期提前释放
    Redis集群与扩展知识点分析

2.Redlock算法

  • 线程一在Redis的master节点上拿到了锁,但是加锁的key还没同步到slave节点,恰好这时master节点发生故障,一个slave节点就会升级为master节点,线程二就可以获取同个key的锁啦,但线程一也已经拿到锁了,锁的安全性就没了
    Redis集群与扩展知识点分析

  • Redlock解决这个问题,即部署多个Redis master以保证它们不会同时宕掉,并且这些master节点是完全相互独立的,相互之间不存在数据同步,实现步骤如下
    Redis集群与扩展知识点分析

MySQL与Redis如何保证双写一致性

1.延时双删

  • 更新数据库后延迟休眠一会再删除缓存

  • 这种方案还可以,只有休眠那一会可能有脏数据,一般业务也会接受的

  • 但是如果第二次删除缓存失败呢?缓存和数据库的数据还是可能不一致

  • 给Key设置一个自然的expire过期时间,让它自动过期怎样?业务在该过期时间内接受的数据的不一致怎么办?还是有其他更佳方案
    Redis集群与扩展知识点分析

2.删除缓存重试机制

  • 延时双删可能会存在第二步的删除缓存失败,导致的数据不一致问题

  • 删除失败就多删除几次呀,保证删除缓存成功就可以了呀,所以可以引入删除缓存重试机制
    Redis集群与扩展知识点分析

3.读取biglog异步删除缓存

  • 重试删除缓存机制会造成好多业务代码入侵,所以引入读取biglog异步删除缓存
    Redis集群与扩展知识点分析

感谢各位的阅读,以上就是“Redis集群与扩展知识点分析”的内容了,经过本文的学习后,相信大家对Redis集群与扩展知识点分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

文章标题:Redis集群与扩展知识点分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/25584

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月15日 下午11:33
下一篇 2022年9月15日 下午11:34

相关推荐

  • windows中该内存不能为written如何解决

    该内存不能为written解决方法 一、如果能排除硬件上的原因(内存条不兼容,更换内存。显卡驱动是否正确按装或者是否被恶意覆盖否?)往下看: 二、系统或其它软件引起的,可用下述方法处理: 1.系统本身有问题,及时安装官方发行的补丁,必要时重装系统。 2.病毒问题:杀毒。 3.杀毒软件与其它软件冲突:…

    2022年9月2日
    1.1K00
  • php字符串如何转为浮点型

    3种转换方法:1、在要转换的字符串之前加上用括号括起来的目标类型“(float)”、“(double)”或“(real)”,语法“(float)字符串”。2、使用floatval()函数,可以获取字符串变量的浮点值,语法“floatval(字符串变量)”。3、使用settype()函数,可以将字符串…

    2022年9月26日
    1.2K00
  • 如何入门WEB信息收集

    信息收集(Information Gathering),信息收集是指通过各种方式获取所需要的信息。信息收集是信息得以利用的名列前茅步,也是关键的一步。信息收集工作的好坏,直接关系到整个信息管理工作的质量。 在实战中,前期的信息收集的完整性,很大一部分决定了在对网站进行的测试的成功几率,能够收集的越多…

    2022年9月24日
    1.1K00
  • windows如何修改一张图片的分辨率

    修改方法 1、打开图片,右击选择属性。可以从属性详细信息中查看到这个图片的分辨率。当前这个图片分辨率为687*379。 2、右击图片,选择编辑。打开图片编辑界面。也可以直接打开画图软件,在画图软件中打开需要编辑的这张图片。 3、选择工具栏中的重新调整大小选项。点击打开,会出现如图所示界面,通过这两个…

    2022年9月21日
    11.8K00
  • windows浩辰cad看图王图片怎么放大

    浩辰cad看图王图片放大步骤: 一、按钮调整。 1、打开对应的文件。 2、找到如图位置的放大镜按钮。 3、选择需要使用的放大/缩小。 二、鼠标调整。 按住你的键盘ctrl,同时滑动鼠标的滚轮,向上是放大,向下是缩小。 到此,关于“windows浩辰cad看图王图片怎么放大”的学习就结束了,希望能够解…

    2022年9月21日
    77600
  • Word尾注怎么合并注释文献

    尾注合并注释文献的方法: 1、首先打开电脑上面的word。 2、之后点击上面的“插入”。 3、然后在选择里面的“交叉引用”。 4、点击之后会出现一个窗口,选择“引用类型”, 然后去点击“要用的尾注”。 5、最后点击确定即可。 关于“Word尾注怎么合并注释文献”的内容就介绍到这里了,感谢大家的阅读。…

    2022年8月31日
    1.5K00
  • Apache Flink未授权访问远程代码命令执行的复现

    Apache Flink未授权访问-远程代码命令执行漏洞复现 Apache Flink Dashboard默认没有用户权限认证。攻击者可以通过未授权的Flink Dashboard控制台,直接上传木马jar包,可远程执行任意系统命令获取服务器权限,风险极大。 二、影响版本 Apache Flink …

    2022年9月10日
    1.5K00
  • mysql中odbc的概念是什么

    在mysql中,odbc的中文意思为“开放式数据库连接”, 是用于访问数据库的开放式标准应用程序编程接口(API),允许与SQL数据库服务器进行连接。odbc是根据SQL Access Group的规范开发的,它定义了一套函数调用、错误代码和数据类型,可将其用于开发独立于数据库的应用程序。 本教程操…

    2022年9月20日
    98500
  • 电脑蓝屏0x00000050如何解决

    解决方法: 方法一: 1、应用程序冲突是较好解决的。 2、首先我们重启电脑,然后在开机时按下键盘“F8”,再选择“疑难解答” 3、接着进入高级选项,在其中找到“启动设置” 4、再按下键盘“F4”,尝试进入安全模式。如果可以进入安全模式应该就是应用程序冲突问题。 5、进入安全模式后,只需要在其中将最近…

    2022年9月18日
    77100
  • 如何用rank函数排名

    用rank函数排名的方法: 1、首先进入空白单元格,然后输入:=RANK( )来进行排名。 2、然后去点击E2单元格,即可获得rank的名列前茅个参数,然后输入逗号。 3、之后就可以去框选所有的数据,并且去获取函数的第二个参数。 4、然后按下F4,即可对rank函数的第二个参数做绝对引用。 5、按下…

    2022年8月30日
    84200
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部