Redis Sentinel 模拟故障迁移

什么是redis sentinel

参考文档:https://redis.io/topics/sentinel 

简单的来说,就是Redis Sentinel 为redis 提供高可用性,主要体现在下面几个方面:
1.监控:redis sentinel会不间断的监控主服务器和从服务器是否正常工作
2.通知:当出现问题时,sentinel可以通过API通知系统管理员以及另外的服务器
3.自动故障转移:如果主服务器出现故障,sentinel可以启动故障转移,将其中一台从服务器升级为主服务器,其他的从服务器会重新配置为新主服务器 4.提供配置:sentinel充当客户端发现权限来源,客户端连接到sentinel询问负责给定服务器当前redis主服务器地址,如果发生故障,sentinel将报告新地址

redis sentinel 模拟环境

模拟环境为:1主2从

 ========redis=================sentinel==========

master:127.0.0.1 6379       127.0.0.1 26379
slave1:127.0.0.1 6380       127.0.0.1 26380
slave2:127.0.0.1 6381       127.0.0.1 26381

环境搭建

redis.conf配置

6379

# cat redis-6379.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/root/redis/redis-6379.log"
dbfilename dump-6379.rdb
dir /root/redis
...
#

6380

# cat redis-6380.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/root/redis/redis-6380.log"
dbfilename dump-6380.rdb
dir /root/redis
...
#

6381

# cat redis-6381.conf | grep -Ev "^$|^#"
bind 127.0.0.1
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
logfile "/root/redis/redis-6381.log"
dbfilename dump-6381.rdb
dir /root/redis
...
#

sentinel.conf配置

6379/6380/6381

# cat sentinel-*.conf | grep -Ev "^#|^$"
port 26379
daemonize yes
logfile "/root/redis/sentinel-6379.log"
dir "/tmp"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
#

启动redis server 和 sentinel

redis:
# redis-server /etc/redis_6379.conf
# redis-server /etc/redis_6380.conf
# redis-server /etc/redis_6381.confsentinel:
# redis-sentinel /etc/sentinel-6379.conf
# redis-sentinel /etc/sentinel-6380.conf
# redis-sentinel /etc/sentinel-6381.conf

配置主从复制

# redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> exit# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK 
127.0.0.1:6381> exit

模拟故障迁移 

首先,kill 掉redis master进程 

# for n in `ps aux | grep redis-server | grep 6379 | awk '{print $2}'`;do kill -9 $n  ;done;

分析log

