redis的四种模式

149 阅读9分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

redis的四种模式:

  • 单机模式
  • 主从模式(redis2.8版本之前的模式)
  • 哨兵sentinel模式(redis2.8及之后的模式)
  • redis cluster模式(redis3.0版本之后)

一、单机模式

即安装一个redis就可以直接作为master节点使用。

单机的优点:

  • 部署简单,0成本。
  • 成本低,没有备用节点,不需要其他的开支。
  • 高性能,单机不需要同步数据,数据天然一致性。

单机的缺点:

  • 可靠性保证不是很好,单节点有宕机的风险。
  • 单机高性能受限于CPU的处理能力,redis是单线程的。
  • 单机模式选择需要根据自己的业务场景去选择,如果需要很高的性能、可靠性,单机就不太合适了。

二、主从模式

主从模式就是N个redis实例,可以是1主N从,也可以N主N从。主从模式配置很简单,只需要在从节点配置主节点的ip和端口号即可。启动主从节点的所有服务,查看日志即可以看到主从节点之间的服务连接

image.png

主从模式的作用

一个作用是备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据因为有备份,可以方便恢复。

另一个作用是负载均衡,所有客户端都访问一个节点肯定会影响Redis工作效率,有了主从以后,查询操作就可以通过查询从节点来完成。

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。 前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

既然主从复制,意味着master和slave的数据都是一样的,有数据冗余问题。在程序设计上,为了高可用性和高性能,是允许有冗余存在的。对于追求极致用户体验的产品,是绝对不允许有宕机存在的

image.png

主从的优点:

  • 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。
  • 扩展主节点的读能力,分担主节点读压力。
  • 高可用基石:除了上述作用以外,主从复制还是哨兵模式和集群模式能够实施的基础,因此说主从复制是Redis高可用的基石。

主从的缺点:

  • 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。
  • 比如我刚提到的数据冗余问题

三、哨兵模式

主从模式,当主节点宕机之后,从节点是可以作为主节点顶上来,继续提供服务的。但是有一个问题,主节点的IP已经变动了,此时应用服务还是拿着原主节点的地址去访问,这当然访问不到。于是,在Redis 2.8版本开始引入,就有了哨兵这个概念。

复制的基础上,哨兵实现了自动化的故障恢复

image.png

如图,哨兵模式由两部分组成,哨兵节点和数据节点

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据

数据节点:主节点和从节点都是数据节点

访问redis集群的数据都是通过哨兵集群的,哨兵监控整个redis集群。一旦发现redis集群出现了问题,比如刚刚说的主节点挂了,从节点会顶上来。但是主节点地址变了,这时候应用服务无感知,也不用更改访问地址,因为哨兵才是和应用服务做交互的。

Sentinel很好的解决了故障转移,在高可用方面又上升了一个台阶,当然Sentinel还有其他功能。 比如 主节点存活检测、主从运行情况检测、主从切换

Redis的Sentinel最小配置是 一主一从

哨兵模式监控的原理

  • 每个Sentinel以每秒钟一次的频率,向它所有的 主服务器从服务器 以及其他Sentinel实例 发送一个PING 命令。

image.png

  • 如果一个 实例(instance)距离最后一次有效回复 PING命令的时间超过 down-after-milliseconds 所指定的值,那么这个实例会被 Sentinel标记为主观下线

  • 如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有 Sentinel 节点,要以 每秒一次 的频率确认 该主服务器是否的确进入了主观下线状态。

  • 如果一个主服务器被标记为主观下线,并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,那么这个该主服务器被标记为客观下线

  • 在一般情况下,每个Sentinel会以每10秒一次的频率,向它已知的所有主服务器和从服务器发送 INFO命令。

  • 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO命令的频率,会从10秒一次改为每秒一次

  • Sentinel和其他Sentinel协商主节点的状态,如果主节点处于SDOWN状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点,进行数据复制

  • 当没有足够数量的Sentinel同意主服务器 下线时, 主服务器的客观下线状态就会被移除。当主服务器重新向Sentinel的PING命令返回有效回复时,主服务器的主观下线状态就会被移除

image.png

哨兵模式的优缺点

优点:
  • 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
  • 主从可以自动切换,系统更健壮,可用性更高。
  • Sentinel 会不断的检查主服务器和从服务器是否正常运行。当被监控的某个Redis服务器出现问题,Sentinel 通过API脚本向管理员或者其他的应用程序发送通知。
缺点:
  • Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦。
  • 实现哨兵模式的配置其实是很麻烦的,里面有很多选择。

四、集群模式

主从不能解决故障自动恢复问题,哨兵已经可以解决故障自动恢复了,那到底为啥还要集群模式呢? 主从和哨兵都还有另外一些问题没有解决,单个节点的存储能力是有上限,访问能力是有上限的。

Redis Cluster 集群模式具有 高可用可扩展性分布式容错 等特性。

Cluster集群模式的原理

通过数据分片的方式来进行数据共享问题,同时提供数据复制和故障转移功能。之前的两种模式数据都是在一个节点上的,单个节点存储是存在上限的。集群模式就是把数据进行分片存储,当一个分片数据达到上限的时候,就分成多个分片

数据分片

集群的键空间被分割为16384个slots(即hash槽),通过hash的方式将数据分到不同的分片上的。 CRC16是一种循环校验算法,这里不是我们研究的重点,有兴趣可以看看。这里用了位运算得到取模结果,位运算的速度高于取模运算。

image.png

读请求分配给slave节点,写请求分配给master,数据同步从master到slave节点。

读写分离提高并发能力,增加高性能。

水平扩展:

master节点可以做扩充,数据迁移redis内部自动完成。当你新增一个master节点,需要做数据迁移,redis服务不需要下线。

举个栗子:上面的有三个master节点,意味着redis的槽被分为三个段,假设三段分别是0-7000,7001-12000、12001-16383。现在因为业务需要新增了一个master节点,四个节点共同占有16384个槽。槽需要重新分配,数据也需要重新迁移,但是服务不需要下线。redis集群的重新分片由redis内部的管理软件redis-trib负责执行。redis提供了进行重新分片的所有命令,redis-trib通过向节点发送命令来进行重新分片。

假如上图中红色的节点故障了,此时故障节点master下面的从节点会通过 选举 产生一个主节点替换原来的故障节点,此过程和哨兵模式的故障转移是一样的。

常见问题

1、Sentinel节点为什么是至少三个且奇数个?

首先必须是集群,所以不能是1个。而选举过程要大多数同意才行(即最少一半+1个),而奇数个节点在同样选举条件上可以节省一台机器。

比如一共5台,有3台同意了就行;而4台,大多数同意也要3台。

2、Redis集群节点数为什么至少是6个?

6个包含一主一从,如果每个节点一主二从则需要9个

最少3个节点,是因为容错能力相同情况下,奇数节点更节省资源(3个节点的集群允许一个节点宕机;而4个节点的集群也允许一个节点宕机)。

3、为什么Redis Cluster槽位设计成16384个?

2^14=16384,当槽位再扩就是32768、65536,此时每一次ping都要将槽位作为心跳包,信息太大,占用带宽 由于集群节点越多,心跳包携带的数据就越多。

当节点超过1000,会导致网络拥堵。因此Redis作者不建议Redis Cluster节点数量超过1000,那么16384槽位也足够用。