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. laravel 依赖注入

    <?php interface Animal{ public function attack(); public function talk(); } class People implemen ...

  2. tensorflow API _ 1 (control_flow_ops.cond)

    该函数用来控制程序执行流,相当于if-else了import tensorflow as tffrom tensorflow.python.ops import control_flow_ops a ...

  3. JDK、JRE、JVM之间的关系及JDK安装

    JRE (Java Runtime Environment) :是Java程序的运行时环境,包含 JVM 和运行时所需要的 核心类库 .JDK (Java Development Kit):是Java ...

  4. python链接oracle数据库以及数据库的增删改查实例

    初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...

  5. mysqldump 原理(转载)

    mysqldump 备份过程可以描述为: (1) 先发出一条 flush tables 关闭实例上所有打开的表(2) 创建一个全局锁,FLUSH TABLES WITH READ LOCK获得 db ...

  6. 【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info

    网上查到http://social.msdn.microsoft.com/Forums/vstudio/en-US/58271e39-beca-49ac-90f9-e116fa3dd3c0/mxed- ...

  7. php+ ueditor word粘贴上传

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

  8. 了解区块链&比特币

    https://www.bilibili.com/video/av45247943 假如有ABCD四个比特币交易者,其中A交易给B者10个比特币(BTC),而这条信息要广播给其他所有的交易者知道. 假 ...

  9. 使用Django实现发邮件功能

    django实现发送邮件功能   django实现邮件发送功能 1)首先注册一个邮箱,这里以163邮箱为例 2)注册之后登录,进行如下修改 找到设置,设置一个授权码,授权码的目的仅仅是让你有权限发邮件 ...

  10. sys 模块常用方法

    sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules.keys() 返回所有已经导入的模块列表 sys.exc_info() 获取当前正在处理的异常类,exc_typ ...