Redis三种集群模式详解


Posted in Redis onOctober 05, 2021

三种集群模式

  • redis有三种集群模式,其中主从是最常见的模式。
  • Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,主要作用就是监控主从集群,自动切换主备,完成集群故障转移。
  • cluster 模式是redis官方提供的集群模式,使用了Sharding 技术,不仅实现了高可用、读写分离、也实现了真正的分布式存储。

一、主从复制

redis主从复制

1、reids主从模式

Redis三种集群模式详解

2、redis复制原理

redis 的复制分为两部分操作 同步(SYNC)和 命令传播(command propagate)

  • 同步(SYNC)用来将从服务器的状态 更新到 和主服务器 一致。白话文解释就是从服务器主动获取 主服务器的数据。保持数据一致。具体实现是,主服务器收到SYNC命令后,生成RDB快照文件,然后发送给从服务器。
  • 命令传播 (command propagate)用于在主服务器数据被修改后,主从不一致,为了让从服务器保持和主服务器状态一致,而做的命令传播。白话文解释就是主服务器收到客户端修改数据命令后,数据库数据发生变化,同时将命令缓存起来,然后将缓存命令发送到从服务器,从服务器通过载入缓存命令来达到主从数据一致。这就是所谓的命令传播。
  • 为什么需要有同步和命令传播的两种复制操作: 当只有同步操作时候,那么在从服务器向主服务器发送SYNC命令时候,主服务器在生成RDB快照文件时候,仍然会收到客户端的命令修改数据状态,这部分数据如果不能传达给从服务器,那么就会出现主从数据不一致的现象。这时候就出现了命令传播,主服务器收到从服务器的SYNC命令后,生成RDB快照文件同时,将此段时间内收到的命令缓存起来,然后使用命令传播的操作发送从服务器。来达到主从数据一致。

3、redis主从复制原理

上面介绍了redis复制的两种操作,而redis得主从复制正式基于 同步 和 命令传播 来实现得。下面两张图展示了redis复制的流程:

Redis三种集群模式详解

Redis三种集群模式详解

4、redis主从复制优缺点

优点:

1、实现读写分离,提高了可用性,解决了单机故障2、主从复制期间master和slave都是非阻塞方式,仍然可用。

缺点:

1、master宕机期间,需要手动切换主机,同时会有部分数据不能及时同步从服务器,造成数据不一致(需要人工手动介入)

2、slave宕机后,多个slave恢复后,大量的SYNC同步会造成master IO压力倍增(可以手动规避启动时间)

3、在线扩容较复杂。

总结:
redis主从复制的优点主要是提高了可用性缺点

二、Sentinel 哨兵模式

Sentinel 哨兵Sentinel 哨兵介绍
Sentinel 哨兵本质上是一个运行在特殊模式下的Redis实例,只是初始化的过程和工作与普通的Redis不同,本质上也是一个单独的进程。
Sentinel 哨兵 是Redis的高可用解决方案:一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在主服务器下线时可以自动切换从服务器升级为主服务器。

1、Sentinel系统

下图是一个简单的Sentinel系统架构图,一个Sentinel系统监视一个主从集群,其中server1是Redis主服务器,server2/3/4是Redis 从服务器。主从之间利用上面的主从复制来达到主从一致。而Sentinel系统监视整个主从集群。

Redis三种集群模式详解

2、Sentinel故障转移

当Sentinel系统察觉到Server1主服务器下线时,就会终止server2/3/4的复制。

Redis三种集群模式详解

同时Sentinel将server2升级为主服务器,server3/4从新的主服务器进行复制。同时等待server1的再次上线。

Redis三种集群模式详解

Sentinel系统也可以主动降级主服务为从服务器,将从服务器升级为主服务器。

Redis三种集群模式详解

2.1、Sentinel 哨兵监控过程

Sentinel 哨兵监控集群过程:

  • 命令 Sentinel哨兵通过发送命令,让redis服务器返回运行状态。发布订阅 当主服务器状态发生变化时,Sentinel哨兵通过
  • 发布订阅模式通知其他从服务器。

