在云数据库Redis集群版和读写分离版的架构中,代理服务器(proxy)承担着路由转发、负载均衡与故障转移等职责。本节介绍proxy的路由转发规则以及proxy处理只读节点异常和特殊命令方法。

Redis集群版中proxy的路由转发规则

  • 基础转发规则
    • 对于需要操作单个key的命令,proxy会根据key所属的slot将请求发送给储存着该slot的数据分片。
    • 对于需要操作两个或以上key的命令,如果这些key是储存在不同分片中的,proxy会将命令拆分成多个命令分别发送给对应的分片。该类命令的详细信息请参见命令查询导航
  • 发布订阅命令转发规则

    proxy会将PUBLISHSUBSCRIBE等发布订阅命令发送到集群中第一个数据分片的master节点。

    警告 请合理使用发布订阅命令,防止给第一个数据分片的master节点带来过大的性能压力。
  • 指定了idx参数的命令的转发规则

    在使用阿里云自研的集群命令,例如IINFOISCANIMONITORiMEMORY时,如果通过idx参数指定了分片ID,proxy会将这些命令发送到指定的数据分片。该类命令的详细信息请参见命令查询导航

Redis读写分离版中proxy的路由转发规则

  • 基础转发规则
    • proxy将写命令直接转发到master节点。
    • proxy将读命令根据权重发送到master节点和只读节点,所有节点的权重相同。例如,如果实例有5个只读节点,proxy会将所有读命令平均发送到包括master节点和只读节点在内的6个节点,每个节点的比重都是1/6。
      说明 SLOWLOGDBSIZE也属于读命令。
  • 发送到master节点

    proxy会将以下命令发送到master节点:

    • 事务命令MULTIEXEC
    • Lua脚本命令EVALEVALSHA
    • SCANINFO
    • 发布订阅相关命令,包括PUBLISHSUBSCRIBE等。
  • 发送到第一个只读节点

    proxy会将HSCANSSCANZSCAN命令发送到第一个只读节点。在没有正常运行的只读节点时,这些命令会被发送到master节点。

  • 发送到指定只读节点

    proxy会根据读写分离版专属命令RIINFORIMONITORRIMEMORYidx参数和ro_slave_idx参数的设置,将命令发送到相应的只读节点。其中idx用于在集群版读写分离实例中指定数据分片,ro_slave_idx用于在任意读写分离实例中指定只读节点。读写分离版专属命令的详细说明请参见命令查询导航

proxy下线只读节点

proxy实时感知每个只读节点的状态,在以下情况中,proxy将暂时下线相应的只读节点。

  • 探测到只读节点异常时,proxy会自动降低该节点的服务权重。如果该只读节点连续连接失败超过一定次数,proxy会停止该节点的服务,待异常被修复后重新启用该节点。
  • 探测到只读节点处于全量同步过程中时,proxy会暂时下线该节点,直到同步完成。

proxy对特殊命令的处理方式

一般情况下,proxy与后端数据分片会创建长连接处理用户请求。但是,如果请求中包含以下命令,proxy会根据命令的处理需求,在相应的数据分片创建额外的连接来处理后续请求。

  • 阻塞类命令:BRPOPBRPOPLPUSHBLPOPBZPOPMAXBZPOPMIN
  • 事务类命令:MULTIEXECWATCH
  • MONITOR类命令:MONITORIMONITORRIMONITOR
  • 订阅命令:SUBSCRIBEUNSUBSCRIBEPSUBSCRIBEPUNSUBSCRIBE
说明
  • 每个数据分片的连接数上限为10000,请合理使用上述命令,避免连接数超限。
  • 同时在多个db进行SCAN操作也会创建大量新连接,请注意避免连接数超限。