当前位置: 代码迷 >> 综合 >> Redis-集群三种模式简介
  详细解决方案

Redis-集群三种模式简介

热度:15   发布时间:2023-09-06 12:35:42.0

简介

redis实现高可用的方式通常有三种模式:主从模式,哨兵模式,redis-cluster集群。

主从模式

一台主服务器、多台从服务器

Redis-集群三种模式简介

原理

  1. 从服务器(slave)起始连接主服务器(master),从服务器(slave)发起数据同步请求(sync命令);
  2. 主服务器(master)接受sync命令,执行BGSAVE命令,把已有的数据生成RDB文件(通过RDB方式持久化),同时这段时间的会把写命令记录到缓存;
  3. 主服务器(master)执行完BGSAVE(持久化结束),向从服务器(slave)发送快照文件,并且这段时间写命令一直记录在缓存中,快照文件发送完,开始发送缓存记录;
  4. 从服务器(slave)接收到快照文件,丢弃旧数据,载入快照文件;
  5. 快照文件载入结束,接受主服务器(master)的缓存记录,并且执行记录中的命令(初始化完毕);
  6. 后续中,主服务器(master)每执行一个写命令都会往从服务器(slave)发送相同的命令,从服务器接受并执行。

缺点

  1. 不具备容错机制,主服务器(master)挂了,从服务器(slave)不会自动转为主服务器(从服务器不可以对外提供写服务,因为从服务不具备向主服务器发送数据),需要手动更改客户端IP地址
  2. 主服务器(master)发生宕机,会导致从服务器(slave)丢失最近一次同步数据到宕机之间的数据

优点

  1. 主从分离可以实现数据读写分离,主服务器(master)提供读写服务,从服务器(slave)提供读服务。
  2. 主-从同步数据的时候,对外仍然提供读写服务(非阻塞的方式)
  3. 从服务器(slave)同步期间,对外仍然提供读服务(非阻塞方式),返回的数据是同步之前的数据(会产生脏读)

哨兵模式

主从模式当主服务器(master)宕机时候,可以将某台从服务器(slave)升级为主服务器(master),但是这个升级操作需要人工操作。redis为哨兵模式提供一个redis监控工具,可以实时监控主-从服务器状态,和故障恢复功能

Redis-集群三种模式简介

运行步骤

  1. 监控主服务器(master)和从服务器(slave)是否正常运行
  2. 主服务器(master)异常,自动将从服务器(slave)升级为主服务器

原理

  1. 每个哨兵(sentinel)进程以每秒一次的频率向所有主服务器(master)、从服务器(slave)、其他哨兵(sentinel)进程发送一个ping命令
  2. 如果有一个实例(instance)距离最近一次有效的ping命令超过down-after-miliseconds所设置的值,则这个实例将被哨兵(sentinel)设置为主观下线(sdown)
  3. 如果一个主服务器(master)被标记为主观下线(sdown),则正在监控这个主服务器(master)的所有哨兵(sentinel)进程将以每秒一次的频率确认主服务器(master)是否进入主观下线(sdown)
  4. 当确认主观下线的哨兵数达到配置文件制定的值,并且在指定的时间范围内确认主观下线(sdown),则主服务器(master)会被标识为客观下线(odown)
  5. 一般情况下,每个哨兵进程会以10秒一次的频率向所有主服务器(master)、从服务器(slave)发送info命令
  6. 当主服务器(master)被哨兵进程(sentinel)标记为客观下线(odown)时,哨兵(sentinel)进程向下线的主服务器(master)和所有从服务器(slave)发送info的频率变为每秒一次
  7. 若没有足够多的哨兵(sentinel)进程统一主服务器(master)下线,则主服务器(master)客观(odown)下线将被移除。若主服务器(Master)重新向哨兵(sentinel)进程发送PING命令返回有效值,主服务器(master)的主观下线(sdown)就会被移除

优点

  1. 主从模式的优点他都要
  2. 主从服务器可以自动切换,系统容错性更强

缺点

  1. 动态扩张比较难

redis-cluster集群

哨兵模式基本符合高可用、读写分离,但是这种模式下每个redis保存的数据都是一致的,浪费大量内存空间。所以redis cluster实现了分布式存储,每个主节点服务器保存的数据不一样。

Redis-集群三种模式简介

采用无中心结构

  1. redis所有的节点彼此之间互联(ping-pong机制),内部交流以二进制协议优化速度和带宽
  2. 节点失效需要集群超过半数的节点检测失效才失效
  3. 客户端连接redis集群只需要连接集群的任一可用的节点就可

原理

  1. 每个节点都有两个东西:插槽(slot)和cluster,插槽取值范围0-16383(可以形象的想象成一个个槽,每个槽里面可以放数据,每个槽有个编号,编号范围是0-16383)。cluster是一个集群管理的插件,负责维护node<->slot<->value;
  2. 当我们存取一个值key的时候,redis会根据crc16得出一个数字,然后对16383求余(这样子每个key都会有一个[0-16383]范围内的哈希值),根据这个值找到对应的插槽所存在的redis节点(根据这个余数放入相对应的插槽),然后直接跳到该节点进行存取操作;
  3. 为了保证高可用,redis-cluster集群引入主从模式,一个主节点(master)对应多个从节点(slave),当主节点(master)宕机的时候将启用从节点(slave)。
  4. 当其他主节点(master)ping一个主节点时,超过半数以上通信超时则认为该主节点(master)宕机。当有一个主节点(master)和他所有的从节点(slave)都宕机则整个集群都不可用。
  5. redis-cluster可以动态扩容增加删除节点。需要重新分配slot