高可用

所谓的高可用,也叫HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
如果在实际生产中,Redis只部署一个节点,当机器故障时,整个服务都不能提供服务了,这就是单点故障。而如果Redis部署了多台,当一台或几台故障时(没有全部故障),整个系统依然可以对外提供服务,这样就提高了服务的可用性。

名称 概述
主从模式 master 节点挂掉后,需要手动指定新的 master,可用性不高,基本不用。
哨兵模式 master 节点挂掉后,哨兵进程会主动选举新的 master,可用性高,但是每个节点存储的数据是一样的,浪费内存空间,数据容量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。
集群模式 数据容量比较大,QPS 要求较高的时候使用。 Redis Cluster 是 Redis 3.0 以后才正式推出,目前在大规模生产环境下的成功案例还不多,需要时间检验。

主从模式

主从模式将Redis节点分为两类:

  • 主节点(master):只能有一个,可以进行读、写操作,并且将写操作同步给从节点。
  • 从节点(slave):可以有多个,只能进行读操作,主节点会将写操作同步给从节点。

image.png
系统运行时,如果 master 挂掉了,可以使用slaveof no one命令将一个从库(如 slave1)变成新的 master;同时在 slave2 和 slave3 节点执行slaveof 192.168.1.11 6379命令,将这两个从节点指向的这个新的 master;当挂掉的节点恢复后,作为从节点指向新的 master。

  1. # 配置主节点的ip和端口
  2. slaveof 192.168.1.10 6379
  3. # 从redis2.6开始,从节点默认是只读的
  4. slave-read-only yes
  5. # 假设主节点有登录密码,是123456
  6. masterauth 123456

主从节点之间通过快照进行数据同步。
1646296006(1).jpg

优点

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

    缺点

  • 不具备自动容错和恢复功能,主机从机的宕机都会导致读写请求失败,需要手动恢复。

  • 主机宕机还会引入数据不一致的问题,降低了系统的可用性。(部分数据未能及时同步到从机)
  • 当多个 Slave 同时重启,可能导致Master IO剧增而宕机。因为只要 Slave 启动,就会发送 sync 请求和主机全量同步。
  • 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
  • 主节点和从节点中的数据是重复的,降低了内存利用率。

    哨兵模式

    主从模式有一个硬伤,当主节点宕机后需要人工恢复,还会造成一段时间内服务不可用。而实际生产中这种情况不能满足高可用性,哨兵模式很好的解决了这一问题。
    哨兵模式基于主从模式,又提供了哨兵进程(命令redis-sentinel)。哨兵是一个独立进程,可以有多个。多个哨兵构成一个哨兵集群,哨兵之间也会互相通信确认心跳(一般需要启动多个哨兵)。

  • 哨兵通过发送ping命令监控Master和Slave的运行状态。

  • 当哨兵检测到Master宕机,哨兵集群会自动进行决策选举新的Master,并将其他从节点指向新的主节点。

image.png
首先启动主节点,然后一台一台启动从节点。主从节点启动完成后,使用redis-sentinel /path/to/sentinel.conf命令启动哨兵,哨兵进程的配置如下。

  1. # 禁止保护模式
  2. protected-mode no
  3. # 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,
  4. #192.168.1.10代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
  5. sentinel monitor mymaster 192.168.1.10 6379 2
  6. # sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
  7. sentinel auth-pass mymaster 123456

