Redis集群
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)
的奇数个。
哨兵功能包括两个
- 第一:哨兵节点会以每秒一次的频率对每个 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每台节点上存储不同的内容。
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,集群模式下只能使用一个。
- 此模式不建议用
mset
、mget
、sunion
等操作支持不友好操作。 - 数据通过异步复制,不保证数据的强一致性
- slave充当“冷备”,不能缓解读压力
- key事务支持有限,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能
Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
评论