redis高可用之sentinel哨兵
一,单实例模式
当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行。
二,主从模式
由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份。当一台redis出现问题了,另一台redis可以继续提供服务。
三,自动故障转移机制
- 虽然上面redis做了备份,看上去很完美。但由于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的新地址。
四,redis的主从复制部署
4.1 环境描述
这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。
redis-server |
说明 |
redis-sentinel |
10.1.1.153:8000 |
redis-master |
10.1.1.153: 6800 |
10.1.1.154:8000 |
redis-slaveA |
10.1.1.154: 6800 |
10.1.1.155:8000 |
redis-slaveB |
10.1.1.155: 6800 |
部署环境,关闭防火墙和selinux
4.2 redis-server端的部署
三台服务器上都进行如下编译安装
[root@redis-master ~]# yum -y install gcc gcc-c++ make automake autoconf
[root@redis-master ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@redis-master ~]# cd /usr/src/redis-4.0.11/
[root@redis-master redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install
[root@redis-master redis-4.0.11]# mkdir -p /usr/local/redis/conf
[root@redis-master redis-4.0.11]# cp redis.conf /usr/local/redis/conf/
[root@redis-master redis-4.0.11]# cp sentinel.conf /usr/local/redis/conf/
[root@redis-master conf]# ln -s /usr/local/redis/bin/* /usr/local/bin/
4.3 redis.conf配置文件修改
redis-master配置文件修改:(修改前可备份配置文件)
[root@redis-master ~]# cd /usr/local/redis/conf/
[root@redis-master conf]# ls
redis.conf sentinel.conf
[root@redis-master conf]# cp redis.conf{,.bak}
修改一下配置文件内容:
- port 8000
- daemonize yes
- bind 0.0.0.0
- pidfile /var/run/redis-8000.pid
- logfile "/var/log/redis-8000.log"
redis-slave配置文件修改:
- port 8000
- daemonize yes
- bind 0.0.0.0
- pidfile /var/run/redis-8000.pid
- logfile "/var/log/redis-8000.log"
- slaveof 10.1.1.153 8000 #比redis主多这行
4.4 redis-server的启动
先启动redis-master再启动两个从(都放后台启动,为的是在前台能直接看到日志输出信息)
[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &
通过命令查看主从复制情况
[root@redis-master ~]# redis-cli -p 8000 info replication
五,redis的高可用部署(redis-sentinel)
(1)修改sentinel.conf配置文件
修改配置文件以下几行
修改成如下内容
[root@redis-master conf]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'
注意:现在这个sentinel.conf是可以scp的(没启动sentinel之前),但是当启动了sentinel后就不可以再scp了,启动了sentinel,它会在配置文件里加很多东西,它会往里面写许多数据,行号就和之前的行号不一样了,其中就会有sentinel的myid号,启动之后再复制,会导致所有sentinel的myid号都一样,它们之间都会认为是自己,就找不着对方了。
配置文件说明:
- sentinel monitor master8000 10.1.1.153 8000 2
- master8000:监控的主节点名字(随便写)
- 10.1.1.153 8000 :主节点的IP和端口
- 2:将这个主实例判断为失效至少需要2个 sentinel进程的同意,只要同意sentinel的数量不达标,自动failover就不会执行
- sentinel down-after-milliseconds master8000 5000(5秒)
- 当master8000节点宕机后多久进行检查
- sentinel parallel-syncs master8000 1
- 设定sentinel并发还是串行,1代表每次只能复制一个,可以减轻master压力
- sentinel failover-timeout master8000 15000(15秒)
- 表示故障转移的超时时间
再在sentinel.conf的最后追加以下四句话
- daemonize yes #守护进程模式
- logfile "/var/log/sentinel.log"
- pidfile "/var/run/sentinel.pid"
- protected-mode no
(2)启动redis-sentinel(先启动master)
[root@redis-master ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &(后台启动)
虽然用redis客户端连接sentinel 6800端口可以连接,但是往里面输入命令是没用的,sentinel是看info的
6800端口是sentinel之间互相访问的,sentinel的使用是主从突然发生切换,可以通过访问任何一台机器的sentinel,就会知道把谁切换成主了(没实现VIP漂移之前就是这么查看)
启动以后,查看sentinel信息
启动完sentinel之后,查看它的配置文件多了哪些东西
再启动redis-slaveA的sentinel
[root@redis-slaveA ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &
启动以后,查看sentinel信息
再启动redis-slaveB的sentinel
[root@redis-slaveB~]# redis-sentinel /usr/local/redis/conf/sentinel.conf &
启动以后,查看sentinel信息
(3)进行redis-master的宕机测试
我们宕掉redis-master的redis-server服务,然后查看sentinel信息
[root@redis-master conf]# redis-cli -p 8000 shutdown
查看redis-sentinel日志
[root@redis-master conf]# cat /var/log/sentinel.log
日志信息略,能看懂就行,看不懂百度翻译
再把主的服务启动,然后查看主的info信息
[root@redis-master conf]# redis-server /usr/local/redis/conf/redis.conf &
连续切换,试一下
[root@redis-slaveB conf]# redis-server /usr/local/redis/conf/redis.conf &
六,redis-sentinel的VIP漂移
假如在redis上,我们也建立一个VIP机制,一旦redis-master宕机,那么本来在master上的VIP就会漂移到新的master上。
如此一来开发在连接redis的时候,即便redis-master发生切换,那么开发也不需要修改代码了。
这里我们可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递7个参数<master-name>,<role>,<state>,<from-ip>,<from-port>,<to-ip>,<to-port>,其中<to-ip>是新主redis的IP地址,可以在这个脚本里做VIP漂移操作
在sentinel.conf里增加一句话
sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh 增加漂移脚本路径
写一个漂移脚本
[root@redis-master redis]# pwd
/usr/local/redis
[root@redis-master redis]# vim notify_master6800.sh
[root@redis-master redis]# cat notify_master6800.sh
#!/bin/bash
MASTER_IP=$6 #第六个参数就是sentinel传入进行来的新master的IP
LOCAL_IP="10.1.1.153" #脚本所在服务器的本地IP(每个服务器都不同)
VIP="10.1.1.244"
NETMASK="24"
INTERFACE="ens32"
if [[ "${MASTER_IP}" == "${LOCAL_IP}" ]];then
/usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1
改一下服务器的IP
给脚本加x权限
[root@redis-master redis]# chmod +x notify_master6800.sh
重新启动所有的redis-sentinel进程
[root@redis-master redis]# pkill redis-sentinel
[root@redis-master redis]# redis-sentinel /usr/local/redis/conf/sentinel.conf
第一次时手动给master添加VIP
[root@redis-master redis]# ip addr add 10.1.1.244/24 dev ens32
让ip地址即刻生效
[root@redis-master redis]# arping -q -c 3 -A 10.1.1.244 -I ens32
接下来进行ip漂移测试
查看VIP所在服务器
查看redis-master所属服务器
停止153服务器的redis-server服务
[root@redis-master ~]# redis-cli -p 8000 shutdown
查看redis-master的所属服务器
在154服务器上查看VIP及主从复制情况
再开启153的redis-server服务
[root@redis-master ~]# redis-server /usr/local/redis/conf/redis.conf &
查看主从复制情况
关掉154的服务,并查看154所属服务器
[root@redis-slaveA conf]# redis-cli -p 8000 shutdown
在主服务器153上查看VIP及主从复制情况
将154服务开启,再看主从复制情况
至此redis-sentinel的VIP漂移测试成功。redis-sentinel可以持续高可用,可以继续测试。
redis高可用之sentinel哨兵的更多相关文章
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...
- 三分钟带你入门 redis 高可用架构之哨兵
什么是哨兵? 哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时 ...
- Redis高可用解决方案:哨兵(Sentinel)
哨兵是Redis的高可用解决方案:由多个哨兵组成的系统监视主从服务器,可以将下线的主服务器属下的某个从服 务器升级为新的主服务器,继续保障运行. 启动并初始化Sentinel redis-sentin ...
- Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 1 背景 从第三篇 Redis系列3:高可用之主从架构 ,我们知道,为Re ...
- 深入理解Redis高可用方案-Sentinel
Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...
- Redis高可用集群-哨兵模式(Redis-Sentinel)
前言 Redis哨兵模式,用现在流行的话可以说就是一个“哨兵机器人”,给“哨兵机器人”进行相应的配置之后,这个"机器人"可以7*24小时工作,它能能够自动帮助你做一些事情,如监控 ...
- 基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_110 我们知道,Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3) ...
- 基于docker实现redis高可用集群
基于docker实现redis高可用集群 yls 2019-9-20 简介 基于docker和docker-compose 使用redis集群和sentinel集群,达到redis高可用,为缓存做铺垫 ...
- Redis高可用之哨兵模式Sentinel配置与启动(五)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
随机推荐
- 【JS新手教程】replace替换一个字符串中所有的某单词
JS中的replace方法可以替换一个字符串中的单词.语句的格式是: 需要改的字符串.replace(字符串或正则表达式,替换成的字符串) 如果第一个参数用字符串,默认是找到该字符串中的第一个匹配的字 ...
- 按键板的原理与实现----ADC
在嵌入式系统产品开发中,按键板的设计是最基本的,也是项目评估阶段必须要考虑的问题.其实现方式又很多种,具体使用那一种就需要结合特定IC的可用IO数量,并综合考虑成本,做出最终选择.本系列文章将介绍多种 ...
- 使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker
对于刚刚完成的Alipay支的Demo, 我想要把它部署到Docker中去, 下面我来演示相关步骤. 创建配置文件 配置文件的重中之重是Dockerfile, 他的内容如下: # 第一部分是编译并发布 ...
- 20191108-从零搭建基于Linux的RobotFramework框架
第一步:安装Centos7 64位操作系统 直接安装即可,不详述 第二步:yum下载wget yum update yum install wget 第三步:安装Python3 建议安装3.7,我在 ...
- 【HC89S003F4开发板】 6crc校验
HC89S003F4开发板crc校验 前言 第一次用有带crc的mcu 使用资料自带的demo @实现效果 通过PC向MCU发送5个8位数据,MCU返回CRC校验值 void main() { /** ...
- ALV报表——点击事件(二)
目录 一.ALV点击事件(双击) 一.ALV点击事件(双击) 代码: *Report ZRFI001_XFL_TEST REPORT ZRFI001_XFL_TEST . *定义ALV所需要用到的类型 ...
- error: snap "eclipse" has "install-snap" change in progress
在Ubuntu 18.04使用snap安装eclipse软件报时错: inuxidc@linuxidc:~$ snap install --classic eclipse error: snap &q ...
- idea下spring boot jpa写原生sql的时候,报Cannot resolve table错误
错误如图 打开View→Tool Windows→Persistence选项 在弹出的Persistence窗口的项目上右键,选择Generate Persistence Mapping→By Dat ...
- flutter从入门到精通一
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台 flutter是基于dart语言开发的,我们将首先通过几章节 ...
- DotNet 使用阿里云媒体转码服务
公司项目中一部分文件放到了阿里云 OSS 上,其中有些音频文件是 amr 类型的,在后期使用的时候比较麻烦,所以需要转换成 mp3 的文件,方便以后使用.本来想使用 ffmpeg 处理,但由于文件都存 ...