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的主从复制部署
源码包下载
链接:https://pan.baidu.com/s/1yEMChN6Cm3Hh1-lAVVpQ-A
提取码:ttun
4.1 环境描述
redis-server 说明 redis-sentinel说明
这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。
IP | 主机名 |
---|---|
192.168.200.70:8000 | redis-master |
192.168.200.105:8000 | redis-slaveA |
192.168.200.106:8000 | redis-slaveB |
部署环境
cat /etc/redhat-release
uname -r
关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
4.2 redis-server端的部署
三台服务器上都进行如下编译安装
yum -y install gcc gcc-c++ make automake autoconf
ls
tar xf redis-4.0.11.tar.gz -C /usr/src/
cd /usr/src/redis-4.0.11/
make MALLOC=jemalloc
make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf
cp redis.conf /usr/local/redis/conf/
cp sentinel.conf /usr/local/redis/conf/
ln -s /usr/local/redis/bin/* /usr/local/bin/
4.3 redis.conf配置文件修改
三台服务器都备份和简化配置文件
cd /usr/local/redis/
cp conf/redis.conf{,.bak}
egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf
redis-master配置文件修改
vim conf/redis.conf
cat -n conf/redis.conf | sed -n '1p;3p;7p;9p;11p'
port 8000
daemonize yes
bind 0.0.0.0
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
redis-slave配置文件修改
vim conf/redis.conf
cat -n conf/redis.conf | sed -n '1p;3p;7p;9p;11p;59p'
port 8000
daemonize yes
bind 0.0.0.0
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
slaveof 192.168.200.70 8000 #比redis主多这行
4.4 redis-server的启动
先启动redis-master再启动两个从
redis-server /usr/local/redis/conf/redis.conf
查看redis-slave的日志,同步是否成功
tail /var/log/redis/redis-8000.log
在master主机上通过命令查看主从复制情况
redis-cli -p 8000 info replication
4.5 进行redis同步测试
redis-master上执行
redis-cli -p 8000 set aaa 111
redis-slave上执行
redis-cli -p 8000 get aaa
redis-cli -p 8000 get aaa
五,redis的高可用部署(redis-sentinel)
(1)三台都修改sentinel.conf配置文件
修改配置文件以下行
cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'
21 port 26379
69 sentinel monitor mymaster 127.0.0.1 6379 2
98 sentinel down-after-milliseconds mymaster 30000
106 sentinel parallel-syncs mymaster 1
131 sentinel failover-timeout mymaster 180000
修改成如下内容
vim /usr/local/redis/conf/sentinel.conf
cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'
21 port 6800
69 sentinel monitor master8000 192.168.200.70 8000 2
98 sentinel down-after-milliseconds master8000 5000
106 sentinel parallel-syncs master8000 1
131 sentinel failover-timeout master8000 15000
再在sentinel.conf的最后追加以下四句话
vim /usr/local/redis/conf/sentinel.conf
tail -4 /usr/local/redis/conf/sentinel.conf
daemonize yes #守护进程模式
logfile "/var/log/sentinel.log"
pidfile "/var/run/sentinel.pid"
protected-mode no #关闭保护模式,不关闭是修改不了只读状态
配置文件说明
sentinel monitor master8000 192.168.200.70 8000 2
master8000:监控的主节点名字(随便写)
192.168.200.70 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秒)
表示故障转移的超时时间
把master的sentinel配置文件scp到另外两台从上
scp /usr/local/redis/conf/sentinel.conf 192.168.200.105:/usr/local/redis/conf/
scp /usr/local/redis/conf/sentinel.conf 192.168.200.106:/usr/local/redis/conf/
(2)启动redis-sentinel
三台都启动
redis-sentinel /usr/local/redis/conf/sentinel.conf &
启动以后,查看sentinel信息
redis-cli -p 6800 info sentinel
# Sentinel
sentinel_masters:1 #1个master
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master8000,status=ok,address=192.168.200.70:8000,slaves=2,sentinels=3
#2从3sentinel
(3)进行redis-master的宕机测试
我们宕掉redis-master的redis-server服务,然后查看sentinel日志
停掉redis-master
redis-cli -p 8000 shutdown
查看redis-sentinel日志
cat /var/log/sentinel.log
redis-cli -p 8000 info replication
查看sentinel信息
redis-cli -p 6800 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master8000,status=ok,address=192.168.200.106:8000,slaves=2,sentinels=3
#已经切换到192.168.200.106为主了
启动redis-master
redis-server /usr/local/redis/conf/redis.conf
然后再停掉192.168.200.106服务器的redis-server
redis-cli -p 8000 shutdown
查看sentinel信息
redis-cli -p 6800 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master8000,status=ok,address=192.168.200.105:8000,slaves=2,sentinels=3
#redis-master恢复为192.168.200.105了
恢复宕机的服务器
redis-server /usr/local/redis/conf/redis.conf
并在主上查看sentinel信息(恢复只需要重新启动服务即可)
redis-cli -p 8000 info replication
六,redis-sentinel的VIP漂移
假如在redis上,我们也建立一个VIP机制,一旦redis-master宕机,那么本来在master上的VIP就会飘逸到新的master上。
如此一来开发在连接redis的时候,即便redis-master发生切换,那么开发也不需要修改代码了。
这里我们可以使用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里增加一句话
vim /usr/local/redis/conf/sentinel.conf
sed -n '170,175p' /usr/local/redis/conf/sentinel.conf
sentinel client-reconfig-script master8000 /usr/local/redis/notify_master6800.sh
# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script master8000 /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
cat /usr/local/redis/notify_master6800.sh
#!/bin/bash
MASTER_IP=$6 #第六个参数就是sentinel传入进行来的新master的IP
LOCAL_IP="192.168.200.70" #脚本所在服务器的本地IP(每个服务器都不同)
VIP="192.168.200.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
三台都给脚本加x权限
cd /usr/local/redis/
chmod +x notify_master6800.sh
ll -d notify_master6800.sh
重新启动所有的redis-sentinel进程
pkill redis-sentinel
redis-sentinel /usr/local/redis/conf/sentinel.conf
第一次时手动给master添加VIP
ip addr add 192.168.200.244/24 dev ens32
ip a
让ip地址即刻生效
arping -q -c 3 -A 192.168.200.244 -I ens32
接下来我们进行ip漂移测试
查看VIP所在服务器
ip addr show ens32
查看redis-master所属服务器
redis-cli -p 6800 info sentinel
redis-cli -p 8000 info replication
停止70服务器的redis-server服务
redis-cli -p 8000 shutdown
查看redis-master的所属服务器
redis-cli -p 6800 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master8000,status=ok,address=192.168.200.105:8000,slaves=2,sentinels=3
#mater被切换到了105
在105服务器上查看VIP情况
ip addr show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:03:ee:e5 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.140/24 brd 192.168.200.255 scope global dynamic ens32
valid_lft 1416sec preferred_lft 1416sec
inet 192.168.200.244/24 scope global secondary ens32 #VIP飘逸到了140上
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe03:eee5/64 scope link
valid_lft forever preferred_lft forever
在105服务器主从复制情况
redis-cli -p 8000 info replication
# Replication
role:master #105是主
connected_slaves:1
slave0:ip=192.168.200.106,port=8000,state=online,offset=7897768,lag=0 #106是从
master_replid:3be1d64af444e02aabc486f83a07f0b66c2671d1
master_replid2:9d70bc1f8d6c0fd720b6f35dc9a8a900593d6577
master_repl_offset:7897914
second_repl_offset:7857768
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:6849339
repl_backlog_histlen:1048576
至此redis-sentinel的VIP漂移测试成功。redis-sentinel可以持续高可用的哦。