【redis-5】sentinel哨兵模式

sentinel模式,是由一个sentinel实例或集群,来监控一个或多个master-slave集群。 在master宕机后,提升slave为master,实现主从切换。

下面来搭建一个伪分布式集群-如上图,具体看一下相关配置

redis集群:

Redis-Master 127.0.0.1 6379

#1 安装 redis5.0
mkdir redis-master
make install PREFIX = /var/redis-ms/redis-master
cp /var/redis-5.0.5/redis.conf /var/redis-ms/redis-master/bin
#2 修改 redis.conf
# `daemonize` `no` 改为 `yes`,后台运行
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
# 是否开启保护模式,由 yes 该为 no
protected-mode no
 
Redis-Slaver1 127.0.0.1 6380
# 安装 redis-slaver1
mkdir redis-slaver1
cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-slaver1
# 修改配置文件
vim /var/redis-ms/redis-slaver1/redis.conf
port 6380
replicaof 127.0.0.1 6379
Redis-Slaver2 127.0.0.1 6381
# 安装 redis-slaver2
mkdir redis-slaver2
cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-slaver2
# 修改配置文件
vim /var/redis-ms/redis-slaver2/redis.conf
port 6381
replicaof 127.0.0.1 6379
sentinel集群:
Redis-Sentinel1:127.0.0.1 26379
# 安装 redis-sentinel1
mkdir redis-sentinel1
cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-sentinel1
 
# 拷贝 sentinel.conf 配置文件并修改
cp /var/redis-5.0.5/sentinel.conf /var/redis-ms/redis-sentinel1
 
# 哨兵 sentinel 实例运行的端口 默认 26379
port 26379
# `daemonize` `no` 改为 `yes`
daemonize yes
 
# quorum表示当有quorum个sentinel认为master不可用,就正式认为master不可用
# sentinel monitor <master-name> <ip> <master-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
 
# 当在 Redis 实例中开启了 requirepass foobared 授权密码 这样所有连接 Redis 实例的客户端都要提供密码
# 设置哨兵 sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
# 指定多少毫秒之后 主节点没有应答哨兵 sentinel 此时 哨兵主观上认为主节点下线 默认 30 秒,改成 3
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 3000
 
