问题描述
Redis作为内存型数据库,通常CPU并不会成为性能瓶颈,但是如果因为使用不当,那么也会出现CPU利用率高的问题影响处理效率。
常见的引起Redis CPU利用率高的可能原因包括:
1. 运行时间复杂度高的命令
2. 热点Key的大量访问导致负载高
3. 超出预期的访问请求量
解决方案
场景一:通过腾讯云Redis云监控查看到QPS突增导致的CPU负载高
评估增加的业务请求是否符合预期,如果是预期内正常的请求增加,那么建议通过集群水平扩展来增加CPU处理能力。
常见两种水平扩展的方式:增加分片数量或者增加只读副本数量。
1. 写请求增加的场景或者对数据一致性要求高的场景,增加集群分片数量
- 标准版本优先评估升级至集群版本
具体实施办法请查看专栏文章的解决方案步骤一标准版本Redis升级集群版本
- 集群版本增加分片数量
具体实施办法请查看专栏文章的解决方案步骤二Redis集群版本添加分片
2. 读请求增加的场景,开启读写分离并增加只读副本数量来获得读扩展能力
- 开启读写分离
- 增加只读副本
2.1 开启读写分离
2.1.1 注意事项:
- 开启读写分离可能会导致数据读取不一致(副本节点数据延后于主节点),请业务优先确定接受可能的读数据不一致行为。
- 跨可用区部署的实例开启读写分离后,读请求会引入跨区访问延迟,请提前评估。
2.2.2 前提条件:
- 数据库实例版本为4.0及其以上。
- 数据库实例状态为运行中。
2.2.3 实施步骤:
- 在控制台-实例详情-节点管理页面,右上角开启副本只读开关。
- 参考如下参数说明,来勾选只读路由策略。
只读路由策略:
默认为副本节点,系统账号的所有读请求均发往副本节点。
同时勾选副本节点和主节点,系统账号的读请求将发往主节点和副本节点。
只读本地节点:当实例为多可用区部署时,显示该参数。指就近访问功能,固定为已禁用。可在控制台参数配置页面配置参数 read-local-node-only 来开启和关闭该功能。
- (可选)创建业务用的自定义只读账号。
基于客户的业务需求,来创建自定义的只读账号,查看如下参数说明来创建自定义的只读账号。
自定义账号的鉴权方式为账号名@密码,作为访问 Redis 的密码参数。
命令权限:
勾选只读权限,表示账号只有读取数据的权限,无修改数据的权限。
如果勾选读写权限,表示账号具有读和写数据的权限。
只读路由策略:
将指定账号的读请求分发到仅副本节点或者/和主节点。
没有开通副本只读的实例,不支持路由到副本节点。
存在访问副本节点账号的实例,不允许关闭副本只读功能。
- (可选)针对跨可用区部署的Redis实例,评估开启【只读本地节点】参数。
功能说明:
只读本地节点开启后,会自动就近访问,来避免跨区的访问延迟:负载均衡集群能够感知同可用区的 Proxy,并且在本可用区有 Proxy 节点可以访问的情况下,只访问本可用区的 Proxy。Redis 节点内置了可用区信息,Proxy 节点通过查询 Redis 节点的地理位置,将读请求路由到同可用区的节点。
优先级说明:
在开启就近访问的情况下,当就近访问策略与只读路由策略冲突时,优先读同可用区,然后再依照只读路由策略执行。
因此,针对跨区部署的实例,为了达到扩展只读能力的目的,建议在业务所在可用区均增加副本数量。具体增加的实施步骤请查看2.2 章节。
开启【只读本地节点】实施方法:
在实例详情页面-参数配置页面,选择参数read-local-node-only,修改为yes表示开启【只读本地节点】,no表示关闭,然后勾选对号确定修改即可。
2.2 增加只读副本数量
腾讯云Redis每个分片支持1-5副本部署,基于实例读业务的需求,在目标可用区部署新的副本即可。
【注意事项】增加副本会执行bgsave操作。
实施方法:
- 在腾讯云控制台-实例列表页面,选择【配置变更】-【增加副本】发起任务。
- 阅读变更影响。
- 选择目标副本数量和副本/副本组所在的可用区,确认费用,点击【确认】即可。
针对单可用区实例,在当前可用区添加副本即可;针对多可用区实例,基于就近访问原则来评估新增副本所在的可用区。
场景二:通过腾讯云Redis云监控查看到突发热点Key大量访问导致单个分片CPU突增
热点Key的场景通常无法单纯通过水平扩展的方式来降低CPU,需要把热点Key 拆分到不同的分片,来降低单个分片的CPU负载。
1.获取异常热Key
- 在腾讯云Redis控制台-系统监控页面,分析TOP 10 热 Key;例如下图获取实时热Key。
- 或者在DBbrain-诊断优化-延迟分析-热Key分析页面获取TOP热Key。
2. 对热Key进行拆分
具体拆分方法由客户基于数据结构和业务逻辑来处理。以哈希类型为例,该热 Key 的类型是一个二级数据结构,该哈希元素个数可能较多,可以考虑将当前 hash 进行拆分。
场景三:查看到异常大Key访问导致个别分片CPU突增
通过大Key 拆分到不同的分片,降低单个分片的CPU负载。
- 获取异常大Key
DBbrain-异常诊断-内存分析创建及时大key分析或者查看历史的大Key分析结果。
2.基于数据结构和业务逻辑做大Key拆分
例如将Value过大的Key拆分成多个 key-value,将操作压力平摊到多个分片。
场景四:通过腾讯云Redis 慢查询查看到高复杂命令导致节点CPU利用率高
- 查看Redis慢日志获取耗时长的命令
Redis慢查询统计的是Cache节点上运行命令超过【slowlog-log-slower-than】参数值的命令,通常由于命令复杂度高导致。
或者DBbrain-诊断优化-慢日志分析-实例页面获取Redis慢查询。
2. 由客户基于业务逻辑针对获取到的复杂命令进行优化。