1、什么是哨兵模式?
反客为主的自动版,能够自动监控master是否发生故障,如果故障了会根据投票数从slave中挑选一个作为master,其他的slave会自动转向同步新的master,实现故障自动转义。

2、原理
sentinel会按照指定的频率给master发送ping请求,看看master是否还活着,若master在指定时间内未正常响应sentinel发送的ping请求,sentinel则认为master挂掉了,但是这种情况存在误判的可能,比如:可能master并没有挂,只是sentinel和master之间的网络不通导致,导致ping失败。

为了避免误判,通常会启动多个sentinel,一般是奇数个,比如3个,那么可以指定当有多个sentinel都觉得master挂掉了,此时才断定master真的挂掉了,通常这个值设置为sentinel的一半,比如sentinel的数量是3个,那么这个量就可以设置为2个。

当多个sentinel经过判定,断定master确实挂掉了,接下来sentinel会进行故障转移:会从slave中投票选出一个服务器,将其升级为新的主服务器, 并让失效主服务器的其他从服务器slaveof指向新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

3、怎么玩?
1)需求:配置1主2从3个哨兵

下面我们来实现1主2从3个sentinel的配置,当从的挂掉之后,要求最少有2个sentinel认为主的挂掉
了,才进行故障转移。
为了方便,我们在一台机器上进行模拟,我的机器ip是:192.168.200.129,通过端口来区分6个不同的节点(1个master、2个slave、3个sentinel),节点配置信息如下

 2)创建案例工作目录:sentinel
执行下面命令创建 /opt/sentinel 目录,本次所有操作,均在 sentinel 目录进行。

# 方便演示,停止所有的redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
mkdir  /opt/sentinel
cd  /opt/sentinel/

3)将redis.conf复制到sentinel目录
redis.conf 是redis默认配置文件

cp /opt/redis-6.2.1/redis.conf /opt/sentinel/

4)创建master的配置文件:redis-6379.conf
在/opt/sentinel目录创建 redis-6379.conf 文件,内容如下,注意 192.168.200.129 是这个测试机器
的ip,大家需要替换为自己的

include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/

port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile "./6379.log"

5)创建slave1的配置文件:redis-6380.conf
在/opt/sentinel目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,只是将6379换成
6380了

include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/

port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile "./6380.log"

6)创建slave2的配置文件:redis-6381.conf
在/opt/sentinel目录创建 redis-6381.conf 文件,内容如下

include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/

port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile "./6381.log"

7)启动master、slave1、slave2

redis-server /opt/sentinel/redis-6379.conf
redis-server /opt/sentinel/redis-6380.conf
redis-server /opt/sentinel/redis-6381.conf

8)配置slave1为master的从库
(1)执行下面命令,连接slave1

redis-cli -h 192.168.200.129 -p 6380

(2)执行下面命令,指定slave1的作为master的从机

slaveof 192.168.200.129 6379

(3)如下,使用 info replication 查看下slave1的主从信息

 11)配置slave2为master的从库
(1)执行下面命令,连接slave2

redis-cli -h 192.168.200.129 -p 6381

(2)执行下面命令,指定slave2的作为master的从机

slaveof 192.168.200.129 6379

(3)如下,使用 info replication 查看下slave2的主从信息

 12)验证主从复制是否正常
运行下面命令,连接master

redis-cli -h 192.168.200.129 -p 6379

运行下面命令,查看master主从信息

info replication

在master中执行下面命令,写入数据

flushdb
set name jack

如下,查看slave1中name的值

192.168.200.129:6380> get name
"jack"

如下,查看slave2中name的值

192.168.200.129:6381> get name
"jack"

数据一致,说明同步正常。
13)创建sentinel1的配置文件:sentinel-26379.conf
在/opt/sentinel目录创建 sentinel-26379.conf 文件,内容如下

# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile  "./sentinel-26379.log"
# pid文件
pidfile  /var/run/sentinel_26379.pid
# 是否后台运行
daemonize yes
# 端口
port  26379
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel  monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping不通master,则主观认为master不可用
sentinel  down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456

 14)创建sentinel2的配置文件:sentinel-26380.conf
在/opt/sentinel目录创建 sentinel-26380.conf 文件,内容如下

# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26380.log"
# pid文件
pidfile /var/run/sentinel_26380.pid
# 是否后台运行
daemonize yes
# 端口
port 26380
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456

15)创建sentinel3的配置文件:sentinel-26381.conf
在/opt/sentinel目录创建 sentinel-26381.conf 文件,内容如下

# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26380.log"
# pid文件
pidfile /var/run/sentinel_26380.pid
# 是否后台运行
daemonize yes
# 端口
port 26381
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456

16)启动3个sentinel
启动sentinel有2种方式

方式1:redis-server sentinel.conf --sentinel
方式2:redis-sentinel sentinel.conf

下面我们使用方式2来启动3个sentinel

/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26379.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26380.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26381.conf

17)分别查看3个sentinel的信息
分别对3个sentinel执行下面命令,查看每个sentinel的信息

redis-cli -p sentinel的端口
info sentinel

sentinel1 的信息如下,其他2个sentinel的信息这里就不列了,大家自己去看一下

18)验证故障自动转移是否成功
step1:在master中执行下面命令,停止master

192.168.200.129:6379> shutdown

step2:等待2分钟,等待完成故障转移
sentinel中我们配置 down-after-milliseconds 的值是60秒,表示判断主机下线时间是60秒,所以我们等2分钟,让系统先自动完成故障转移。
step3:查看slave1的主从信息,如下
使用 info replication 命令查看主从信息

 step4:查看slave2的主从信息,如下
slave2变成master了,且slave2变成slave1的从库了,完成了故障转移。

step5:下面验证下slave1和slave2是否同步

在slave2中执行下面命令

192.168.200.129:6381> set address china
OK

在slave1中执行下面命令,查询一下address的值,效果如下,说明slave2和slave1同步正常

192.168.200.129:6380> get address

"china"

 19)恢复旧的master自动俯首称臣
当旧的master恢复之后,会自动挂在新的master下面,咱们来验证下是不是这样的。
step1:执行下面命令,启动旧的master

redis-server /opt/sentinel/redis-6379.conf

step2:执行下面命令,连接旧的master

redis-cli -h 192.168.200.129 -p 6379

step3:执行下面命令,查看其主从信息

info replication

效果如下,确实和期望的一致。

经典面试题 之 哨兵(Sentinel)模式相关推荐

  1. Redis模式对比:主从模式 VS 哨兵sentinel模式 VS Redis cluster模式

    推荐观看: 十年架构师实战Redis-用Redis实现:秒杀/抢购/排行榜/推荐系统/抽奖系统!从Redis到分布式架构,通过Redis学AKF划分原则.CAP定理!​www.bilibili.com ...

  2. jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

    在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我 ...

  3. Redis面试题-Redis哨兵模式

    本文参考 嗨客网 Redis面试题 Redis哨兵模式 什么是Redis哨兵模式 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress ...

  4. Redis经典面试题

    本文分享一些Redis相关的经典面试题,看下你是不是都掌握了. 文章目录 Redis Redis redis优化策略 redis除了做缓存还能做什么? 说说redis持久化方式?分别优缺点是什么?re ...

  5. java 1.8有没有jshell_收藏了800道Java后端经典面试题,分享给大家,希望你找到自己理想的Offer呀~...

    前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...

  6. 收藏了800道Java后端经典面试题,共享给大家

    在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,共享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github, 希 ...

  7. 各大厂800道Java后端经典面试题合集

    前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,可以私信我, 希望大家都能找到自 ...

  8. 收藏了800道Java后端经典面试题,分享给大家,希望你找到自己理想的Offer呀~

    在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github, 希 ...

  9. 后台服务器经典面试题

    后台服务器经典面试题 1, 使用Linux epoll模型,水平触发模式(Level-Triggered):当socket可写时,会不停的触发socket可写的事件,如何处理? 2, 从socket读 ...

最新文章

  1. Android selector 使用注意.
  2. linux服务器打包命令,linux 打包命令tar(主要用于服务器之间迁移资源文件)
  3. ORACLE数据库系统结构
  4. 谷歌首款Tensor手机芯片,全是AI炫技,性能一笔带过
  5. BZOJ3048: [Usaco2013 Jan]Cow Lineup
  6. 鸟哥的Linux私房菜(服务器)- 架站文件習題解答篇
  7. wxWidgets利用透明图片自定义工具条
  8. javascript 正则表达式提取数字使用
  9. d3.js 教程 模仿echarts折线图
  10. JavaScript 图片切割效果(带拖放、缩放效果)
  11. string 方法 java_String 的几个 方法。 (java)
  12. 英伟达用GAN生成脑瘤图像,训练出的AI医生,准确率提高16%
  13. 两列float引起的父容器高度失效的解决办法
  14. Easy RealMedia Producer使用向导
  15. devc ++的安装教程(C语言学习比较好用的一个开发软件)
  16. linux校园网自动登录命令,东北大学校园网登录登出shell脚本
  17. uniapp 获取屏幕高度并赋值
  18. 22nm 与 28nm 工艺的比较
  19. Linux:详细的RPM和YUM/DNF管理工具,配置仓库等
  20. jenkins使用时遇到“using GIT_ASKPASS to set credentials”

热门文章

  1. Rabbitmq在工作中的应用
  2. BeeWare无法连接https下载依赖包
  3. centos for arm64
  4. 网易互联网 笔试 8.20
  5. webaudio_WebAudio Deep Note,第1部分:简介
  6. CentOS 5.4 配置本地YUM源
  7. 企业局域网内部IP地址冲突
  8. halcon 图片文件夹重命名
  9. JBuilder2006下载及破解
  10. python 排序算法:插入排序