# 这个配置项指定了在发生 failover 主备切换时,最多可以有多少个 slave 同时对新的 master 进行同步,
这个数字越小,完成 failover 所需的时间就越长,
但是如果这个数字越大,就意味着越多的 slave 因为 replication 而不可用。
可以通过将这个值设为 1 来保证每次只有一个 slave 在同步, 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
# 故障转移的超时时间 failover-timeout ,超过认为转移失败,默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
Redis-Sentinel2:127.0.0.1 26380
# 安装 redis-sentinel2
mkdir redis-sentinel2
cp -r /var/redis-ms/redis-sentinel1/* /var/redis-ms/redis-sentinel2
# 修改 sentinel.conf
vim /var/redis-ms/redis-sentinel2/sentinel.conf
port 26380
Redis-Sentinel3:127.0.0.1 26381
# 安装 redis-sentinel3
mkdir redis-sentinel3
cp -r /var/redis-ms/redis-sentinel1/* /var/redis-ms/redis-sentinel3
# 修改 sentinel.conf
vim /var/redis-ms/redis-sentinel3/sentinel.conf
port 26381
配置好后依次启动redis集群和sentinel集群
# 启动 redis-master redis-slaver
redis-master 目录下 ./redis-server redis.conf
redis-slaver1 目录下 ./redis-server redis.conf
redis-slaver2 目录下 ./redis-server redis.conf
# 启动 redis-sentinel
redis-sentinel1 目录下 ./redis-sentinel sentinel.conf
redis-sentinel2 目录下 ./redis-sentinel sentinel.conf
redis-sentinel3 目录下 ./redis-sentinel sentinel.conf
# 查看启动状态
[root@localhost bin] # ps -ef |grep redis
root 3602 1 0 01 :33 ? 00 :00:00 ./redis-server *:6379
root 3647 1 0 01 :37 ? 00 :00:00 ./redis-server *:6380
root 3717 1 0 01 :40 ? 00 :00:00 ./redis-server *:6381
root 3760 1 0 01 :42 ? 00 :00:00 ./redis-sentinel *:26379
[sentinel]
root 3765 1 0 01 :42 ? 00 :00:00 ./redis-sentinel *:26380
[sentinel]
root 3770 1 0 01 :42 ? 00 :00:00 ./redis-sentinel *:26381
[sentinel]
root 3783 2261 0 01 :42 pts/0 00 :00:00 grep --color = auto redis

sentinel是一个特殊的redis,不会持久化。集群搭建好后,我们来看一下sentinel的执行流程:

1、sentinel启动并初始化

此过程每个实例都会创建两个网络连接,连向master:

命令连接:向master发送命令-如info,接收响应。

订阅连接:订阅master的频道: —sentinel—:hello

 2、获取master信息

默认每10s向master发送info命令,获取master和其slave的信息

127 .0.0.1:6379> info
# Server
redis_version:5.0.5
os:Linux 3 .10.0-229.el7.x86_64 x86_64
run_id:a4e06ab61b4116660aa37b85079ed482b0b695b1
# Replication
role:master
connected_slaves:2
slave0 :ip = 127 .0.0.1 ,port = 6380 ,state = online ,offset = 1571684 ,lag = 1
slave1 :ip = 127 .0.0.1 ,port = 6381 ,state = online ,offset = 1571551 ,lag = 1
master_replid:366322125dd7dc9bc95ed3467cfec841c112e207
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1571684
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:523109
repl_backlog_histlen:1048576
3、获取slave信息
sentinel发现有新slave加入,也会像slave建立这两个网络连接,并每隔10s向slave发送info命令
# Server
redis_version:5.0.5
os:Linux 3 .10.0-229.el7.x86_64 x86_64
run_id:e289b3286352aaf8cc9f1ac7ebcc6d36131b8321
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:1699595
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:366322125dd7dc9bc95ed3467cfec841c112e207
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1699595
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:651020
repl_backlog_histlen:1048576
4、上面说了会订阅 —sentinel—:hello频道,就是通过发送命令:subscribe —sentinel—:hello 。 集群之间的sentinel不需要订阅连接,他们会通过订阅的主/从服务器感知到新的其他的sentinel,然后通过命令连接通信。
 
此外,每隔2s,sentinel给被监控的主从服务器发送订阅消息,消息携带sentinel自身和master的信息。
PUBLISH _sentinel_:hello "< s_ip > < s_port >< s_runid >< s_epoch > < m_name > < m_ip >< m_port ><m_epoch>"
 
5、 检测主关下线状态
Sentinel 每秒一次向所有与它建立了命令连接的实例 ( 主服务器、从服务器 ) 发送 PING 命令
实例在 down-after-milliseconds 毫秒内返回无效回复 ( 除了 +PONG -LOADING -MASTERDOWN )
实例在 down-after-milliseconds 毫秒内无回复(超时)
Sentinel 就会认为该实例主观下线 ( SDown)
6、 检查客观下线状态
当一个 Sentinel 将一个主服务器判断为主观下线后 ,Sentinel会向同时监控这个主服务器的所有其他 Sentinel 发送命令查询主机的

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>

其他 Sentinel 回复

<down_state>< leader_runid >< leader_epoch >

判断它们是否也认为主服务器下线。如果达到 Sentinel 配置中的 quorum 数量的 Sentinel 实例都判断主服
务器为主观下线,则该主服务器就会被判定为客观下线 ( ODown )
 
7、对于sentinel集群,也有leader的概念,来看一下sentinel的leader选举

先了解raft选举算法http://blog.itpub.net/31556438/viewspace-2637112/

1、基础概念:

节点状态:Leader, Follower, Candidate(候选者)

term: 任期。 同一个任期内,只有一个节点担任leader。

请求命令:AppendEntries  leader发送给follower的业务命令(client端的操作命令日志)或保持心跳的命令(不带操作日志)。 

                  RequestVote  Candidate发送给follower给自己投票的命令。

超时时间timeout: 在timeout时间内,如果follower有收到AppendEntries或RequestVote命令,继续保持follower状态,否则转换为Candidate参与选举。

2、流程:

a、集群节点启动时,所有节点都初始化为follower,term初始化为0。这时候没有leader或Candidate给他们发送命令,且应初始化时间不同等因素,达到timeout的时间点也不同。

b、当某一节点达到timeout,转换为Candidate。 将自己的term增加1,给其他follower发送RequestVote命令给自己投票。   在此期间,可能也有其他follower变为Candidate发起投票。

c、同一个term内,follower只会第一次收到RequestVote命令的时候投票成功,也就是第一个Candidate会成为leader,失败的candidate会重新变为follower。

d、成为leader后,向所有Follower发送定期心跳(不带日志条目的AppendEntries RPC)以保持其权限。 

Sentinel leader 选举流程

sentinel使用raft进行leader选举,但是和raft流程有些差别。。它是发生在redis集群有故障需要主从切换的时候才需要选出leader,然后leader来选出master,进行主从切换。 当故障切换完成后,各sentinel节点间又恢复平等。

什么样的sentinel会参与选举呢?当认为redis master客观下线后,就会进入选举。 因为每个sentinel判断客观下线时间不一样,所以先开始的最有机会成为leader。

故障转移流程

当选举出Leader Sentinel后,Leader Sentinel会对下线的主服务器执行故障转移操作,主要有三个步骤:

1. 它会将失效 Master 的其中一个 Slave 升级为新的 Master , 并让失效 Master 的其他 Slave 改为复制新的 Master

2. 当客户端试图连接失效的 Master 时,集群也会向客户端返回新 Master 的地址,使得集群可以使用现在的 Master 替换失效 Master

3. Master Slave 服务器切换后, Master redis.conf Slave redis.conf 和 sentinel.conf 的配置文件的内容都会发生相应的改变,即, Master 主服务器的 redis.conf配置文件中会多一行 replicaof 的配置, sentinel.conf 的监控目标会随之调换。

主服务器的选择

哨兵leader根据以下规则从客观下线的主服务器的从服务器中选择出新的主服务器。

1. 过滤掉主观下线的节点

2. 选择slave-priority最高的节点,如果有则返回,没有就继续选择。 (slave-priority配置,专门用于sentinel选举master,默认权重100。为0表示此slave为观察者,不参与master选举)

3. 选择出复制偏移量最大的slave节点,因为复制偏移量越大则数据复制的越完整,如果没有就继续

4. 选择run_id最小的节点,因为run_id越小说明重启次数越少

 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值