哨兵(sentinel)
概述
Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来 接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故 障迁移, 以及选择哪个从服务器作为新的主服务器。
注意
- 哨兵也是一台redis服务器,只是不提供数据服务
- 通常哨兵配置数量为单数(当服务器出现问题时,哨兵们会进行投票是否切换master,双数的哨兵单位,投票很可能打平)
作用
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance) 该系统执行以下三个任务:
- 监控(Monitoring): Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automaticfailover): 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
在从(slave)服务器宕机时
在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据。在Redis2.8版本后,主从断线后恢复的情况下实现增量复制。
在主(master)服务器宕机时
- 从所在从属服务器中挑选一台作为master使用,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务
- 第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来
搭建
配置文件详解
需要注意的是:在配置文件中,所有的<master-name>参数必须相同
# 指定哨兵服务器的端口号,注意:哨兵也是一台redis服务器
port 26379
# 指定是否以守护线程的方式启动
daemonize no
# 启用守护进程运行后,Redis将在/var/run/redis-sentinel.pid中写入一个pid文件
pidfile /var/run/redis-sentinel-26379.pid
# 指定日志文件的名称,推荐【sentinel+端口号】
logfile "sentinel-26379.txt"
# 指定相关数据文件存放的目录
dir ./data
# 哨兵节点定期监控
# 名字叫做 <master-name> 并且 IP 为 <ip> 端口号为 <port> 的主节点。<quorum> 表示的是哨兵判断主节点是否发生故障的票数。
# 也就是说如果我们将<quorum>设置为2就代表至少要有两个哨兵认为主节点故障了,才算这个主节点是客观下线的了,
# 一般是设置为sentinel节点数的一半加一。
# sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 每个哨兵节点会定期发送ping命令来判断Redis节点和其余的哨兵节点是否是可达的,如果超过了配置的<times>时间没有收到pong回复,
# 就主观判断节点是不可达的,<times>的单位为毫秒。
# sentinel down-after-milliseconds <master-name> <times>
sentinel down-after-milliseconds mymaster 30000
# 当哨兵节点都认为主节点故障时,哨兵投票选出的leader会进行故障转移,选出新的主节点,原来的从节点们会向新的主节点发起复制,
# 这个配置就是控制在故障转移之后,每次可以向新的主节点发起复制的节点的个数,最多为<nums>个,
# 因为如果不加控制会对主节点的网络和磁盘IO资源很大的开销。
# sentinel parallel-syncs <master-name> <nums>
sentinel parallel-syncs mymaster 1
# 这个代表哨兵进行故障转移时如果超过了配置的<times>时间就表示故障转移超时失败。
# sentinel failover-timeout <master-name> <times>
sentinel failover-timeout mymaster 180000
# 安全
# 避免脚本重置,默认值yes
# 默认情况下,SENTINEL SET将无法在运行时更改notification-script和client-reconfig-script。
# 这避免了一个简单的安全问题,客户端可以将脚本设置为任何内容并触发故障转移以便执行程序。
sentinel deny-scripts-reconfig yes
# 如果主节点设置了密码,则需要这个配置,否则哨兵无法对主节点进行监控。
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
启动哨兵
虽然sentinel(哨兵)也是redis服务器,但是启动方式和服务器的方式略有不同,是用redis-sentinel程序启动
sentinel的配置文件也是对应的
redis-sentinel sentinel.conf
sentinel程序和server都在安装目录的src下
多哨兵模式
多哨兵模式,配置不同端口的配置文件来开启多个哨兵客户端
案例
- 启动服务器,设置主从关系
2. 启动哨兵,这里我设置了三个哨兵 分别设置不同端口号
启动多个哨兵,监视master,并且从master那里得到所有的从属服务器的信息,加以监视,哨兵与哨兵之间也会互相联系
每当启动一个哨兵或者服务器,都会自动的重写(所有)哨兵的配置文件,同步修改
当从属服务器宕机时
这里我们在6380与6381两个从属服务器里面任选一个,将它关掉
当失联服务器重新连接时,哨兵们会得到通知,并且重新监视这个从属服务器
当主(master)服务器宕机时
这里我们模仿主服务器宕机,我们手动关闭当前主服务器,6379的服务器
我们在配置文件里设置了等待30秒哨兵启动自动转移
之前的6379主服务器重新运行,哨兵们会将它转变身份,变成slave,从属服务器,并且将它连接至新的master
原理
哨兵机制(sentinel)的高可用
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
如图所示
在Server1 掉线后:
升级Server2 为新的主服务器: