自动故障转移机制

  • 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

最新文章

  1. IOS网络第七天WebView-01WebView和网页的交互1
  2. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
  3. Dev统计选中行、如需其他数据源可留言
  4. 常用软件:Bugzilla的搭建(转)
  5. SAP查询事务、表属于哪个模块
  6. for_each使用方法详解[转]
  7. ci总结
  8. [MySql] 设置了UTF8,中文存数据库中仍然出现问号
  9. 在英文 sql2005中 比较nvarchar 与 varchar的速度
  10. spring+mybatis 多数据源整合
  11. python google play
  12. 韩玉琪 《Linux内核分析》MOOC课程
  13. js 计算两个日期之间的周数
  14. nyoj 破门锁(水题)
  15. Swift 路由机制设计
  16. rabbitMQ之AMQP协议
  17. AI adanet
  18. Android Studio 常用快捷键和使用技巧
  19. 如何取得dbgrid中未保存(post)的值(50分)
  20. stm32+lwip(五):以太网帧发送测试

热门文章

  1. scp上传文件到远程服务器
  2. redis系列一: windows下安装redis
  3. Python3+Appium学习笔记01-环境配置(上)
  4. BZOJ 1982 / Luogu SP2021: [Spoj 2021]Moving Pebbles (找平衡状态)
  5. SSH登录卡顿解决方案
  6. python基于opencv实现人脸定位
  7. .net core 反编译一小段
  8. MFC 线程启动、暂停、继续、终止
  9. SuperSocket实例
  10. 漫谈计算机编码:从ASCII码到UTF-8