redis之哨兵

1. 作用

  • 监控
    • 不断检查master与slave是否正常运行
    • master存活检测,master与slave运行情况检测
  • 通知
    • 当被监控的服务器出现问题,向其他(哨兵、客户端)发送通知
  • 自动故障转移
    • 断开master与slave连接,选取一个slave作为master,将其他slave连接到这个新的master上,并告知客户端新的服务器地址

2. 配置哨兵(docker下)

使用docker启动3个redis服务器,一个主,两个从,进行主从配置,三台redis服务器分别启动一个哨兵sentinel

1. 进入容器配置哨兵

# 进入到redis1这个容器里面
docker exec -it redis1 /bin/bash


# 可能需要更新依赖和安装vim
# apt-get update
# apt-get install -y vim

# 创建哨兵的配置文件
vim sentinel.conf

2. 编辑配置文件

# 指定哨兵监听端口号
port 29379

# 哨兵工作目录
dir "/data"

# 配置监听的master的ip与端口号,并且指定当有两个哨兵觉得master挂掉就认为master挂了
sentinel monitor mymaster 172.17.0.1 6379 2

# 配置当多少毫秒连接master没有响应就认为它挂掉了
sentinel down-after-milliseconds mymaster 30000

# 配置当master挂了,新上任的slave要花多少代价去同步,值越小,服务器性能消耗越小,效率越低
sentinel parallel-syncs mymaster 1

# 配置进行同步时,多长时间完场算有效,单位毫秒
sentinel failover-timeout mymaster 180000

3. 启动哨兵

redis-sentinel sentinel.conf

3. 工作原理

  • 监控master状态,同时能获取所有的slave信息和哨兵信息

  • 一个哨兵认为master挂了之后,所有的哨兵开始去检查这个master是否挂了,如果超过半数哨兵认为这个master挂了之后,就真的认为这个master挂了。
  • 然后所有的哨兵投票选出一个决策者
  • 然后这个决策者哨兵就在slave中选取一个作为master,选取策略
    • 排除不在线的
    • 排除响应慢的
    • 排除于原来的master断开的时间久的
    • 然后根据优先原则选取
      • 优先选取优先级高的
        • 判断slave-priority值,值越小优先级越高,如果为0表示永不参与选举
      • 根据偏移量选择 
        • offset越大,说明数据越新,优先级越高
      • 根据runid(选runid小的)
  • 选择之后,让这个slave成为新的master(给其发送slaveof no one命令),并通知其他的slave连接这个新的master(给它们发送slaveof命令)
  • 最后故障的master重新上线了,哨兵也会将他变为从节点,连接新的master节点

4. 哨兵总结

  1. Sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式下不同的命令表,所以Sentinel模式下能够使用的命令和普通Redis服务器能够使用的命令不同
  2. Sentinel会读入用户指定的配置文件,为每个要监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,而订阅连接则用于接收指定频道的消息
  3. Sentinel通过向主服务器发送INFO命令来获取主服务器下的所有从服务器的地址信息,并为这些从服务器创建响相应的实例结构,以及连向这些从服务器的命令连接和订阅连接
  4. 在一般情况下,Sentinel以每十秒一次的评论向被连接的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行故障转移操作时,Sentinel向从服务器发送INFO命令的频率改为每秒一次
  5. 对于显示同一个主服务器和从服务器的多个Sentinel来说,他们会以每两秒一次的频率,通过向其他监视服务器的__sentinel__:hello频道发送消息来向其他Sentinel宣告自己的存在
  6. 每个Sentinel也会从__sentinel__:hello频道中接收其他Sentinel发来的消息,并根据这些信息为其他Sentinel创建实例结构,以及命令连接
  7. Sentinel只会与主服务器和从服务器创建命令连接和订阅连接,Sentinel之间则只会创建命令连接
  8. Sentinel以每秒一次的频率向实例(包括主服务器,从服务器,其他Sentinel)发送ping命令,并根据实例对ping的回复来判断实例是否在线,当一个实例在指定时长中连续向sentinel发送无效回复时,sentinel会将这个实例判断为主观下线
  9. 当sentinel将一个主服务器判断为主观下线是,它会向同样监视这个主服务器的其他sentinel进行询问,看他们是否同意这个主服务器已经进入主观下线
  10. 当Sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客户端下线,并发起一次针对主服务器的故障转移操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值