2.2、Sentinel 哨兵故障转移

Sentinel 故障转移:

  • 1、Sentinel系统中的Sentinel实例每隔1s就像集群发送PING命令
  • 2、如果集群中有实例的回复Sentinel实例时间超过了 down-after-milliseconds,那么这个实例就会发送PING命令的Sentinel实例被主观下线
  • 3、那么什么时候会客观下线呢?需要Sentinel系统中其他实例也确认集群中该实例主管下线。
  • 如果master主服务器被标记为主观下线,则Sentinel系统中监视master的Sentinel进程需要以每秒一次的频率确认Master是否进入主管下线状态
  • 4、当有足够的Sentinel实例(取决于配置)确认Master进入了主管下线,则Master会被标记为客观下线。

Redis三种集群模式详解

3、Sentinel 哨兵优缺点

优点:

1、哨兵模式基于主从复制,因此主从复制的优点哨兵都具备2、哨兵具备了主从切换和故障转移,因此集群有了更高的可用性

缺点:

1、Redis较难支持在线扩容,在线扩容比较复杂。

总结:
sentinel 哨兵主要用来监控redis主从集群,提高了redis 主从集群的可用性。

三、cluster 模式

redis cluster

1、reids cluster

Redis Cluster是一种服务器 Sharding 技术,redis 3.0版本开始正式提供。
Sentinel基本已经实现了高可用,但是每台机器都存储相同内容,很浪费内存,所以Redis Cluster实现了分布式存储。每台机器节点上存储不同的内容。

Redis三种集群模式详解

2、Redis Cluster 数据分片原理

redis 数据分片使用的是hash slot, redis集群有16384个哈希槽,每个Key通过CRC16校验后对16384取模来决定放置哪一个槽。
当存取redis key时候,redis会根据CRC16算法得到一个结果,然后把结果和16384求余,通过这个值去对应得节点获取数据。
这个时候,应用客户端实际上只需要连接其中任意一个节点即可,然后Redis Cluster 中每个节点都保存了其他节点得槽信息。这样当存取key计算完槽之后,通过保存槽信息从配置中获取节点信息,然后再去对应得节点获取数据。

3、Redis Cluster 复制原理

redis-cluster集群引入了主从复制模型,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了。如果主节点 A 和它的从节点 A1 都宕机了,那么该集群就无法再提供服务了

4、redis Cluster 优缺点

优点:

1、实现了分布式存储,节省了内存

到此这篇关于Redis三种集群模式介绍的文章就介绍到这了,更多相关Redis三种集群模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
解决redis sentinel 频繁主备切换的问题
Apr 12 Redis
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
使用Redis实现秒杀功能的简单方法
May 08 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
SpringBoot 集成Redis 过程
Jun 02 Redis
比较几种Redis集群方案
Jun 21 Redis
嵌入式Redis服务器在Spring Boot测试中的使用教程
Jul 21 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 Redis
windows安装 redis 6.2.6最新步骤详解
Apr 26 Redis
Redis keys命令的具体使用
Jun 05 Redis
Redis批量生成数据的实现
Jun 05 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 Redis
浅谈Redis的keys命令到底有多慢
基于Redis结合SpringBoot的秒杀案例详解
Jedis操作Redis实现模拟验证码发送功能
Sep 25 #Redis
为什么RedisCluster设计成16384个槽
使用redis生成唯一编号及原理示例详解
Sep 15 #Redis
Redis读写分离搭建的完整步骤
Sep 14 #Redis
在项目中使用redis做缓存的一些思路
You might like
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python os模块介绍
2014/11/30 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
python求质数的3种方法
2018/09/28 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
Linux的文件类型
2016/07/05 面试题
汉语专业应届生求职信
2013/10/01 职场文书
料理师求职信
2014/01/30 职场文书
补充协议书范本
2014/04/23 职场文书
政府信息公开实施方案
2014/05/09 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
建党伟业观后感
2015/06/01 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
python实现股票历史数据可视化分析案例
2021/06/10 Python
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
Python实现双向链表
2022/05/25 Python