当前位置: 首页 > news >正文

Redis主从、哨兵、集群

主从、哨兵、集群

主从

为了避免Redis单点故障问题所以要做主从。写数据只写入主节点,从节点只能读,通过主从复制把主节点的数据复制的从节点。
主从复制如何实现?

主从复制分:全量复制、增量复制。

全量复制:

1、如果新启动了个从节点,从节点没有数据,那就要复制主节点的全量数据给从节点( 第一次同步,全量同步 sync(通过 rdb 文件))。 主从同步建立以后,主节点每执行一条写命令,会通过一个命令传播机制,直接传播到从节点。
2、只有在网络不好或者其他原因断线了,然后从节点的复制偏移量在主节点的复制积压缓冲区才会执行增量同步(psync),超过了偏移量则会发生全量同步(通过 rdb 文件)

全量复制就是:主节点去执行bgsave命令,去生成一个RDB文件,然后把文件发给从节点,从节点收到RDB文件后,清空当前的数据然后加载整个RDB文件到内存中,然后从节点就拥有了主节点的所有数据。(问题:生成RDB文件的过程,主节点也有新的命令写入,新的写命令怎么办?)暂时放到缓冲区,然后发送完RDB文件后再发送缓冲区的命令,最后从节点就收到了全部数据。


增量复制:

**增量复制:**主从在完成全量复制之后,会和从节点去维持一个TCP长链接,后续主节点收到的写命令就会基于这个长链接异步的去发送给所有从节点。

为什么要用RDB?RDB是压缩后的二进制数据对比AOF(是写命令)更小,且RDB里面存的就是数据,从节点收到文件后,直接解析读入内存中即可,很快,AOF是写命令,从节点需要一条一条的执行这些命令,很慢。

Redis主从中,主节点挂了就要手动从多个从节点中选一个新的主节点,然后转从为主,有点麻烦,有没有一种方式可以在如上情况下直接选主,直接转从为主呢?就引出如下的哨兵模式。



哨兵

Redis哨兵能监控所有Redis节点的状态,如果它发现主节点挂了,就能自动的完成主从故障转移工作。
哨兵是怎么发现主节点挂掉的呢?
首先,哨兵会和其他节点去维持一个心跳(其实就是发送一个PING命令),如果主节点长时间都没有回应,那主节点就会被哨兵标记为主观下线(因为哨兵接受不到主节点的响应,也有可能是哨兵本身的问题,也有可能是网络不好,所以不一定是主节点挂了),为了避免误判,哨兵一般会部署三个节点以上的集群,当一个哨兵判断主节点是主观下线了,那就会向其他哨兵发送命令,其他哨兵根据自己的监控情况去投赞成票或反对票,如果说半数以上的哨兵赞成认为主节点挂了,那主节点就会被判定为客观下线(这个时候都认为主节点挂了),这个时候就去做主从故障转移。
问题:主节点被判定客观下线,哨兵如何自动选主和转从为主?
哨兵一般三台以上,哨兵会选出哨兵leader,由这个哨兵leader去做主从故障转移。哨兵leader选举,使用了raft算法(是一个分布式一致性算法)里leader选举的一个思想,选出哨兵leader之后,会从所有的从节点里面选一个来转从为主,哨兵leader选出新的主节点后,会向其他的从节点去发送一条命令,把新主节点的信息同步给各个从节点,从节点就会把日志复制的目标改成新的主节点,然后哨兵leader会把新的主节点信息发送到客户端,最后哨兵leader还会监控旧的主节点,旧主节点上线之后会把它设置为一个从节点。

(在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。)



集群

一、因为Redis的主节点和从节点存的都是全量数据,一旦有大量的数据写入Redis,单机的内存可能就不够用了,且数据量大了,会影响RDB持久化的性能。
二、因为写操作只能在主节点上执行,那主从的写操作就会有单机的瓶颈无法拓展。
基于两个问题就有了Redis分片集群:部署多个Redis节点构成一个集群,然后把数据分散的存储在不同的Redis节点上,这样每个Redis节点只保存一部分数据,这就解决了单节点数据量大的问题,且每个节点都能用来写,这就解决了写操作的单机性能瓶颈,后面拓展直接新增节点即可。
**问题:Redis集群中某个节点挂了怎么办?**为了保证集群的高可用,集群中的每个节点都要单独做主从。
**问题:分片集群,具体是怎么做分片?**Redis集群做分片,主要是用了16384个哈希槽,创建Redis集群的时候,就会自动的平均分配16384个哈希槽到各个节点,每个节点只负责一部分的哈希槽。
对Redis做读写的时候,一个key进来,用CRC16算法计算出一个值然后对16384进行取余,就能计算出这个key应该被分配到哪个槽中,然后再找这个槽对应的Redis节点去做读写。
问题:Redis集群扩容及缩容的时候,哈希槽就会迁移到其他节点,若访问的key对应的槽正在迁移怎么办? key到了对应的槽发现不是当前节点进行管理的,就会触发重定向到最新负责的节点,然后再重新进行请求。
问题:在集群里面,不同的节点要互相通信需要交换信息,这样才能得知哪些节点是能正常通信的,哪些挂了,哪些新加进来了,那Redis集群各个节点是如何通信的? Redis集群主要是通过gossip协议进行通信,gossip协议的思想:周期性的选择一些节点(定时任务),把当前节点存储的信息传播给选择的节点,收到信息后呢,干同样的事情,也选择一些节点再传播信息。
问题:集群中某个节点挂了怎么办? 由于Redis集群是使用gossip协议来互相通信,所以集群就不需要使用哨兵去做监控,当一个节点认为另外一个节点挂了,这个时候就会认为这个节点是主观下线,当超过一半的节点认为这个节点挂了,这个时候就会标记为客观下线,然后通过gossip协议去传播(广播fail消息),触发一个故障转移。
如果挂的是从节点:那对应的主节点就会把这个从节点,从日志复制的列表中移除。
如果挂的是主节点:那其他主节点就会进行投票,选出一个从节点然后转从为主,然后由新的主节点去接管这些哈希槽,然后通过gossip协议去广播通知其他节点,新主节点的诞生。



redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。


Redis主从复制风暴是怎么回事
如果Redis主节点有很多从节点,在某一时刻如果所有从节点都同时连接主节点,那么主节点会同时把内存快照RDB发给多个从节点,这样会导致Redis主节点压力非常大,这就是所谓的Redis主从复制风暴问题。
这种问题我们对Redis主从架构做一些优化得以避免,比如可以做下面这种树形复制架构(某几个从节点挂在从节点下)。


Redis集群网络抖动导致频繁主从切换怎么处理

真实世界的机房网络往往并不是风平浪静的,它们经常会发生各种各样的小问题。比如网络抖动就是非常常见的一种现象,突然之间部分连接变得不可访问,然后很快又恢复正常。
为解决这种问题,Redis Cluster提供了一种选项cluster-node-timeout,表示当某个节点持续timeout的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换(数据的重新复制)。


Redis集群为什么至少需要三个master节点

因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。


Redis集群为什么推荐奇数个节点

因为新master的选举需要大于半数的集群master节点同意才能选举成功,奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。


Redis集群支持批量操作命令吗

对于类似mset,mget这样的多个key的原生批量操作命令,redis集群只支持所有key落在同一slot的情况,如果有多个key一定要用mset命令在redis集群上操作,则可以在key的前面加上{XXX},这样参数数据分片hash计算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去,示例如下:

mset {user1}:1:name zhuge {user1}:1:age 18

假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 user1 做 hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot。


Lua脚本能在Redis集群里执行吗

Redis官方规定Lua脚本如果想在Redis集群里执行,需要Lua脚本里操作的所有Redis Key落在集群的同一个节点上,这种的话我们可以给Lua脚本的Key前面加一个相同的hash tag,就是{XXX},这样就能保证Lua脚本里所有Key落在相同的节点上了。

http://www.dtcms.com/a/517216.html

相关文章:

  • JavaScript 核心知识学习笔记:给Java开发者的实战指南
  • 成都网站建设科资阳公司网站建设
  • 网站建设伍金手指下拉2wordpress在文章里面加歌曲
  • 网站设计 书籍网站改备案信息吗
  • 自己做网站系统首选平台无锡网站制作工具
  • 南昌市建设网站建网站建网站的公司
  • 合合信息亮相PRCV:多模态文本智能与内容安全双擎驱动的技术突破与实践解析
  • 哪家网站做的比较好建设银行河北分行网站
  • 吉林省建设集团有限公司网站网上做广告宣传
  • 区间dp|单调deque
  • 【MySQL 数据库】使用C语言操作MySQL
  • 宜黄住房和城乡建设部网站wordpress可以做门户网站
  • 怎样破解网站后台密码网页优化seo公司
  • Goroutine 和 Channel
  • [Dify 实战] 插件认证与安全策略:API Key、Token 等配置全解析
  • vs做的网站如何温州网牌电线
  • 知名网站制作服务租服务器
  • 中国银行建设网站首页上海自贸区注册公司在哪里
  • 开源隐私计算框架SecretFlow | 基于隐语的金融全链路场景介绍和应用实践
  • 【20】MFC入门到精通——MFC 运行或调试状态在 VS输出框,打印字符串信息 OutputDebugString(str);
  • 唐山cms模板建站南昌网站优化
  • 年化454.23%,最大回撤6.97%,加上了每笔订单的交易细节,系统及策略代码已发布
  • 企业招聘新趋势:「AI面试」如何破解在线作弊难题?
  • 人工智能风险与伦理(1)
  • 做网站能赚到钱吗深圳优化怎么做搜索
  • 怎么编辑网站甘肃住房城乡建设厅网站
  • 【仓颉语言】原生智能、全场景与强安全的设计哲学
  • vue使用d3实现图片的缩放、拖动、添加/删除标记等功能
  • 云南建站专业网站建设模块
  • 心悦dnf免做卡网站淘宝客网站如何做