首先,redis 从服务器首先发现redis master 服务器无法连接,报错如下:
# tail -F redis-63*.log
==> redis-6380.log <==
2851:S 13 Nov 14:48:54.235 # Connection with master lost.
2851:S 13 Nov 14:48:54.235 * Caching the disconnected master state.==> redis-6381.log <==
3695:S 13 Nov 14:48:54.466 * Connecting to MASTER 127.0.0.1:6379
3695:S 13 Nov 14:48:54.466 * MASTER <-> SLAVE sync started
3695:S 13 Nov 14:48:54.467 # Error condition on socket for SYNC: Connection refused==> redis-6380.log <==
2851:S 13 Nov 14:48:54.781 * Connecting to MASTER 127.0.0.1:6379
2851:S 13 Nov 14:48:54.782 * MASTER <-> SLAVE sync started
2851:S 13 Nov 14:48:54.782 # Error condition on socket for SYNC: Connection refused
...
紧接着,redis sentinel 完成故障切换,从log来看,当6379主节点挂了之后,redis重新提了一个从节点6380为主节点,log 如下: 
# tail -F sentinel-63*.log
==> sentinel-6379.log <==
3225:X 13 Nov 14:49:24.322 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.327 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.332 # +sdown master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.386 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
3235:X 13 Nov 14:49:24.386 # +new-epoch 1
3235:X 13 Nov 14:49:24.386 # +try-failover master mymaster 127.0.0.1 6379==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.388 # +odown master mymaster 127.0.0.1 6379 #quorum 3/2
3230:X 13 Nov 14:49:24.388 # +new-epoch 1
3230:X 13 Nov 14:49:24.388 # +try-failover master mymaster 127.0.0.1 6379==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.409 # +vote-for-leader 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.416 # +vote-for-leader 858e250193e7f985bd7d63569a158f52a9cb9e0c 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.416 # 858e250193e7f985bd7d63569a158f52a9cb9e0c voted for 858e250193e7f985bd7d63569a158f52a9cb9e0c 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.417 # 06f94705a99df53e468af594737913ce7c6287d5 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6379.log <==
3225:X 13 Nov 14:49:24.422 # +new-epoch 1
3225:X 13 Nov 14:49:24.432 # +vote-for-leader 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.432 # d0e6638165ba8f8186562da586f4e0789dd4abd1 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6380.log <==
3230:X 13 Nov 14:49:24.432 # d0e6638165ba8f8186562da586f4e0789dd4abd1 voted for 06f94705a99df53e468af594737913ce7c6287d5 1==> sentinel-6381.log <==
3235:X 13 Nov 14:49:24.468 # +elected-leader master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.468 # +failover-state-select-slave master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.545 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.545 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:24.608 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.295 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.295 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.345 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379==> sentinel-6379.log <==
3225:X 13 Nov 14:49:25.345 # +config-update-from sentinel 06f94705a99df53e468af594737913ce7c6287d5 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
3225:X 13 Nov 14:49:25.345 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3225:X 13 Nov 14:49:25.345 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3225:X 13 Nov 14:49:25.345 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6380.log <==
3230:X 13 Nov 14:49:25.346 # +config-update-from sentinel 06f94705a99df53e468af594737913ce7c6287d5 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
3230:X 13 Nov 14:49:25.346 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3230:X 13 Nov 14:49:25.346 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3230:X 13 Nov 14:49:25.346 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6381.log <==
3235:X 13 Nov 14:49:25.561 # -odown master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:25.814 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.893 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.954 # +failover-end master mymaster 127.0.0.1 6379
3235:X 13 Nov 14:49:26.954 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
3235:X 13 Nov 14:49:26.955 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
3235:X 13 Nov 14:49:26.955 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6379.log <==
3225:X 13 Nov 14:49:55.349 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6380.log <==
3230:X 13 Nov 14:49:55.397 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380==> sentinel-6381.log <==
3235:X 13 Nov 14:49:57.014 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
再返回过来看redis server的log,此时可以看到6381为从节点已经向主节点6380请求并且完成了复制操作
==> redis-6380.log <==
2851:M 13 Nov 14:49:25.823 * Slave 127.0.0.1:6381 asks for synchronization
2851:M 13 Nov 14:49:25.823 * Partial resynchronization request from 127.0.0.1:6381 accepted. Sending 422 bytes of backlog starting from offset 124407.==> redis-6381.log <==
3695:S 13 Nov 14:49:25.823 * Successful partial resynchronization with master.
3695:S 13 Nov 14:49:25.823 # Master replication ID changed to 0288d040464ebccbb56dc56d54455434a406bcb2
3695:S 13 Nov 14:49:25.823 * MASTER <-> SLAVE sync: Master accepted a Partial Resynchronization.

当我们再启动6379服务器时,sentinel会让6379成为从库并且连接6380服务器,log如下: 

启动6379服务器
# redis-server /root/redis/redis-6379.conf# tail -F sentinel-63*.log
...
==> sentinel-6379.log <==
3225:X 13 Nov 16:05:00.384 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
...# tail -F redis-63*.log
...
==> redis-6379.log <==
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: receiving 194 bytes from master
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Flushing old data
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Loading DB in memory
7493:S 13 Nov 16:05:00.566 * MASTER <-> SLAVE sync: Finished with success==> redis-6381.log <==
3695:S 13 Nov 16:05:36.467 * 1 changes in 900 seconds. Saving...
3695:S 13 Nov 16:05:36.468 * Background saving started by pid 7519
7519:C 13 Nov 16:05:36.486 * DB saved on disk
7519:C 13 Nov 16:05:36.487 * RDB: 8 MB of memory used by copy-on-write
3695:S 13 Nov 16:05:36.569 * Background saving terminated with success
...

