redis高可用

一.redis主从复制

redis提供复制(replication)功能可以自动实现同步的过程 redis主从

主从模式的工作原理

全量同步的过程:
一般发生在Slave初始化阶段
1.Slave连接主服务器,发送SYNC命令
2.Master接收到SYNC命令,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
3.Master执行完BGSAVE后,向所有的服务器发送RDB文件,并在发送期间继续记录被执行的写操作
4.Slave收到RDB文件后丢弃所有旧数据,载入收到的RCB
5.Master快照发送完毕后开始向Slave发送缓存区中的写命令
6.Slave完成RDB载入后,开始接受命令的请求,并执行来自Master缓冲区的写命令


增量同步的过程:
一般发生在Slave已经初始化完成,开始正常连接Master的阶段
1.Master接受到写请求,讲写命令发送到Slave
2.Slave执行收到的写命令

注意

1.如果多个Slave同时宕机,那么就会同时向Master发送SYNC命令,那么有可能造成Master节点IO剧增,可能引发Master宕机
2.如果Master宕机,不会从Slave节点晋升选举Master,集群因此失去了写能力,需要手动切换slave为master

二.哨兵模式

工作特点

1.哨兵模式是建立在主从模式的基础上,当Master宕机后,哨兵会从slave节点选择一个节点作为master,并修改他们的配置文件,
  是其它的slave指向新的master
2.当原先的master宕机后重启时,它将不再是master,而是作为一个slave
3.哨兵节点是一个特殊的redis节点(不存储数据),本质上是个进程,所以也有挂掉的可能,所以哨兵也存在集群模式

工作原理

1.每隔10s,每个哨兵会向slave和master发送info命令获取最新的拓扑结构
2.每个1s,每个哨兵节点,会向主从节点和其他哨兵节点发送ping心跳检查,看看是否存在不可达的节点

[主观下线]:如果某个哨兵向一个节点发送心跳检测没有得到响应,则该哨兵认为该节点已经下线
[客观下线]:当哨兵主观下线的是主节点时,哨兵会向其他哨兵询问对主节点的判断,当判断下线超过一定数量时
          哨兵会认为主节点确实已经下线,那么会对主节点进行客观下线的判定
[故障转移]:当master客观下线,哨兵会从slave节点选择一个节点作为master节点,选择的规则是与主节点复制度最高的节点,
          选择完成后会将其与的slave节点指向新的master节点,并监控原来的master节点,当它回复后作为新的master节点的slave存在
          并同步新的master数据
[选举领导哨兵节点]:当主节点被判断客观下线,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作

注意

当使用sentinel模式的时候,客户端不能直接redis,而是连接哨兵的ip和port,由哨兵来提供具体的可以提供服务的redis

缺陷

哨兵无法对slave进行自动故障转移,在读写分离场景下,slave故障会导致服务不可用

三.Cluster模式

工作特点

1.多个Redis节点互联,数据共享
2.所有节点都是主从模式,其中Slave不提供服务,只提供备用
3.不支持同时处理多个key,因为需要分发到多个节点上
4.支持在线增加,删除节点
5.客户端可以连接任何一个Master进行读写

集群工作原理

Redis Cluster 有固定的16384个hash slot,
对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot
每个master都会持有部分slot.比如有3个master,那么可能每个master持有5000多个hash slot

[主观下线]:集群中每个节点都会定期向其他节点发送ping消息,如果在一段时间内 一直通信失败
         ,则发送节点方认为接受节点存在故障,把接受节点标为主观下线(pfail)转态

[客观下线]:当某个节点判断另一个节点主观下线后,相应的节点转态就会在集群中传播,如果集群中
          所有的节点都将它标记为主观下线,则该节点客观下线,并通知该节点的Slave进行故障切换
[故障转移]:在某个节点客观下线后,该节点的从节点开始故障转移,首先进行资格检查
          ,每个从节点检查与主节点的断开时间,超过一定的时间取消选举资格,然后同样在所有从节点中寻找
          复制偏移量最大的节点开始选举,只有持有slot的主节点才有投票权,当从节点收集到过半的票数,则晋升Master.

Cluster集群搭建步骤

txt

results matching ""

    No results matching ""