Redis 集群的3种方式及其优缺点

1.主从复制

流程

  • 从服务器连接到主服务器之后,发送sync同步命令
  • 主服务器收到sync命令之后,执行BGSAVE命令生成RDB快照文件,并使用缓冲区记录此后执行的所有写命令
  • 执行完BGSAVE命令后,主服务器向所有从服务器发送快照文件
  • 从服务器收到快照文件后,移除所有旧数据,载入RDB快照数据
  • 主服务器发完快照文件后,开始向从服务器同步缓冲区记录的写命令
  • 从服务器完成快照文件写入后,开始接收命令请求,并执行来自主服务器缓冲区的写命令
  • 主服务器每执行一条写命令,都会同步到从服务器

优点

  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离,减轻主机的压力
  • 主机采用非阻塞形式给从机提供服务,在进行同步过程中,仍然可以提供查询和写入功能
  • 从机同样采用非阻塞形式完成数据同步,如果同步过程中有查询请求,redis会返回同步之前的数据

缺点

  • 不具备自动容错和恢复功能,主机从机的宕机都会导致部分读写请求失败,需要等待机器重启或者手动切换ip才能恢复
  • 主机宕机,如果有部分写命令没有同步到从机,就会导致数据不一致问题,降低了系统可用性
  • 主从结构较难支持在线扩容,集群容量达到上限后,扩容会变得非常复杂

2.哨兵模式

哨兵的作用:监控主服务器和从服务器是否正常运行;主服务器出现故障时,自动将从服务器升级为主服务器

流程

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

优点

哨兵模式是基于主从模式的,所有主从的优点,哨兵都有

主从可以自动切换,系统更健壮,可用性更高

缺点

较难支持在线扩容,集群容量达到上限时,扩容会变得非常复杂

3.集群模式

集群采用无中心结构,具体特点如下:

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

流程

集群的工作方式:

  • redis的每一个节点上都有slot槽,范围为0~16383。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把该结果对16384取余。这样每个key对应的slot值都在0~16383之间,通过该值找到对应的节点,并跳转到该节点进行数据存取。
  • 为了高可用,redis集群引入了主从模式,一个主节点对应一个或多个从节点,当主节点宕机的时候,就会启用从节点。当其他主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,则认为主节点A宕机了。如果主节点A和他的从节点A1都宕机了,那么该集群就无法再提供服务了。

优点

  • 无中心架构
  • 数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布
  • 可扩展性:可线性扩展到1000多个节点,节点可动态添加和删除
  • 高可用:部分节点不可用时,集群仍可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升
  • 降低运维成本,提高系统的扩展性和可用性

缺点

  • 节点会因为某些原因发生阻塞(阻塞时间大于 cluster-node-timeout),被判断下线,这种failover是没有必要的
  • 数据通过异步复制,不能保证数据一致性
  • 多个业务使用同一个集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况
  • 不支持多数据库空间,单机时可以选择16个数据库,集群只能选择一个数据库,即db0
  • key批量操作限制,如mget、mset,目前只支持相同slot值的key执行批量操作,不同的slot不支持跨slot查询。

哨兵模式集群故障处理

如果客观下线的是从节点或者Sentinel节点,则到此为止;如果是主节点,则开始进行故障转移,从从节点中选举一个升级为主节点。

首先需要从Sentinel中选举一个为Sentinel leader,当一个sentinel节点确认主节点主观下线后,会请求其他sentinel节点将自己选举为leader,如果被请求sentinel节点没有同意过其他节点的选举请求,则同意,票数+1,反之则拒绝

Sentinel Leader选举出来之后,从从节点中选择一个节点作为主节点:

a.过滤故障节点

选择优先级slave-priority最大的作为主节点,若不存在则继续

b.选择复制偏移量最大的作为主节点,若不存在则继续

偏移量: 数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步

c.选择runid最小的作为主节点

runid: redis每次启动的时候生成随机的runid作为redis的标识

以上就是Redis 集群的3种方式及其优缺点分析

我是【辛勤de小蜜蜂】关注我,我们下期见


  • 由于博主才疏学浅,难免会有纰漏,假如您发现了错误或遗漏的地方,还望留言斧正,我会尽快对其加以修正。

  • 如果您觉得文章还不错,您的转发、分享、点赞、留言就是对我最大的鼓励。

  • 感谢您的阅读,十分欢迎并感谢您的关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值