redis-Sentinel持续高可用
2024-10-06 17:43:53
自动故障转移机制
- redis目前只支持主从复制备份(不支持主主复制),当主redis挂了,从redis只能提供读服务,无法提供写服务。所以,还得想办法,当主redis挂了,让从redis升级成为主redis。
- 这就需要自动故障转移,redis sentinel带有这个功能,当一个主redis不能提供服务时,redis sentinel可以将一个从redis升级为主redis,并对其他从redis进行配置,让他们使用新的主redis进行复制备份。
- Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。它的主要功能有以下几点
- 实时地监控redis是否按照预期良好地运行;
- 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
- 能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其他的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
sentinel 互相监控架构 redis一主两从架构
redis的主从复制部署
这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为7000,修改默认端口是安全的第一步。
redis-server | 说明 | redis-sentinel |
192.168.50.168: 8000 | redis-master | 192.168.50.168:7000 |
192.168.50.166: 8000 | redis-slave1 | 192.168.50.166:7000 |
192.168.50.169 :8000 | redis-slave2 | 192.168.50.168:7000 |
redis.conf配置文件修改
#redis-master 配置文件:
port 8000 #设置端口号
daemonize yes #是否后台运行
bind 0.0.0.0 #允许访问IP
pidfile /var/run/redis-.pid #PID文件存放位置
logfile /var/log/redis/redis-.log #log日志存放位置
#redis-slave 配置文件:
port
daemonize yes
bind 0.0.0.0
pidfile /var/run/redis-.pid
logfile /var/log/redis/redis-.log
slaveof 192.168.200.132 #比redis主多这行 指定主masterIP及端口
masterauth #验证master端的redis密码
启动三台redis
redis-server /usr/local/redis/conf/redis.conf
redis的高可用部署(redis-sentinel)
修改sentinel.conf配置文件 三个服务端配置文件一样,启服务后每个配置文件都有变动,会生成唯一的内容
vim /usr/local/redis/conf/sentinel.conf
port 7000 #sentinel端口
sentinel monitor master7000 192.168.50.168
sentinel down-after-milliseconds master7000
sentinel parallel-syncs master7000
sentinel failover-timeout master7000
配置文件说明
- sentinel monitor master8000 192.168.200.132 8000 2
- master8000:监控的主节点名字(随便写)
- 192.168.200.132 8000 :主节点的IP和端口
- 2:一共有两台Sentinel发现有问题就会发生故障转移
- sentinel down-after-milliseconds master8000 5000(5秒)
- 当master8000节点宕机后多久进行检查
- sentinel parallel-syncs master8000 1
- 设定sentinel并发还是串行,1代表每次只能复制一个,可以减轻master压力
- sentinel failover-timeout master8000 15000(15秒)
- 表示故障转移的超时时间
启动redis-sentinel
#三台都启动
redis-sentinel /usr/local/redis/conf/sentinel.conf &
#启动以后,查看sentinel信息
redis-cli -p info sentinel #sentinel的端口号启动
# Sentinel
sentinel_masters: #1个master
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=master7000,status=ok,address=192.168.50.168:,slaves=,sentinels=
#master ip 端口 2个slaves 3个sentinel
redis-sentinel的VIP漂移
我们可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递6个参数<master-name>,<role>,<state>,<from-ip>,<from-port>,<to-ip>,<to-port>
,其中`<to-ip>
是新主redis的IP地址,可以在这个脚本里做VIP漂移操作.
#在sentinel.conf里增加一句话
[root@localhost ~]# sed -n '170,175p' /usr/local/redis/conf/sentinel.conf
# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script master7000 /usr/local/redis/notify_master6800.sh
#指定漂移脚本的位置
# When the master changed because of a failover a script can be called in #写一个漂移脚本
vim /usr/local/redis/notify_master6800.sh
#!/bin/bash
MASTER_IP=$6 #第六个参数就是sentinel传入进行来的新master的IP
LOCAL_IP="192.168.50.168" #本地IP
VIP="192.168.50.244" ` #VIP
NETMASK="" #子网掩码
INTERFACE="eth0" #网卡名
if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
/usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/usr/sbin/arping -q -c -A ${VIP} -I ${INTERFACE}
exit
else
/usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit
fi
exit 1
#给脚本加x权限
chmod +x /usr/local/redis/notify_master6800.sh
#重新启动所有的redis-sentinel进程
pkill redis-sentinel
redis-sentinel /usr/local/redis/conf/sentinel.conf
#第一次时手动给master添加VIP
ip addr add 192.168.50.244/ dev eth0
#让ip地址即刻生效
arping -q -c -A 192.168.50.244 -I eth0
最新文章
- IOS网络第七天WebView-01WebView和网页的交互1
- 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
- Dev统计选中行、如需其他数据源可留言
- 常用软件:Bugzilla的搭建(转)
- SAP查询事务、表属于哪个模块
- for_each使用方法详解[转]
- ci总结
- [MySql] 设置了UTF8,中文存数据库中仍然出现问号
- 在英文 sql2005中 比较nvarchar 与 varchar的速度
- spring+mybatis 多数据源整合
- python google play
- 韩玉琪 《Linux内核分析》MOOC课程
- js 计算两个日期之间的周数
- nyoj 破门锁(水题)
- Swift 路由机制设计
- rabbitMQ之AMQP协议
- AI adanet
- Android Studio 常用快捷键和使用技巧
- 如何取得dbgrid中未保存(post)的值(50分)
- stm32+lwip(五):以太网帧发送测试