redis有三种集群方式: 主从复制哨兵模式集群

一、主从复制

主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave)

原理(工作机制)

  • slave启动后,向master发送 sync 命令
  • master接收到 sync 命令后通过 bgsave 保存快照(RDB持久化)并使用缓冲区记录保存快照这段时间内执行的写命令
  • master将保存的快照文件发送给slave,并继续记录执行的写命令
  • slave接收到快照文件后,加载快照文件,载入数据
  • master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化
  • 此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性

优点

  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
  • 为了分载Master的操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
  • Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
  • Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
  • Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据

缺点

  • Redis不具备自动容错和恢复功能,主从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

二、哨兵模式

哨兵模式基于主从复制模式,只是引入了哨兵来监控与自动处理故障Redis Sentinel 的节点数量要满足 2n+1(n>=1) 的奇数个

img

哨兵功能包括两个

  • 第一:哨兵节点会以每秒一次的频率对每个 Redis 节点发送PING命令,并通过 Redis 节点的回复来判断其运行状态。
  • 第二:当哨兵监测到主服务器发生故障时,会自动在从节点中选择一台将机器,并其提升为主服务器,然后使用 PubSub 发布订阅模式,通知其他的从节点,修改配置文件,跟随新的主服务器。

原理

  • 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master、Slave服务器以及其他Sentinel(哨兵)进程发送 ping 命令。
  • 如果一个实例instance距离最后一次有效回复 ping 命令时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被哨兵进程标记为主观下线
  • 正在监视这个Master的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master的确进入了主观下线状态
  • 当有足够数量的 Sentinel(哨兵)进程在指定的时间范围内确认Master进入了主观下线状态(SDOWN) 则Master会被标记为客观下线(ODOWN)
  • 一般情况下每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master、Slave服务器发送 info 命令。
  • 当Master标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master的所有 Slave发送 info 命令的频率会从 10 秒一次改为每秒一次。
  • 若没有足够数量的 Sentinel(哨兵)进程同意 Master下线, Master客观下线状态就会被移除。
  • 若 Master重新向 Sentinel(哨兵)进程发送 ping 命令返回有效回复,Master主观下线状态就会被移除。

优点

  • 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
  • 主从可以自动切换,系统更健壮,可用性更高。

缺点

  • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

三、Cluster集群模式

Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题

Redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说redis每台节点上存储不同的内容。

img

Redis-Cluster采用无中心结构,

特点

  • 所有的redis节点彼此互联(ping-pong机制),内部使用二进制协议优化传输速度和带宽。
  • 节点的fail是通过集群中超过半数的节点检测失效时才生效。
  • 客户端与redis节点直连,不需要中间代理层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

原理

  • 在Redis的每个节点上都有一个插槽(slot)取值范围为0-16383(2的14次方)
  • 当存取key的时候,Redis会根据CRC16的算法得出结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,通过这个值去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
  • 为了保证高可用,Cluster模式也引入主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点
  • 当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。
  • 如果主节点A和它的从节点都宕机了,那么该集群就无法再提供服务了

优点

  • 无中心架构,数据按照slot分布在多个节点。
  • 集群中的每个节点都是平等的关系,都各自保存数据和整个集群的状态。我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
  • 可线性扩展到1000多个节点,节点可动态添加或删除
  • 能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换

缺点

  • 不支持多数据库空间,单机redis可以支持16个db,集群模式下只能使用一个。
  • 此模式不建议用 msetmgetsunion 等操作支持不友好操作。
  • 数据通过异步复制,不保证数据的强一致性
  • slave充当“冷备”,不能缓解读压力
  • key事务支持有限,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能

Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。