Redis高可用与集群

文章目录

  • Redis高可用(Sentinel、哨兵)
    • 启动并初始化
    • 获取服务器信息
      • 获取主服务器信息
      • 获取从服务器信息
    • 检查服务器在线状态
      • 选举领导Sentinel
      • 故障转移
  • 集群
    • 节点
    • 槽指派
    • 重新分片
    • 复制与故障转移
      • 故障转移
      • 选举新的主节点


Redis高可用(Sentinel、哨兵)

sentinel(哨兵)是Redis实现高可用的解决方案:由一个或多个sentinel组成sentinel集群,

可以监视任意多个主服务器,以及每个主服务器下的从服务器。当主服务器下线之后,自动将某个从服务器提升为主服务器。

  1. 当主服务器超过用户设定的下线时长,则sentinel会从主服务器下的从服务器中挑选一条成为主服务器。
  2. sentinel向其他所有从服务器发新的复制命令,让它们成为新的主服务器的从服务器,以实现故障转移。
  3. sentinel会继续监视已下线的主服务器,当它重新上线将它设置为新的主服务器的从服务器。

启动并初始化

sentinel是一个特殊模式的Redis服务器,

  1. 初始化服务器
  2. 将普通Redis服务器使用的代码切换成Sentinel专用代码
  3. 初始化Sentinel状态
  4. 根据给定的配置文件,初始化Sentinel的监视主服务器列表
  5. 创建连向主服务器的网络连接:命令连接与订阅连接

获取服务器信息

获取主服务器信息

Sentinel默认以每隔十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令返回消息来获取主服务器信息。

  1. 主服务器本身信息,包括服务器运行ID以及服务器角色。
  2. 主服务器下的从服务器信息,包括IP、端口等信息。

获取从服务器信息

Sentinel发现主服务器有新的从服务器出现时,除了创建对应实例还会创建命令连接与订阅连接。

如果已创建连接则忽略,创建连接之后Sentinel会默认以每隔10秒发送INFO命令。返回信息如下。

  1. 从服务器的运行ID与角色
  2. 从服务器的主服务器IP与端口
  3. 从服务器的优先级(当主服务器下线,优先级越高会被优先选择为主服务)。
  4. 从服务器的复制偏移量()。

检查服务器在线状态

Sentinel默认会以每隔一秒的频率向所有与它创建了命令连接的实例(主服务器,从服务器、其他Sentinel)发送PING命令,通过PING回复消息判断实例是否在线。

当返回消息超过指定限制时间、或是返回消息不是+PONG、-LOADING、-MASTERDOWN。判断为实例失效即主管下线。

当Sentinel为集群时,其中一个Sentinel判断一个服务器为主管下线之后,会到其他Sentinel服务器询问是否是主观下线,当其他Sentinel返回消息足够多(根据Sentinel配置的quorum设定)是主观下线。则Sentinel会判断主服务器下线,并对主服务器执行故障转移操作。

选举领导Sentinel

当主服务器判断为客观下线,监视主服务器的所有Sentinel会进行协商,选举一个领导Sentinel,并由领导Sentinel对下线主服务器执行故障转移操作。

  1. 所有监视这个主服务器的Sentinel都有可能称为领导Sentinel。
  2. 每次领导Sentinel选举,不论是否成功,所有Sentinel的配置纪元的值自增一次。
  3. 判断客观下线的Sentinel会要求其他Sentinel将其设置为局部领导Sentinel。
  4. Sentinel设置领导Sentinel是采用先到先得,设置完局部领导Sentinel后会拒绝之后所有类似请求,并返回自己设置的局部领导Sentinel和自己的运行ID。
  5. 领导Sentinel需要半数以上Sentinel将其设置为领导Sentinel才会有效,如果无效则开启下一轮。

故障转移

选举产生领导Sentinel之后,领导Sentinel会对下线主服务器执行故障转移操作。

  1. 从已下线主服务器的从服务器列表中,选取一个作为主服务器。
  2. 将已下线主服务器的从服务器的主服务器替换为新的主服务器地址。

集群

Redis集群是Redis提供分布式数据库方案,通过集群分片来进行数据共享并提供复制和故障转移功能。

节点

Redis集群通常是有多个节点组成,刚开始是每个节点是相互独立的,通过命令CLUSTER MEET 来构成集群。查看集群节点命令CLUSTER NODES

槽指派

集群中整个数据库被分为16384个槽,当所有槽都有节点处理时,集群处于上线状态,否则处于下线状态。槽指派命令CLUSERT ADDSOLTS [slot....]

每个节点都会记录所有槽信息,通过计算槽位置之后,判断如果是自己处理的则自己处理,不是则转发到对应的节点去处理。

计算槽命令CLUSTER KEYSLOT "key"

重新分片

将Redis集群中任意数量已经指派给某个节点的槽更改为指派另一个节点,相关槽属性的键值对也会从源节点移动到目标节点。

复制与故障转移

Redis集群中的节点分为主节点和从节点,从节点主要是负责主节点的信息。当主节点下线时,从节点代替主节点继续执行命令。

设置从节点命令CLUSTER REPLICATE

集群中每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果半数以上的节点将其标记下线,则会广播其他节点这个节点已下线,并选举其中一个从节点作为主节点,继续完成任务。

故障转移

  1. 从下线节点中的从节点选取一个节点(执行 SLAVEEOF no one命令)作为主节点。
  2. 新的主节点撤销已下线的槽指派,并将这些指派全部指向自己。
  3. 新的主节点想集群中广播一条PONG消息,让其他节点知道这个节点已经更改主节点了,并由这个节点接管已下线节点的槽指派。
  4. 新的主节点开始接收和自己负责处理槽有关的请求命令,故障转移完成。

选举新的主节点

  1. 集群中的配置纪元是一个自增计数器,初始值为0.
  2. 当集群中的某个节点开始一次故障转移操作是,集群配置纪元值都会自增一。
  3. 集群中每个负责处理槽的主节点都有一次投票集合,而第一个想主节点要求投票的从节点将获取主节点的投票。
  4. 当从节点发现自己自己的主节点已经进入下线状态是,从节点会向集群中广播一条CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST消息,要求所有接收到这条消息、并且具有投票的主节点想这个从节点投票。
  5. 如果一个主节点具有投票权,并且这个主节点尚未投票给其他从节点,那么主节点将向要求投票的从节点返回一条CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,表示这个逐个主节点支持从节点成为新的主节点。
  6. 每个参与选举的从节点会根据接收CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,并根据自己接收到多少条这样消息来统计自己获取了多少主节点的支持。
  7. 如果集群总有N个具有投票的主节点,那么当一个从节点收集当半数以上的支持票,这个从节点就会被选举为新的主节点。
  8. 因每个配置纪元里面,每个具有投票全的主节点只能投一次票,所以如果有N个节点进行投票,那么大于半数以上张支持票的从节点有且只有一个,确保主节点只有一个。
  9. 如果在一个配置纪元里面没有从节点能够收集到半数以上的支持票,那么就进入一个新的配置纪元,开始重新选举,知道选举出新的主节点为止。

你可能感兴趣的:(运维,redis,服务器,数据库)