在云数据库 Tair(兼容 Redis)集群架构和读写分离架构中,代理服务器(Proxy)承担着路由转发、负载均衡和故障转移等职责,可以帮助您简化客户端的逻辑,同时支持多数据库(DB)、缓存热点数据等高级功能。通过了解Proxy的路由转发规则和特定命令的处理方式,有助于您设计更高效的业务系统。
Proxy介绍
代理服务器(Proxy)是Tair实例中的一个组件(单节点架构),不会占用数据分片的资源,通过多个Proxy节点实现负载均衡及故障转移。
Proxy能力 | 说明 |
集群版使用模式转换 | Proxy能够实现架构转换,帮助您如同在使用标准架构一样地使用集群架构。Proxy支持对DEL、EXISTS、MGET、MSET、SDIFF与UNLINK等命令进行跨Slot的多Key操作,更多信息请参见代理模式(Proxy)支持的命令列表。 当标准架构无法支撑业务发展时,您无需修改代码即可将标准架构的数据迁移至带有Proxy的集群架构,大幅度降低业务改造成本。 |
负载均衡和路由转发 | Proxy与后端的数据分片建立长连接,负责请求负载均衡和路由转发操作,关于转发规则的介绍,请参见Proxy的路由转发规则。 |
管理只读节点流量 | Proxy会实时探测只读节点的状态,当出现下述情况时,Proxy会执行流量管控动作:
|
开启代理查询缓存功能(Proxy Query Cache)后,Proxy会缓存热点Key对应的请求和返回信息,当在有效时间内收到同样的请求时直接返回结果至客户端,无需和后端的数据分片交互,可更好地改善对热点Key的发起大量读请求导致的访问倾斜。 说明 您可以设置query_cache_enabled参数开启该功能,仅Tair内存型、持久内存型实例支持该功能。 | |
支持多数据库(DB) | 集群模式下,原生Redis和Cluster client均不支持多数据库(DB)功能,只使用默认的 说明 若您使用StackExchange.Redis客户端,请使用StackExchange.Redis 2.7.20及以上版本,否则会产生报错,更多信息请参见StackExchange.Redis升级公告。 |
由于Proxy的演进,Proxy的个数并不完全代表Proxy处理能力,阿里云会保证集群规格中Proxy的配比符合规格说明的要求。
Proxy的路由转发规则
关于各类命令的介绍,请参见命令概览。
架构 | 转发规则 | 说明 |
集群架构 | 基础转发规则 |
|
特定命令转发规则 |
| |
读写分离架构 | 基础转发规则 |
|
特定命令转发规则 |
|
代理查询缓存
代理节点支持缓存:包含热点Key的请求和对应查询结果。当Proxy在缓存有效期内收到同样请求时,将直接返回结果至客户端,无需和后端的数据分片交互。本功能可缓解或预防热点Key读请求引发的访问性能倾斜问题。
此热点Key与Top Key统计功能中的热Key(QPS)一致,由数据库内核根据排序和统计算法进行识别。默认为Key的QPS超过5000,也可以通过
bigkey-threshold
参数自定义阈值。若热点Key在缓存有效期内被修改,其修改结果不会同步至缓存中。即后续请求可能会读到缓存中的脏数据,直至缓存失效。对此,您可以根据实际情况缩短缓存有效期。
Proxy节点并不缓存整个热点Key,而是缓存包含热点Key的请求和对应查询结果。
本功能仅支持Tair内存型、持久内存型实例,且实例为集群架构代理模式或读写分离架构。
应用场景
适用于热搜榜单、大V用户信息、游戏公告等场景,应用程序能够容忍稍旧的数据。
功能架构
使用方法
本功能默认关闭,您可以设置query_cache_enabled参数开启该功能。
查看使用方法详细说明
您可以通过Tair自研的QUERYCACHE KEYS、QUERYCACHE INFO、QUERYCACHE LISTALL命令,查看代理查询缓存的使用情况。
查看使用情况
连接数使用说明
通常情况下,Proxy通过与数据分片建立长连接来处理请求。当请求中包含以下命令时,Proxy会根据命令的处理需求在相应的数据分片上创建额外的连接,此时连接无法聚合,实例的最大连接数和每秒新建连接数都会受到数据节点单个分片的限制(单个分片的限制请参见具体的实例规格)。您需要合理使用下述命令,避免连接数超限。
代理模式下,Redis社区版实例每个数据分片的连接数上限为10,000,Tair(企业版)实例每个数据分片的连接数上限为30,000。
阻塞类命令:BRPOP、BRPOPLPUSH、BLPOP、BZPOPMAX、BZPOPMIN、BLMOVE、BLMPOP、BZMPOP。
事务类命令:MULTI、EXEC、WATCH。
MONITOR类命令:MONITOR、IMONITOR、RIMONITOR。
订阅命令:SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE、SSUBSCRIBE、SUNSUBSCRIBE。
常见问题
Q:是否支持将只进行读操作的Lua脚本转发至只读节点吗?
Q:代理(Proxy)模式和直连模式有什么区别,推荐使用什么模式?
A:推荐使用代理模式,介绍与区别如下:
代理模式:客户端的请求由代理节点转发至数据分片,可享受代理节点带来的负载均衡、读写分离、故障转移、代理查询缓存、长连接等特性能力。
直连模式:可通过直连地址绕过代理,直接访问后端的数据分片(类似连接原生Redis集群)。相比代理模式,直连模式节约了通过代理处理请求的时间,可以在一定程度上提高Redis服务的响应速度。
Q:为什么控制台上只有一个数据分片的Pub/Sub监控组有数值显示,而其他分片没有?
A:Proxy会根据channel name进行Hash计算,并路由至对应数据分片,所以在channel数量较少或仅有1个的情况下,仅会路由到一个数据分片上。
如果Pub/Sub的路由仅集中在一个数据分片上,当channel的数据量和流量较大时,会造成该数据分片的CPU使用率和出入流量明显高于其他分片,从而造成资源使用不均衡。
建议多发布几个不同名称的channel,以便Proxy根据Hash计算将channel平均地分布于各个数据分片中。
Q:是否支持将只进行读操作的Lua脚本转发至只读节点吗?
Q:如果后端的某个数据分片出现异常,对数据读写有什么影响?
A:如果您的实例为集群版-单副本,由于仅具有主节点,无法保障数据可用性和服务连续性。推荐选择集群架构,数据分片均采用主备高可用架构,当主节点发生故障后,系统会自动进行主备切换保证服务高可用。在某些极端场景下某个数据分片出现异常后,对数据的影响及优化方案如下。
场景
影响与优化方案
图 1. 多Key命令场景
影响:
客户端通过4个连接发送4个请求,当数据分片2处于异常状态时,仅有请求1(GET Key1可正常读取到数据),其他请求会访问到数据分片2会返回超时。
优化方案:
降低多Key命令(例如MGET)的使用频率,或降低一次请求中包含的Key的数量,避免因单个数据分片异常导致该请求全部返回失败。
降低事务类命令的使用频率或降低事务大小,避免因某个子事务失败导致整个事务失败。
图 2. 单连接场景
影响:
客户端通过1个连接分别发送2个请求,当数据分片2处于异常状态时,请求2(GET Key2)将返回超时,同时由于请求1(GET Key1)和请求2共用同一连接,导致请求1也无法正常返回。
优化方案:
避免或降低对pipeline的使用。
避免使用单连接的客户端,推荐使用连接池的客户端,例如客户端程序连接教程(需设置合理的超时时间和连接池大小)。