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如何一键部署脚本
Apr 12 Redis
redis实现共同好友的思路详解
May 26 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
Redis可视化客户端小结
Jun 10 Redis
redis实现的四种常见限流策略
Jun 18 Redis
解析Redis Cluster原理
Jun 21 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis 限流器
May 15 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
浅谈Redis的keys命令到底有多慢
基于Redis结合SpringBoot的秒杀案例详解
Jedis操作Redis实现模拟验证码发送功能
Sep 25 #Redis
为什么RedisCluster设计成16384个槽
使用redis生成唯一编号及原理示例详解
Sep 15 #Redis
Redis读写分离搭建的完整步骤
Sep 14 #Redis
在项目中使用redis做缓存的一些思路
You might like
php 获取远程网页内容的函数
2009/09/08 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python连接MySQL数据库实例分析
2015/05/12 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
python实现串口自动触发工作的示例
2019/07/02 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
django 简单实现登录验证给你
2019/11/06 Python
python学生管理系统的实现
2020/04/05 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
北京大学自荐信范文
2014/01/28 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
2014年少先队工作总结
2014/12/03 职场文书
检讨书怎么写
2015/01/23 职场文书
小学音乐课教学反思
2016/02/18 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers