redis主从和集群可以保证数据一致性吗 ?
目录
[redis主从和集群可以保证数据一致性吗 ?](#redis主从和集群可以保证数据一致性吗 ?)
[Sentinel Leader选举主节点](#Sentinel Leader选举主节点)
redis主从和集群都属于CAP理论中的AP模型 ,即为了保持可用性舍弃了高一致性,在主从复制中可以数据的最终一致性,因为主从复制是异步,可能期间就会出现部分节点数据不一致问题,集群同理
哨兵机制的原理是什么?
Redis主从框架中,从服务器需要主服务器给它传递数据,那如果主服务器挂了,就需要借助哨兵(Sentinel)机制

哨兵机制的原理是主节点故障转移:哨兵节点监测主服务器是否宕机,若宕机,则会在从节点里选举一个主节点,并把新主节点的所有信息通知给其他所有节点
哨兵其实是一个特殊的redis进程,也算是一个节点但它的工作主要是监视,监视的对象为主节点,在主节点发生故障时采取一些措施来补救
哨兵节点主要负责三件事情:监控、选主、通知
哨兵机制的选主节点的算法介绍一下
当redis主节点故障时,sentinel集群从剩下的从节点中选取主节点有如下几个步骤:
1.sentinel节点确认主节点为主观下线
2.sentinel节点确认主节点为客观下线
3.sentinel节点中选举leader节点
4.从节点中选举主节点
主观下线
sentinel节点会定时给redis所有节点发送心跳包检测节点是否故障,若在down-after-milliseconds时间内没有回复sentinel节点的心跳包,则判定为改节点主观下线

客观下线
当一个Sentinel节点认定一个节点主观下线后会询问别的Sentinel节点,看他们和自己的判断是否一致,若超过quorum数量的节点认定相同,则判断这个节点为客观下线

sentinel集群选举leader
想要重新选举新的主节点,需要在Sentinel集群里面选举一个leader

当一个Sentinel节点认定一个节点为客观下线后,会请求其他所有Sentinel节点选举自己为leader,其他Sentinel节点没有选举过其他节点 为leader时就会同意该请求 ,若之前同意过 其他节点则不会再投票 给当下Sentinel节点,当哨兵节点的票数达到了leader最低选举票数(Max(quorum,Sentinel节点总数/2)),则会被选举为leader
举例如下:

如图,Sentinel1最先请求2 3节点,因为2 3节点没有同意过其他节点的请求,则1的票数有2票,之后2节点请求1 3,因为1没有投票过,所以给2投票了,3给1投过票则不能投票给2;3请求 1 2时,1和2都投过票,则3为0票,最后1为leader
Sentinel Leader选举主节点
选举主节点的优先级如下:
1.过滤故障节点
2.在redis.config中的slave-priority(权值)的数值最高,没有则继续
3.复制偏移量最大(也就是和之前的主节点相似度最高),没有则继续
4**.runid(** 在redis运行时会生成一个runid标识),最小的优先
