Sentinel是Redis官方提供的一种高可用方案(除了Sentinel,Redis Cluster是另一种方案),它可以自动监控Redis master/slave的运行状态,如果发现master无法访问了,就会启动failover把其中一台可以访问的slave切换为master。

(1).Sentinel(哨兵)的作用

  检测Master状态,如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 。当Master-Slave切换后,master-redis.conf、slave-redis.conf和sentinel.conf的内容都会发生改变,即master-redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

(2).Sentinel(哨兵)的工作原理

  支持Sentinel的Redis客户端(例如Java的Jedis)会在连接Redis服务器的时候向Sentinel询问master的ip,并且会在收到master切换的pub/sub事件后自动重新连接到新的master。

(3).实验环境

youxi1  192.168.1.6  Master,Sentinel1

youxi2  192.168.1.7  Slave,Sentinel2

youxi3  192.168.1.8  Slave,Sentinel3

(4).实验

 1)首先所有服务器都安装Redis,启动并设置开机自启

  详细查看:CentOS7下yum安装Redis

 2)修改Master服务器youxi1的配置文件

[root@youxi1 ~]# vim /etc/redis.conf
bind 0.0.0.0  //第69行,设置监听地址。0.0.0.0表示监听所有地址
protected-mode no  //第88行,关闭安全模式,允许外网访问

  如果防火墙是开启状态,记得添加端口号

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload
success
success

 3)修改Slave1服务器youxi2的配置文件

[root@youxi2 ~]# vim /etc/redis.conf
bind 0.0.0.0  //第69行,设置监听地址。0.0.0.0表示监听所有地址
protected-mode no  //第88行,关闭安全模式,允许外网访问
replicaof 192.168.1.6 6379  //第286行,设置master的IP地址和端口号

  如果防火墙是开启状态,记得添加端口号

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload
success
success

 4)修改Slave2服务器youxi3的配置文件

[root@youxi3 ~]# vim /etc/redis.conf
bind 0.0.0.0  //第69行,设置监听地址。0.0.0.0表示监听所有地址
protected-mode no  //第88行,关闭安全模式,允许外网访问
replicaof 192.168.1.6 6379  //第286行,设置master的IP地址和端口号

  如果防火墙是开启状态,记得添加端口号

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=6379/tcp && firewall-cmd --reload
success
success

 5)配置Sentinel(哨兵)

  三台主机都进行配置,或一台配好发送给另外两台

[root@youxi1 ~]# vim /etc/redis-sentinel.conf
protected-mode no  //第17行,取消安全模式,允许外网访问
port 26379  //第21行,检查一下端口号
daemonize yes  //第26行,改为yes,后台运行守护进程
sentinel monitor mymaster 192.168.1.6 6379 2  //第84行,mymaster是集群名称;192.168.1.6是主服务器IP地址;2是投票值,2台哨兵无法连接master,则认为master挂了,为避免脑裂请使用奇数
sentinel down-after-milliseconds mymaster 10000  //第113行
sentinel parallel-syncs mymaster 1  //第121行
sentinel failover-timeout mymaster 60000  //第146行,failover超时时间,单位毫秒

  说明:

    down-after-milliseconds:sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。

    parallel-syncs:在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。

  所有服务器都如此配置,然后重启redis,启动redis-sentinel并设置开机自启。

[root@youxi1 ~]# systemctl restart redis && systemctl start redis-sentinel
[root@youxi1 ~]# systemctl enable redis-sentinel
Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi2 ~]# systemctl restart redis && systemctl start redis-sentinel
[root@youxi2 ~]# systemctl enable redis-sentinel
Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service. [root@youxi3 ~]# systemctl restart redis && systemctl start redis-sentinel
[root@youxi3 ~]# systemctl enable redis-sentinel
Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /usr/lib/systemd/system/redis-sentinel.service.

  如果防火墙是开启状态,记得添加端口号

firewall-cmd --permanent --zone=public --add-port=26379/tcp && firewall-cmd --reload

 6)查看主从服务器的状态

  主服务器youxi1状态

