在云数据库Redis集群版和读写分离版的架构中,代理服务器(proxy)承担着路由转发、负载均衡与故障转移等职责。本节介绍proxy的路由转发规则以及proxy处理只读节点异常和特殊命令方法。
说明 由于proxy的演进,集群中proxy的绝对个数并不完全代表proxy处理能力,阿里云会保证集群规格中proxy的配比符合规格说明的要求。
Redis集群版中proxy的路由转发规则
- 基础转发规则
- 对于需要操作单个key的命令,proxy会根据key所属的slot将请求发送给储存着该slot的数据分片。
- 对于需要操作两个或以上key的命令,如果这些key是储存在不同分片中的,proxy会将命令拆分成多个命令分别发送给对应的分片。该类命令的详细信息请参见Redis命令支持概览。
- 发布订阅命令转发规则
对于
PUBLISH、
SUBSCRIBE等发布订阅命令,Proxy会根据channel name进行hash计算,并分配至对应数据节点。说明 您可以在控制台的性能监控页面选择
数据节点,然后将自定义监控项设置为
Pub/Sub监控组,即可查看各数据分片(默认展示第一个数据分片)中发布与订阅(Pub/Sub)相关命令的监控信息。具体操作,请参见
自定义监控项。 - 指定了idx参数的命令的转发规则
在使用阿里云自研的集群命令,例如IINFO、ISCAN、IMONITOR、iMEMORY时,如果通过idx参数指定了分片ID,proxy会将这些命令发送到指定的数据分片。该类命令的详细信息请参见Redis命令支持概览。
Redis读写分离版中proxy的路由转发规则
- 基础转发规则
- proxy将写命令直接转发到master节点。
- proxy将读命令根据权重发送到master节点和只读节点,所有节点的权重相同。例如,如果实例有5个只读节点,proxy会将所有读命令平均发送到包括master节点和只读节点在内的6个节点,每个节点的比重都是1/6。
说明
SLOWLOG和
DBSIZE也属于读命令。
- 发送到master节点
proxy会将以下命令发送到master节点:
- 事务命令MULTI和EXEC。
- Lua脚本命令EVAL和EVALSHA。
- SCAN和INFO。
- 发布订阅相关命令,包括PUBLISH、SUBSCRIBE等。
- 发送到第一个只读节点
proxy会将HSCAN、SSCAN、ZSCAN命令发送到第一个只读节点。在没有正常运行的只读节点时,这些命令会被发送到master节点。
- 发送到指定只读节点
proxy会根据读写分离版专属命令RIINFO、RIMONITOR、RIMEMORY中idx参数和ro_slave_idx参数的设置,将命令发送到相应的只读节点。其中idx用于在集群版读写分离实例中指定数据分片,ro_slave_idx用于在任意读写分离实例中指定只读节点。读写分离版专属命令的详细说明请参见Redis命令支持概览。
proxy下线只读节点
proxy实时感知每个只读节点的状态,在以下情况中,proxy将暂时下线相应的只读节点。
- 探测到只读节点异常时,proxy会自动降低该节点的服务权重。如果该只读节点连续连接失败超过一定次数,proxy会停止该节点的服务,待异常被修复后重新启用该节点。
- 探测到只读节点处于全量同步过程中时,proxy会暂时下线该节点,直到同步完成。
proxy对特殊命令的处理方式
一般情况下,proxy与后端数据分片会创建长连接处理用户请求。但是,如果请求中包含以下命令,proxy会根据命令的处理需求,在相应的数据分片创建额外的连接来处理后续请求。
- 阻塞类命令:BRPOP、BRPOPLPUSH、BLPOP、BZPOPMAX、BZPOPMIN。
- 事务类命令:MULTI、EXEC、WATCH。
- MONITOR类命令:MONITOR、IMONITOR、RIMONITOR。
- 订阅命令:SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE。
说明
- 每个数据分片的连接数上限为10000,请合理使用上述命令,避免连接数超限。
- 同时在多个db进行SCAN操作也会创建大量新连接,请注意避免连接数超限。