这篇文章主要介绍“redis哨兵机制Sentinel的原理和应用”,在日常操作中,相信很多人在Redis哨兵机制Sentinel的原理和应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis哨兵机制Sentinel的原理和应用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都网站建设、网站建设服务团队是一支充满着热情的团队,执着、敏锐、追求更好,是创新互联的标准与要求,同时竭诚为客户提供服务是我们的理念。成都创新互联公司把每个网站当做一个产品来开发,精雕细琢,追求一名工匠心中的细致,我们更用心!
哨兵机制
什么是哨兵机制
在主从复制的模式下,主服务器宕机后,从服务器是不能自动转为主服务器的,只能手动进行故障转移
而哨兵机制(Sentinel)就是Redis的高可用解决方案,由一个或多个Sentinel实例组成的Sentinel系统用来管理主服务器以及连接的所有从服务器。可以实现故障发现、故障自动转移、配置中心和客户端通知
监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常
提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
看了上图,我们可以理解哨兵机制就是在复制基础上的一套监管系统,能及时的进行故障转移。那么就先了解下,Redis是如何故障判定和故障转移的
故障判定
故障判定,也就是Sentinel在做的任务,当一个Sentinel启动后会定期的去执行以下的任务
每个Sentinel进程会以每秒一次的频率向已知的主服务器、从服务器以及其他的Sentinel实例发送一个
PING
命令每个实例(instance)距离最后一次有效回复
PING
命令的时间超过down-after-milliseconds
选项所指定的值,那么该实例会被标记为主观下线。一个有效回复可以是:+PONG
、-LOADING
或者-MASTERDOWN
如果一个
Master
主服务器被标记为主观下线,那么监视该主服务器的所有的Sentinel会以每秒一次的频率确认主服务器的确是进入主线下线状态如果有足够数量的Sentinel(至少达到配置文件指定的数量)在指定时间范围内确认一个
Master
主服务器为主观下线状态,那么该主服务器被标记为客观下线一般情况下,每个Sentinel会每10秒一次的频率向已知的主服务器和从服务器发送
INFO
命令,当一个主服务器被标记为客观下线时,发送INFO
命令的频率会改为每秒一次没有足够数量的Sentinel同意主服务器下线,主服务器的客观下线状态会被移除;当主服务器重新向Sentinel的
PING
命令返回有效回复,主服务器的主观下线状态就会被移除
主观下线(Subjectively Down,SDOWN)指单个Sentinel实例对服务器做出下线判断
客观下线(Objectively Down,ODOWN)指多个Sentinel实例对服务器做出SDOWN判断, 并且通过 SENTINEL
is-master-down-by-addr
命令互相交流之后,,得出的服务器下线判断
搭建哨兵实例
准备
我这里是准备了3个虚拟机,1主2从的Redis服务器和3个哨兵实例。官网上是推荐至少部署3个Sentinel实例保证健壮性,具体的地址端口如下
服务 | ip | port |
---|---|---|
Redis(master) | 192.168.249.20 | 6379 |
Redis | 192.168.249.21 | 6379 |
Redis | 192.168.249.22 | 6379 |
Sentinel | 192.168.249.20 | 26379 |
Sentinel | 192.168.249.21 | 26379 |
Sentinel | 192.168.249.22 | 26379 |
1主2从的Redis服务的配置如下,修改一下redis.conf
文件
# 设置为后台运行 daemonize yes # 绑定的主机地址,这里注释掉,开放ip连接 #bind 127.0.0.1 # 主服务上可以设置密码 requirepass 123456
在从服务器上添加主服务器的地址信息
# 设置主服务器的地址 # replicaofreplicaof 192.168.249.20 6379 # 设置主服务器的密码 # masterauth masterauth 123456
3个哨兵的配置都是一样的,可以从Redis的安装目录拷贝一份sentinel.conf
,修改内容如下,主要是配置下主服务器的地址
# 设置为后台运行 daemonize yes logfile "26379.log" # 设置主服务器的地址,quorum为2表示当有2个或以上的哨兵认为主服务器不可用时,才进行故障转移操作 # sentinel monitorsentinel monitor mymaster 192.168.249.20 6379 2 # 设置服务器密码 # sentinel auth-pass sentinel auth-pass mymaster 123456 # 指定了 Sentinel 认为服务器已经断线所需的毫秒数 # sentinel down-after-milliseconds sentinel down-after-milliseconds mymaster 30000 # 指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小,完成故障转移所需的时间就越长。但是如果这个数字越大,就意味着越多的slave因为replication而不可用。 # 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态 # sentinel parallel-syncs sentinel parallel-syncs mymaster 1 # 指定故障转移超时时间 # sentinel failover-timeout sentinel failover-timeout mymaster 180000
Sentinel可用通过Redis实例的发布/订阅功能自动发现同样在监控主服务器的其他Sentinel,以及可以通过主服务器获取其他从服务器的信息,所以我们只需配置主服务器的地址即可
启动
启动顺序分别是:主服务器,从服务器,然后是3个哨兵进程
启动Redis服务
./redis-server ../redis.conf
Sentinel其实也是一个Redis服务,可以看做一个特殊模式的Redis服务,启动的命令有两种
./redis-server ../sentinel.conf --sentinel ./redis-sentinel ../sentinel.conf
这两种方式启动哨兵的效果都是一样的,在启动运行时必须要使用配置文件,因为系统需要这个文件来保存当前状态,以便重启时加载
查看主机状态
我们可以用客户端连接哨兵,使用sentinel master
查看其监视的主服务器的状态
$ ./redis-cli -h 192.168.249.20 -p 26379 192.168.249.20:26379> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.249.20" 5) "port" 6) "6379" 7) "runid" 8) "2a58b746fe9c963e69887efbc877aa3143eb6ec6" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "167" 19) "last-ping-reply" 20) "167" 21) "down-after-milliseconds" 22) "30000" 23) "info-refresh" 24) "2941" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "2006632" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "2" 35) "quorum" 36) "2" 37) "failover-timeout" 38) "180000" 39) "parallel-syncs" 40) "1"
我们看到关于主服务器的一些监控信息
num-slaves
为从服务器的数量;num-other-sentinels
其他哨兵的数量;flags
标记为master,当主机掉线了,会变为s_down或o_down
另外,想查看其他从服务器和其他哨兵的状态,可以用以下的命令
sentinel slavessentinel sentinels
故障转移
我们可以手动模拟一下,当主服务器挂了,故障故障转移情况。
想要获取当前主服务器的地址信息,客户端可以使用sentinel get-master-addr-by-name
命令
192.168.249.20:26379> sentinel get-master-addr-by-name mymaster 1) "192.168.249.20" 2) "6379"
可以看到当前的主服务地址为192.168.249.20
,这时我们手动关闭该服务,或者使用以下命令让服务器睡眠40秒
$ ./redis-cli -h 192.168.249.20 -p 6379 192.168.249.20:6379> auth 123456 OK 192.168.249.20:6379> debug sleep 40 OK (40.01s)
这个时候我们再次查看主服务的地址时,应该是可以看到不同信息
192.168.249.20:26379> sentinel get-master-addr-by-name mymaster 1) "192.168.249.22" 2) "6379"
到此,关于“Redis哨兵机制Sentinel的原理和应用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
当前文章:Redis哨兵机制Sentinel的原理和应用
网页网址:http://lswzjz.com/article/pchcec.html