sentinel模式,是由一个sentinel实例或集群,来监控一个或多个master-slave集群。 在master宕机后,提升slave为master,实现主从切换。
下面来搭建一个伪分布式集群-如上图,具体看一下相关配置
redis集群:
Redis-Master :127.0.0.1 6379
#1 安装 redis5.0mkdir redis-mastermake install PREFIX = /var/redis-ms/redis-mastercp /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 该为 noprotected-mode no
# 安装 redis-slaver1mkdir redis-slaver1cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-slaver1# 修改配置文件vim /var/redis-ms/redis-slaver1/redis.confport 6380replicaof 127.0.0.1 6379
# 安装 redis-slaver2mkdir redis-slaver2cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-slaver2# 修改配置文件vim /var/redis-ms/redis-slaver2/redis.confport 6381replicaof 127.0.0.1 6379
# 安装 redis-sentinel1mkdir redis-sentinel1cp -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 实例运行的端口 默认 26379port 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-sentinel2mkdir redis-sentinel2cp -r /var/redis-ms/redis-sentinel1/* /var/redis-ms/redis-sentinel2# 修改 sentinel.confvim /var/redis-ms/redis-sentinel2/sentinel.confport 26380
# 安装 redis-sentinel3mkdir redis-sentinel3cp -r /var/redis-ms/redis-sentinel1/* /var/redis-ms/redis-sentinel3# 修改 sentinel.confvim /var/redis-ms/redis-sentinel3/sentinel.confport 26381
# 启动 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 redisroot 3602 1 0 01 :33 ? 00 :00:00 ./redis-server *:6379root 3647 1 0 01 :37 ? 00 :00:00 ./redis-server *:6380root 3717 1 0 01 :40 ? 00 :00:00 ./redis-server *:6381root 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# Serverredis_version:5.0.5os:Linux 3 .10.0-229.el7.x86_64 x86_64run_id:a4e06ab61b4116660aa37b85079ed482b0b695b1# Replicationrole:masterconnected_slaves:2slave0 :ip = 127 .0.0.1 ,port = 6380 ,state = online ,offset = 1571684 ,lag = 1slave1 :ip = 127 .0.0.1 ,port = 6381 ,state = online ,offset = 1571551 ,lag = 1master_replid:366322125dd7dc9bc95ed3467cfec841c112e207master_replid2:0000000000000000000000000000000000000000master_repl_offset:1571684second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:523109repl_backlog_histlen:1048576
# Serverredis_version:5.0.5os:Linux 3 .10.0-229.el7.x86_64 x86_64run_id:e289b3286352aaf8cc9f1ac7ebcc6d36131b8321# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:1699595slave_priority:100slave_read_only:1connected_slaves:0master_replid:366322125dd7dc9bc95ed3467cfec841c112e207master_replid2:0000000000000000000000000000000000000000master_repl_offset:1699595second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:651020repl_backlog_histlen:1048576
PUBLISH _sentinel_:hello "< s_ip > < s_port >< s_runid >< s_epoch > < m_name > < m_ip >< m_port ><m_epoch>"
Sentinel 每秒一次向所有与它建立了命令连接的实例 ( 主服务器、从服务器 ) 发送 PING 命令实例在 down-after-milliseconds 毫秒内返回无效回复 ( 除了 +PONG 、 -LOADING 、 -MASTERDOWN 外 )实例在 down-after-milliseconds 毫秒内无回复(超时)Sentinel 就会认为该实例主观下线 ( SDown)
当一个 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 ) 。
先了解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越小说明重启次数越少