[root@youxi1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master  //本服务器的角色
connected_slaves:2  //连接的从服务器数量
slave0:ip=192.168.1.7,port=6379,state=online,offset=546,lag=0  //从服务器状态
slave1:ip=192.168.1.8,port=6379,state=online,offset=546,lag=0
master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:546
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:546

  从服务器youxi2状态

[root@youxi2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave  //本服务器的角色
master_host:192.168.1.6  //主服务器的IP地址
master_port:6379  //主服务器的端口号
master_link_status:up  //主从连接状态
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:658
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:71
repl_backlog_histlen:588

  从服务器youxi3状态

[root@youxi3 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave  //本服务器的角色
master_host:192.168.1.6  //主服务器的IP地址
master_port:6379  //主服务器的端口号
master_link_status:up  //主从连接状态
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:686
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d3839b055eb0705dda0b2782d587e0d0f4a3177c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:686
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:281
repl_backlog_histlen:406

 7)模拟Master宕机,测试

  停掉youxi1的Redis

[root@youxi1 ~]# systemctl stop redis

  到youxi2上查看状态

[root@youxi2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.1.8  //可以看到Master服务器变成来192.168.1.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:86480
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e
master_replid2:b74fb4029bf6e6a4acb09748dfe63317192cc322
master_repl_offset:86480
second_repl_offset:49216
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:6589
repl_backlog_histlen:79892

  此时在打开youxi1的Redis,查看状态

[root@youxi1 ~]# systemctl start redis
[root@youxi1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave  //角色变成来slave
master_host:192.168.1.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:110509
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:24fe501f3d7f77e790bc82d9c80e6c920522137e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:110509
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:106486
repl_backlog_histlen:4024

 8)查看Sentinel状态

  查看Sentinel需要远程26379端口号,即访问Sentinel而不是Redis,例如使用现在的从服务器youxi1访问现在的主服务器youxi3

[root@youxi1 ~]# redis-cli -h 192.168.1.8 -p 26379
192.168.1.8:26379> 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=mymaster,status=ok,address=192.168.1.8:6379,slaves=2,sentinels=3

  注意:之后的使用就是连接Sentinel了。

(5).扩展:Redis主观下线和客观下线

  主观下线:Subjectively Down,简称SDOWN,指的是当前Sentinel实例对某个redis服务器做出的下线判断。

  客观下线:Objectively Down, 简称ODOWN,指的是多个Sentinel实例在对Master Server做出SDOWN判断,并且通过SENTINEL is-master-down-by-addr命令互相交流之后,得出的Master Server下线判断,然后开启failover。

参考:https://segmentfault.com/a/1190000002680804

CentOS7下使用Sentinel实现Redis集群高可用的更多相关文章

  1. Redis+Sentinel 实现redis集群高可用

    1.sentinel作用及实现原理: https://my.oschina.net/u/172871/blog/596976?p={{currentPage-1}}

  2. Redis系列九:redis集群高可用

    Redis集群的概念: RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当一个服务挂了可以快速的切换到另外一个服务,当遇到单机内存. ...

  3. (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...

  4. 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

    本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...

  5. 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

    本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...

  6. sentinel搭建redis集群经验总结

    一.protected-mode默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和se ...

  7. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  8. sentinel搭建redis集群的注意事项

    一.protected-mode 默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和s ...

  9. 集群高可用之lvs+keepalive

    集群高可用之lvs+keepalive keepalive简介: 负载均衡架构依赖于知名的IPVS内核模块,keepalive由一组检查器根据服务器的健康情况动态维护和管理服务器池.keepalive ...

随机推荐

  1. 结构型模式(五) 外观模式(Facade)

    一.动机(Motivate) 在软件系统开发的过程中,当组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战. ...

  2. Prometheus监控学习笔记

    K8S最佳实战(包括了K8S的Prometheus监控和EFK日志搜集) https://jimmysong.io/kubernetes-handbook/practice/ Prometheus-b ...

  3. Linux Vbox 桥接模式上网配置

    1.Bridged Adapter模式(桥接模式)特点: 1)如果主机可以上网,虚拟机可以上网 2)虚拟机之间可以ping通 3)虚拟机可以ping通主机 4)主机可以ping通虚拟机以上各点基于一个 ...

  4. (尚017)Vue插件

    1.如何开发插件? 2.编写自己的vue-myPlugin.js插件库,代码如下: /** * vue的插件库 * 最好使用匿名函数包裹起来,这样代码会更加规范 * 里面的实现被隐藏了 */(func ...

  5. asp.net+ueditor word粘贴上传

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  6. RookeyFrame 加载 自定义JS

    注意JS存放的位置:是在model文件夹下的某某文件夹!!! 线上添加的模块: 1.JS文件名:和表名一致 2.JS目录:Rookey.BusSys.Web\Scripts\model\TempMod ...

  7. 计数器的原理,设计及verilog实现

    若计数器由n个触发器组成,则计数器的位数为n,所能计数的最大模数为2的n次幂.以下为同步二进制加法计数器电路; 驱动方程:状态图 状态方程(此时的Q0,Q1为上一次状态值): 下例是同步4位2进制计数 ...

  8. 99: AGC-018C 堆+思维

    $des$有 $X + Y + Z$ 个人,第 $i$ 个人有 $A_i$ 个金币,$B_i$ 个银币,$C_i$ 个铜币.选出 $X$ 个人获得其金币,选出 $Y$ 个人获得其银币,选出 $Z$ 个 ...

  9. CODE FESTIVAL 2016 qual C题解

    传送门 \(A\) 什么玩意儿-- const int N=105; char s[N];int n,f1,f2; int main(){ scanf("%s",s+1),n=st ...

  10. Matlab画图的输出格式

    利用Matlab命令,可以输出.eps, .pdf格式的图形.有时候,在图形窗口直接保存会导致图形不完整,这时,可以用如下命令代替: saveas(p1, 't1.eps'); saveas(p1, ...