1:哨兵概念
当Master挂掉的时候,我们需要做什么操作:
可能需要从一堆的slave中重新选举出一个新的master。
当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
而这个投票机制就依赖于哨兵。
2:哨兵(哨兵系统)作用
哨兵(sentinel)监控系统 是一个分布式系统,这个系统可以只有一个哨兵(但可能有偏差 因此也可能有多个哨兵)
每一个哨兵 都会 用于对主从结构中的每台服务器进行监控,
1:监控:监控master和slave不断的检查master和slave是否正常运行
master存活检测、master与slave运行情况检测
2:通知(提醒):当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知
3:自动故障转移:断开master与slave连接,选取一个slave作为master,将其他slave连接新的master,
并告知客户端新的服务器地址
注意:哨兵也是一台redis服务器,只是不提供数据相关服务,通常哨兵的数量配置为单数
3:启用哨兵
配置哨兵配置一拖二的主从结构(利用之前的方式启动即可)
配置三个哨兵(配置相同,端口不同),参看sentinel.conf
注意:一共需要6个服务器的redis
注意:一共需要6个服务器的redis
注意:一共需要6个服务器的redis
sentinel.conf配置:
1:设置哨兵监听的主服务器信息, sentinel_number表示参与投票的哨兵数量(sentinel除以2 再加1)
sentinel monitor master_name master_host master_port sentinel_number
2:设置判定服务器宕机时长,该设置控制是否进行主从切换(多少秒后切换)
sentinel down-after-milliseconds master_name million_seconds
3:设置故障切换的最大超时时(如果超过这个时间还没切换好 认为切换失败)
sentinel failover-timeout master_name million_seconds
4:设置主从切换后,同时进行数据同步的slave数量,数值越大,要求网络资源越高,数值越小,同步时间越长
sentinel parallel-syncs master_name sync_slave_number
启动哨兵:
redis-sentinel filename
以配置文件启动 :哨兵一启动
redis-sentinel sentinel.conf
注意
启动后的 redis-sentinel 配置文件
当哨兵二 哨兵三启动后 哨兵一的配置文件会进行改变 发现它会把哨兵二 哨兵三也找到了
在客户端使用info命令查看该哨兵的基本信息
也可以进入redis-sentinel 的配置文件查看信息
设置哨兵监听的主服务器信息, sentinel_number表示参与投票的哨兵数量(sentinel加1 再除以2 )
sentinel monitor mymaster 127.0.0.1 6401 2
sentinel known-relpica mymaster 127.0.0.1 6402
sentinel known-relpica mymaster 127.0.0.1 6403
sentinel known-sentinel mymaster 127.0.0.1 26402 IdIdIdIdIdIdIdId
sentinel known-sentinel mymaster 127.0.0.1 26403 IdIdIdIdIdIdIdId
4:主从切换演示
把 6401 (master ) 关闭
查看其中一个哨兵日志:
1:master 6401掉线
sdown master mymaster 127.0.0.1.6401 (该sentinel主观认为掉线)
2:进行投票
new-epoch 1
vote-for-leader IDIDIDDID 1 (salve发起投票)
odown master mymaster 127.0.0.1.6401 #quorum 2/2 (满足投票下限 sentinel加1 再除以2)
3:进行选举过程
+confg-update-from sential ....
4:master切换成6403
switch-master mymaster 127.0.01 6401 127.0.0.1 6403
5:6401 与 6402 以从节点连接 6403
+slave slave 127.0.01 6401 127.0.01 6401 @mymaster 127.0.0.1 6403
+slave slave 127.0.01 6402 127.0.01 6402 @mymaster 127.0.0.1 6403
6:slave 掉线
+sdown slave 127.0.01 6401 127.0.01 6401 @mymaster 127.0.0.1 6403
把 6401 (slave) 重启
6401 以slave的身份 重连 6403(master)
convert - to slave slave 127.0.01 6401 127.0.01 6401 @mymaster 127.0.0.1 6403
使用info命令查询 master 或者 slave的信息 确认是否切换成功
4:哨兵工作原理(配置信息 master 与 slave)
1:监控节点
2:通知阶段
3:故障转移
1:监控节点
1:获取各个sentinel的状态(是否在线)
2:请求master 获取master的状态 并且 获取各个slave的信息
master属性:
prunid
prole:master
3:请求slave 获取slave的详细信息
slave属性:
prunid
prole:slave
pmaster_host、master_port
poffset
第一个 sentinel
1:sentinel 向 master 发送info命令 建立cmd连接(命令通道)
2:sentinel 获取信息 (sentinelState)
3:master 获取信息 (sentinelRedisInstance) 可以加上 第一个sentinel的信息
第二个 sentinel
master 获取信息(sentinelRedisInstance 这时已经有第一个sentinel的信息) 可以加上 第二个sentinel的信息
第二个sentinel 会根据 master 里面的 sentinelRedisInstance 的信息连接 第一个sentinel (进行消息互通)
第三个 sentinel 以此类推
三个 sentinel 建立了一个信息网 通过发布订阅的方法进行交互
2:通知阶段
sentinel在通知阶段要不断的去获取master/slave的信息,
然后在各个sentinel之间进行共享。
3:故障转移
三次投票:
1:master是否宕机
2:投票选择 拥有决定权的sentinel
3:投票选择 哪个slave当master
1:当master宕机后sentinel是如何知晓并判断出master是真的宕机了呢
1:当sentinel1给master发信息的时候 master没有回复 该sentinel主观的认为master宕机了 S_DOWN
2:sentinel1在信息网里面和其他的sentinel进行交流
3:其他的sentinel马上给master发信息
4:当到达投票下限的时候(sentinel加1 再除以2) 认为master O_DOWN
2:投票选择 拥有决定权的sentinel
1:每个人都会发出一个指令,在内网里边告诉大家我要当选举人。
2:现在的sentinel1和sentinel4发出这个选举指令了,那么sentinel2既能接到sentinel1的也能接到sentinel4的,:
3:sentinel2 就会把他的一票投给:谁先过来我投给谁,假设sentinel1先过来,所以这个票就给到了sentinel1。
4:对应的选举最终得票多的,那自然就成为了处理事故的人。
需要注意在这个过程中有可能会存在失败的现象,就是一轮选举完没有选取,那就会接着进行第二轮第三轮直到完成选举。
3:投票选择 哪个slave当master
首先它有一个在服务器列表中挑选备选master的原则
不在线的OUT
响应慢的OUT
与原master断开时间久的OUT
优先原则
1:优先级
2:offset (同步master的数据是较多的)
3:runid (。。。)
选出新的master之后,发送指令( sentinel )给其他的slave:
向新的master发送slaveof no one
向其他slave发送slaveof 新masterIP端口
总结:故障转移阶段
1:发现问题,主观下线与客观下线
2:竞选负责人
3:优选新master
4:新master上任,其他slave切换master,原master作为slave故障恢复后连接
网友评论