优点

  • 具有主从模式的优点。(哨兵模式基于主从模式)
  • 哨兵模式中,主从可以自动切换,系统更健壮,可用性更高。(主从需要人工干预)

    缺点

  • 具有主从模式的缺点。

  • 哨兵也存在宕机的可能,所以需要部署哨兵集群,使复杂度增加。

    集群模式

    集群模式实现了Redis分布式存储,对数据进行分片,使每个节点上存储分片数据,同时也不再需要哨兵。官方推荐至少部署3台以上的主节点,采用3主3从的模式(1主1从成对)。虽然部署多个主节点,但对于客户端来说Redis集群是一个整体。
    为了保证高可用,集群模式引入了主从复制模型,即一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
    image.png
    集群模式的节点配置如下。
    1. # 开启redis的集群模式
    2. cluster-enabled yes
    3. # 配置集群模式下的配置文件名称和位置,redis-cluster.conf这个文件是集群启动后自动生成的,不需要手动配置。
    4. cluster-config-file redis-cluster.conf
    将3主3从启动成功之后,还需要借助官方提供的集群管理工具redis-tri.rb将这6个节点创建为一个集群。 ```shell

    | 机器名称 | IP | 端口 |

    | master 1 | 192.168.1.11 | 6379 |

    | master 2 | 192.168.1.12 | 6379 |

    | master 3 | 192.168.1.13 | 6379 |

    | slave 1 | 192.168.1.21 | 6379 |

    | slave 2 | 192.168.1.22 | 6379 |

    | slave 3 | 192.168.1.23 | 6379 |

    创建集群的指令

    redis-trib.rb create —replicas 1 192.168.1.11:6379 192.168.1.21:6379 192.168.1.12:6379 192.168.1.22:6379 192.168.1.13:6379 192.168.1.23:6379

    Performing hash slots allocation on 6 nodes… Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.1.21:6379 to 192.168.1.11:6379 Adding replica 192.168.1.22:6379 to 192.168.1.12:6379 Adding replica 192.168.1.23:6379 to 192.168.1.13:6379 M: 80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.1.11:6379 slots:[0-5460] (5461 slots) master S: b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.1.21:6379 replicates 6788453ee9a8d7f72b1d45a9093838efd0e501f1 M: 4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.1.12:6379 slots:[5461-10922] (5462 slots) master S: b6331cbc986794237c83ed2d5c30777c1551546e 192.168.1.22:6379 replicates 80c80a3f3e33872c047a8328ad579b9bea001ad8 M: 6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.1.13:6379 slots:[10923-16383] (5461 slots) master S: 277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.1.23:6379 replicates 4d74ec66e898bf09006dac86d4928f9fad81f373 Can I set the above configuration? (type ‘yes’ to accept): yes #输入yes,接受上面配置 Nodes configuration updated Assign a different config epoch to each node Sending CLUSTER MEET messages to join the cluster

redis-cli -c -h 192.168.1.11 -p 6379 -a 123456 # -c,使用集群方式登录。 192.168.1.11:6379> CLUSTER INFO #集群状态。 192.168.1.11:6379> CLUSTER NODES #列出节点信息。 ``` Redis 集群没有使用一致性 hash,而是引入了哈希槽概念(hash slot)。Redis 集群共有16384 个哈希槽,每个 key 通过运算来决定放置哪个槽(CRC16 校验后对 16384 取模)。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

  • 节点 A 包含 0 到 5460 号哈希槽
  • 节点 B 包含 5461 到 10922 号哈希槽
  • 节点 C 包含 10923 到 16383 号哈希槽

    优点

  • 采用去中心化思想,数据按照slot分布式存储在多个节点,节点间数据共享,可动态调整数据分布。

  • 节点可动态添加或删除,可扩展到1000多个节点。
  • 当部分节点不可用时,集群仍可用,并且能够自动恢复。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升;

    缺点

  • 故障恢复依靠Goss协议(谣言传播),存在消息延时和消息冗余的问题。节点数量过多的时候,节点之间需要不断进行ping通讯,占用大量网络资源。

  • 当Master1和其对应的Slave节点都宕机了,那么该节点就无法再提供服务了。
  • 动态扩容缩容的过程需要人工介入,在操作中需要进行数据迁移。

    参考文献

    redis 系列之——高可用(主从、哨兵、集群)
    [Redis] 你了解 Redis 的三种集群模式吗?