未完待续。。。

 

转载于:https://www.cnblogs.com/wang-li/p/9955303.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

erp生产管理系统流程_企业生产管理好帮手——ERP智能管理系统

ERP企业管理软件是为企业决策层及员工提供决策运行手段的管理平台。在生产制造制造业中&#xff0c;尽管加工早已用于机械自动化&#xff0c;但在仓库管理、人工管理工作&#xff0c;还必须erp公司智能管理系统协助管理方法。erp公司管理软件是公司供应链管理的综合性管理软件&…

神经网络的基本工作原理

神经网络的基本工作原理 一、总结 一句话总结&#xff1a;先给一个初始值&#xff0c;然后依赖正确值&#xff08;真实值&#xff09;进行修复模型&#xff08;训练模型&#xff09;&#xff0c;直到模型和真实值的误差可接受 初始值 真实值 修复模型 1、神经网络由基本的神经元…

jsonrpc aria2_抛弃迅雷,Aria2 新手入门

迅雷已经用了 10 年&#xff0c;一直把它看作是速度最快也最方便的下载工具。迅雷会员也是我必续的服务。但&#xff0c;迅雷堕落了。thunder: 迅雷专属链接越来越少&#xff0c;基本都是磁力、BT 的天下迅雷会员加速不再给力&#xff0c;大量资源速度为 0。会员虽然还有一年多…

pytorch 测试每一类_2D-UNet脑胶质瘤分割BraTs + Pytorch实现

2D-UNet讲解玖零猴&#xff1a;U-Net与FCN的区别医学表现网络详解创新​zhuanlan.zhihu.comBraTs数据准备数据来源本文用的训练集和验证集均来自BraTs2018的训练集(其中HGG:210个病人,LGG:75个病人)但由于BraTs只公开训练集数据,没有测试集数据,如果在训练集中再拆一部分用来作…

电商必备6款商品详情数据采集,一键批量下载淘猫拼和1688宝贝信息和链接!

当我们分析竞品以及选款复制时&#xff0c;往往需要先将商品信息采集下载下来&#xff0c;然而一个个去寻找商品并手动下载&#xff0c;显然是不现实的。 特别是做无货源店群的卖家&#xff0c;可能需要在不同平台采集商品信息&#xff0c;那么就需要用到适用不同平台的商品采…

vue.js的项目实战

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云社区专栏 需求背景 组件库是做UI和前端日常需求中经常用到的&#xff0c;把一个按钮&#xff0c;导航&#xff0c;列表之类的元素封装起来&#xff0c;方便日常使用&#xff0c;调用方…

c++ 输出二进制_Python入门3print格式化输出的几种方法

接《Python入门2》print格式化输出的几种方法⒂格式化输出举例【例】str_name"小明"num_age15print("我叫%s&#xff0c;今年%d岁"%(str_name,num_age))#注意print的前后两部分用%间隔&#xff0c;不是逗号&#xff0c;后面的输出列表加小括号【例】str&qu…

485串口测试工具软件下载_串口调试助手详细讲解(结合实操),通讯问题不再是问题...

经常会有学员问我&#xff0c;老师老师&#xff0c;我的plc和变频器通讯不上了&#xff0c;不知道什么原因&#xff0c;您能帮我看看么。其实吧&#xff0c;这个一般远程是帮不上你什么的&#xff0c;还是要你自己去测试&#xff0c;找出问题&#xff0c;那么怎么测试呢&#x…

pycharm快捷键_春节快结束了回单位途中总结下pycharm快捷键

一、编辑(Editing)CtrlSpace 基本的代码完成(类、方法、属性)CtrlAltSpace 快速导入任意类 CtrlShiftEnter 语句完成CtrlP 参数信息(在方法中调用参数)CtrlQ 快速查看文档F1 Web帮助文档主页ShiftF1 选中对象的Web帮助文档Ctrl悬浮/单机鼠标左键 简介/进入代码定义CtrlZ 撤销上…

挣值管理名词(EV、AC、PV等)与公式详解

