什么是Sentinel?
sentinel(哨兵)监控redis的运行情况,保证了redis的高可用性。主要功能包括两个:1)、监控主服务器和从服务器是否正常运行;2)、主服务器出现故障时,从服务器自动切换成主服务器。一个sentinel实例可以监控任意多个主服务器,以及主服务器下从服务器;同样,也可以使用多个sentinel来监控一个(多个redis服务器组成的)redis系统。此时,多个sentinel也会相互监控,整个监控系统会更加完善。
Sentinel的实现原理
1、判断redis服务器下线(故障)
哨兵启动后,会与redis主服务器、redis从服务器建立连接。哨兵会每隔1秒会向redis主服务器、redis从服务器和其他哨兵发送ping命令,通过ping命令返回的结果来判断对方是否在线。哨兵配置文件(sentinel.conf)中sentinel down-after-milliseconds <master-name> <milliseconds>指定了哨兵判断redis服务器进入主观下线的时间。如果redis服务器在milliseconds(单位是毫秒)内向哨兵返回无效回复,则哨兵认为该服务器进入主观下线状态,当哨兵将某个redis服务器(假设是redis主服务器)认定为主观下线时,哨兵会继续向其他监控该redis主服务器的哨兵发送命令,询问该主服务器是否真的下线,当哨兵从其他哨兵接收到足够数量的(redis主服务器)已下线判断后,哨兵就会将该redis主服务器判断为客观下线,并对主服务器执行故障转移。
2、故障转移
故障恢复需要由领头哨兵完成,选举领头哨兵是由raft算法完成(zookeeper的核心算法,想了解的可以百度下),选举出领头哨兵后,将会对redis主服务器进行故障转移。领头哨兵会从停止服务的redis主服务器的从服务器中选出一个来当新的主服务器,依据是优先级最高的从服务器。优先级设置在redis配置文件的replica-priority选项(参考【Redis的配置文件】 )。选出一个从服务器后,领头哨兵会向从服务器发送命令(slaveof no one)使其关闭复制功能并升级为主服务器,接着会向其他服务器发送命令(slaveof 新主服务器.ip 新主服务器.port)来使它们成为新主服务器的从服务器。最后,将停止服务的旧的主服务器设置为新主服务器的从服务器,这样,当旧的主服务器重新启动服务时,它将会以新主服务器的从服务器来进行运行。
Sentinel配置
1、在多个linux服务器上安装redis服务或者一台服务器安装不同端口的多个redis服务;
2、针对这多个redis服务进行主从复制配置;
3、配置sentinel.conf文件;
4、启动sentinel服务
在128上启动4个redis服务(一主三从)来记录下Sentinel需要怎么样配置,下面简单地写下步骤
第一步:打开一个窗口,记为窗口1,进入redis目录
[root@localhost ~]# ps -ef|grep redis
root 2078 2058 0 13:16 pts/0 00:00:00 grep redis
[root@localhost ~]# cd /opt/redis-5.0.4
[root@localhost redis-5.0.4]# ls
00-RELEASENOTES appendonly.aof BUGS CONTRIBUTING COPYING deps dump.rdb INSTALL Makefile MANIFESTO README.md redis.conf runtest runtest-cluster runtest-sentinel sentinel.conf src tests utils
第二步:配置主从复制
复制redis的配置redis.conf,命名为redis6380.conf,并且修改配置,配置主从复制
[root@localhost redis-5.0.4]# cp redis.conf redis6380.conf
[root@localhost redis-5.0.4]# vim redis6380.conf
此次需要修改的配置
port 6380 设置端口
pidfile /var/run/redis_6380.pid pid文件路径
replicaof 192.168.136.128 6379 配置主机ip端口,配置主从复制
masterauth password(redis没有设置密码,则不需要配置)
replica-priority 10 优先级
已经修改过的:
bind 0.0.0.0
daemonize yes 不影响当前会话,启动过程隐藏,守护进程
protected-mode no 关闭保护模式,其他服务器可访问
然后再复制redis6380.conf,命名为redis6381.conf、redis6382.conf;配置相应修改(上面配置中的6380分别改成6381、6382);replica-priority分别设置为20、30
[root@localhost redis-5.0.4]# cp redis6380.conf redis6381.conf
[root@localhost redis-5.0.4]# cp redis6380.conf redis6382.conf
[root@localhost redis-5.0.4]# vim redis6381.conf
[root@localhost redis-5.0.4]# vim redis6382.conf
[root@localhost redis-5.0.4]# ls
00-RELEASENOTES BUGS COPYING dump.rdb Makefile README.md redis6381.conf redis.conf runtest-cluster sentinel.conf tests
appendonly.aof CONTRIBUTING deps INSTALL MANIFESTO redis6380.conf redis6382.conf runtest runtest-sentinel src utils
第三步:修改哨兵的配置文件sentinel.conf
使用命令vim sentinel.conf 修改sentinel.conf文件,简单说明下需要注意的配置项:
port <sentinel-port>
哨兵端口,默认是26379,只启动单个sentinel,不需要修改,如果要运行多个sentinel,需要将这个端口号设置成唯一的,如:26380、26381等。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
master-name表示要监控的redis名字,可以任意取,规则:由大小写字母、数字、常用符号(如:下划线等)组成;
<ip> <redis-port>表示redis服务器的ip和端口号;
<quorum>表示最低通过票数,当redis主机发生故障时,从机选举成主机的最少哨兵的同意个数。
sentinel auth-pass <master-name> <password>
设置redis连接的安全校验密码,没有设置密码的情况下,不需要配置。
sentinel down-after-milliseconds <master-name> <milliseconds>
判断主机主观下线的时间,当sentinel不断向redis主机发送ping命令,在milliseconds(单位为毫秒,默认值为30000,即30S)时间内收不到回复,则认为主机主观下线。
sentinel parallel-syncs <master-name> <numreplicas>
当新的主机产生时,复制新主机的从机数量,建议设置为1。
sentinel failover-timeout <master-name> <milliseconds>
故障转移失败时间,即在故障