搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Gausst松鼠会
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Java并发之AQS详解_aqs waitstatus 0
2
zzulioj1039答案C语言,ZZULIOJ 1000~1009(C语言入门题)
3
用命令启动控制面板 _linux命令打开控制面板
4
uniapp实现将页面转换成pdf(小程序、app、h5)_微信小程序页面转pdf
5
如何使用人工智能提高Office办公效率?_如何使用人工智能提高office办公效率以及其在office中的应用是否会威胁到人类
6
python项目报告怎么写_python项目
7
【爬虫入门】利用flask框架和echarts实现数据可视化_flask+echarts
8
Redis详解(redis线程模式、数据持久化机制、主从复制、缓存穿透、缓存击穿等)_redis的复制,持久化,分布式锁,队列支持
9
GMSSL sm3代码接口_c++ sm3 gmssl
10
预编译语句PreparedStatement映射中NULL POINT EXCEPTION空指针异常_preparedstatement.setlong 报空指针
当前位置:
article
> 正文
数据库面试题:Redis三种集群方式(主从,哨兵,Redis-Cluster)_redis集群三种方式面试题
作者:Gausst松鼠会 | 2024-02-28 16:29:38
赞
踩
redis集群三种方式面试题
Redis三种集群方式
Redis有三种集群方式:主从复制,哨兵模式和Redis-Cluster集群。
一. 主从复制
1.1 概述
主从复制其实就是分为主数据库和从数据库,实现读写分离
读操作只读从数据库,
写操作写主数据库,再实现主从同步
1.2 主从复制原理
流程如下:
Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC同步命令。
Master服务主节点收到同步命令开始执行BGSAVE命令生成RDB文件。同时使用缓冲区记录此后执行的所有写命令。
主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
(从服务器初始化完成)
主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
(从服务器初始化完成后的操作)
1.3 主从复制的优缺点
优点:
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
缺点:
Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
二.哨兵模式
2.1 概述
哨兵模式是基于主从模式实现的,也就是说同样可以实现主从分离,同样集群分为master和slave节点
在哨兵模式中,会存在多个哨兵进程,这些哨兵进程的功能如下:
(1)监控主服务器和从服务器是否正常运行。
(2)主服务器出现故障时自动将从服务器转换为主服务器。
2.2 哨兵模式原理
每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为
主观下线
(SDOWN)
如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态
当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为
客观下线
(ODOWN)
此时就会进行哨兵选举,选出一个领头的哨兵对主从数据库发起故障的修复(就是选一个从数据库作为新的Master)
在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
命令解释:
INFO命令可以让哨兵获取到当前数据库的信息,比如运行id,复制信息等等,从而实现新节点的自动发现,从数据库的信息正是从info命令中获取的,获取从数据库信息后,就会和从数据库建立两条链接,和主数据库建立的链接是完全一样的,之后就会每10s向主从数据库发送info命令,当有新的从数据库加入时,就会从info命令中发现了,从而将这个新的slave加入自己的监控列表中。当然如果有新的哨兵加入到了监控中,其他哨兵也是从这个info命令中获取的。
Ping命令其实就是监控节点是否正常运行
哨兵选举过程:
1.第一个发现该master挂了的哨兵,向每个哨兵发送命令,让对方选举自己成为领头哨兵
2.其他哨兵如果没有选举过他人,就会将这一票投给第一个发现该master挂了的哨兵
3.第一个发现该master挂了的哨兵如果发现由超过一半哨兵投给自己,并且其数量也超过了设定的quoram参数,那么该哨兵就成了领头哨兵
4.如果多个哨兵同时参与这个选举,那么就会重复该过程,知道选出一个领头哨兵
选出领头哨兵后,就开始了故障修复,会从选出一个从数据库作为新的master
Master选举过程:
1.从所有在线的从数据库中,选择优先级最高的从数据库
2.如果有多个优先级高的从数据库,那么就会判断其偏移量,选择偏移量最小的从数据库,这里的偏移量就是增量复制的
3.如果还是有相同条件的从数据库,就会选择运行id较小的从数据库升级为master
2.3哨兵模式的优缺点
优点:
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。
缺点:
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
三.Redis-Cluster集群
3.1 概述
Redis-Cluster集群实现的是数据的分布式存储,就是将数据存储在不同的节点上。所以Redis-Cluster集群实现的是一种去中心化的控制。
Redis-Cluster集群中同样实现的主从模式,但是从节点在正常状态下只会从主节点拉取备份数据,并不会参加数据的存取实现。一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
3.2 实现原理
集群中的任意节点都是存储了其他所有节点信息的,他们任意节点之间都是可以通信的。
在redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,可以理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
简单点说就是每一个key通过一定的算法(类似哈希)去定位到这个key应该存储的节点上,然后在这个节点上进行存取。
节点失效处理:
所有节点之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点
如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入fail状态。这就是我们的redis的投票机制。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/160158
推荐阅读
article
Termux 使用_
termux
redis
...
1 初始化配置1.1 更换镜像源sed -i 's@^\(deb.*stable main\)$@#\1\ndeb ht...
赞
踩
article
Redis
工具类 与
Redis
布隆
过滤器
...
Redis
基础操作工具 、
Redis
序列化、
Redis
布隆
过滤器
3.
布隆
过滤器
4.
Redis
工具类5. 查询R...
赞
踩
article
fastadmin
引用
redis
方法2...
页面上引用 use \think\cache\driver\Redis;
fastadmin
引用
redis
方法2 ...
赞
踩
article
云
数据库
Redis
性能
深度评测(
阿里
云
、
华为
云
、
腾讯
云
、百度智能
云
)...
阿里
云
:整体
性能
排名第一,其中模型1中9/16个场景,模型3小Key读相关场景
性能
表现明显优于其它所有竞品百度智能
云
:全...
赞
踩
article
spring
boot
架构图_基于
spring
boot
+
redis
+ elasticsear...
spring
boot
容器启动流程:其中最重要的:运行机制为:
spring
boot
事件驱动:详情见:
spring
boot
事...
赞
踩
article
7.18 web层面安全
sql
,xss,加密,
express
对比原生
http
,
express
-ses...
1、
sql
注入解决方案:node端使用 my
sql
.escape()过滤即可// 未过滤写法(单引号包裹)// user...
赞
踩
article
为什么
redis
单线程
却能支撑高并发?_
多路复用
机制
单线程
反而
避免
了
多线程
的频繁
上下文
切换
问题
...
纯内存操作核心是基于非阻塞的 IO
多路复用
机制
单线程
反而
避免
了
多线程
的频繁
上下文
切换
问题
1)不需要各种锁的性能消耗Re...
赞
踩
article
SpringBoot整合
Redis
_
springboot
redis
...
Bean// 默认的
Redis
Template 没有过多的设置,
redis
对象都是需要序列化!// 两个泛型都是 O...
赞
踩
article
Redis
-
SpringBoot
整合_
redistemplate
.
getconnection
fact...
说明: 在
SpringBoot
2.x 之后,原来使用的jedis 被替换为了 lettucejedis : 采用的直连...
赞
踩
article
springboot 整合
redis
(
Redis
Connection
Redis
Connecti...
目录1.起步2.钻进去康一康2.1.
Redis
Connection
2.2.
Redis
Connection
Factory2...
赞
踩
article
Spring
Boot
整合
Redis
_springboot
redis
...
Redis
是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,并提供多种语言的AP...
赞
踩
article
Spring
Boot
的
Spring
Data
Redis
和
Redis
Template(String...
Spring
Boot
提供了 spring-boot-starter-data-
redis
使用
Spring
Data
...
赞
踩
article
springboot
使用
redis
_
springboot
redis
...
默认有三种方式连接
redis
.第一种:jedis—传统的项目–ssm第二种:lettuce:---->刚出现没有多久就被...
赞
踩
article
springboot
与
redis
_
springboot
redis
...
springboot
对
redis
的操作封装了两个StringRedisTemplate和RedisTemplate类,S...
赞
踩
article
【
Redis
】基本
操作
-
命令行
操作
...
通过这些简单而强大的命令,我们可以在
命令行
中轻松地进行基本的
Redis
操作
。在学习阶段一的基本
操作
后,你应该对如何使用R...
赞
踩
article
springboot
整合
redis
_
springboot
redis
...
创建
springboot
整合
redis
工程: 首先我们要知道什么是
redis
: 三个步骤:补充:RedisTemplat...
赞
踩
article
spring
-
boot
整合
Redis
超详细_
spring
boot
redis
encoding
...
spring
-
boot
整合
Redis
1、新建一个
spring
boot
的项目,我们选择官方脚手架工具进行创建,这里不用默认...
赞
踩
article
SpringBoot
篇——
SpringBoot
集成
Redis
,
详细教程
,
一篇搞定!
_
springbo...
一、首先我们需要了解为什么我们非得要自定义
redis
Template呢?源码中的模板对于数据序列化是这么处理的二、编写流...
赞
踩
article
Redis
--
原理篇
-
数据结构
(底层)...
基本结构扩容·收缩。
Redis
--
原理篇
-
数据结构
(底层) Re...
赞
踩
article
Redis
分布式
锁的正确
使用
姿势_
springboot
redis
...
前言日常开发中,秒杀下单、抢红包等等业务场景,都需要用到
分布式
锁。而
Redis
非常适合作为
分布式
锁
使用
。本文将分七个方案...
赞
踩
相关标签
mysql
linux
mariadb
termux
jdk
redis
数据库
缓存
bootstrap
云原生数据库
数据库开发
java
后端
spring boot
springboot
spring
redistemplate