概念 PV PLaned&#xff0c;计划&#xff0c;Value&#xff0c;数值&#xff0c;计划值&#xff0c;是指项目实施过程中某阶段计划要求完成的工作量所需的预算工时&#xff08;或费用&#xff09;。 是反应计划&#xff0c;不是反映应消耗的工时或费用。 PVBCWS计划工作量*…

c++ 三次多项式拟合_线性回归进阶版,多项式线性回归讲解与实现(附完整代码)...

每天给小编五分钟&#xff0c;小编用自己的代码&#xff0c;带你轻松学习深度学习&#xff01;本文将会带你做完一个深度学习进阶版的线性回归---多项式线性回归&#xff0c;带你进一步掌握线性回归这一深度学习经典模型&#xff0c;然后在此基础上&#xff0c;小编将在下篇文章…

mysql查看表占用空间大小

select TABLE_NAME,DATA_LENGTHINDEX_LENGTH,TABLE_ROWS from INFORMATION_SCHEMA.tables where TABLE_SCHEMAnbly_twjr DATA_LENGTHINDEX_LENGTH 的值除以1024&#xff0c;再除以1024&#xff0c;折算成MB

mfc文字闪烁如何解决_男同胞福音!如何解决尿尿时最尴尬的难题?建议偷偷收藏(文字版)...

上面这个现象呢&#xff0c;是男生上厕所时的一种微妙状态。两个男生往往会由于尴尬而不愿意站在相邻的坑位上厕所。我将其命名为男厕所的泡利不相容定律。一、男厕尴尬定律简介先给大家科普一下男厕所的构造&#xff0c;小便区是一排立式坑位。好的厕所有隔板&#xff0c;阻挡…

docker-compose 运行 Flask 应用最佳实践

背景 以前部署应用&#xff0c;需要各种环境配置&#xff0c;各种shell操作才能搭建一套可用的服务。现在有了Docker之后&#xff0c;部署方式变了更加容易&#xff0c;不容易出现配置错误&#xff0c;环境不一致问题。解决了在本地环境可以运行&#xff0c;迁移到线上出现各种…

dbeaver导出表结构和数据_mall数据库表结构概览

mall是一套电商系统&#xff0c;后台系统主要包括商品管理、订单管理、营销管理(运营管理促销管理)、内容管理、用户管理等模块&#xff0c;本文主要对这些模块的数据库表结构及功能做大概的介绍。商品管理数据库表结构功能结构订单管理数据库表结构功能结构营销管理数据库表结…

arima模型 p q d 确定_自回归移动平均模型(ARMA)

自回归模型&#xff08;AR&#xff09;&#xff1a;①描述当前值和历史值之间的关系&#xff0c;用变量自身的历史时间数据对自身进行预测。②自回归模型必须满足平稳性的要求。③移动平均模型&#xff08;MA&#xff09;关注的是自回归模型中的误差项的累加。移动平均法能有效…

Mysql闪回工具之binlog2sql的原理及其使用

生产上误删数据、误改数据的现象也是时常发生的现象&#xff0c;作为运维这时候就需要出来补锅了&#xff0c;最开始的做法是恢复备份&#xff0c;然后从中找到需要的数据再进行修复&#xff0c;但是这个时间太长了&#xff0c;对于大表少数数据的修复来讲&#xff0c;动作太大…

禅道11.0windows本机安装

为了验证禅道的某个功能&#xff0c;需要用到生产上的数据&#xff0c;又不能在生产上进行。只能在本地搭建一套禅道&#xff0c;还原生产的数据到本地。 1.下载禅道 生产上用的是禅道11.0&#xff0c;数据库是11.0版本的数据库&#xff0c;为了更好兼容&#xff0c;下载禅道…

createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...

本节使用inRange函数来实现阈值化。跟前面的阈值化方法一样&#xff0c;只不过在实现时用阈值范围来替代固定阈值。本节还提供了一种物体检测的手段&#xff0c;用基于像素值范围的方法&#xff0c;在HSV色彩空间检测物体。HSV色彩空间HSV&#xff08;hue&#xff0c;saturatio…