云数据库 Tair(兼容 Redis)拥有极强的性能,阿里云结合多年的运维经验,从业务部署、Key的设计、SDK、命令、运维管理等维度展示云数据库 Tair(兼容 Redis)开发运维规范,为您设计高效的业务系统提供参考,帮助您充分发挥Tair的能力。
了解Tair性能边界
资源类别 | 说明 |
计算资源 | 使用通配符、Lua并发、1对多的PUBSUB、热点Key等会大量消耗计算资源,集群架构下还会导致访问倾斜,无法有效利用所有数据分片。 |
存储资源 | Streaming慢消费、大Key等会占用大量存储资源,集群架构下还会导致数据倾斜,无法有效利用所有数据分片。 |
网络资源 | 扫描全库(KEYS命令)、大Value、大Key的范围查询(如HGETALL命令)等会消耗大量的网络资源,且极易引发线程阻塞。 重要 Tair的高并发能力不等同于高吞吐能力,例如将大Value存在Tair里以期望提升访问性能,此类场景往往不会有特别大的收益,反而会影响Tair整体的服务能力。 |
集群架构下,热点Key、大Key或大Value等还会引发 存储或访问倾斜 ,在生产环境中,您应当避免触达Tair的性能边界。
业务部署规范
重要程度 | 规范 | 说明 |
★★★★★ | 确定使用场景为 高速缓存 或 内存数据库 。 |
|
★★★★★ | 就近部署业务,例如将业务部署在同一个专有网络VPC下的ECS实例中。 | Tair具备极强的性能,如果部署位置过远(例如业务服务器与Tair实例通过公网连接),网络延迟将极大影响读写性能。 说明 针对多地部署应用的场景,您可以通过全球多活功能,借助其提供的跨域复制(Geo-replication)能力,快速实现数据异地灾备和多活,降低网络延迟和业务设计的复杂度。更多信息,请参见Tair全球多活简介。 |
★★★★☆ | 为每个业务提供单独的Tair实例。 | 避免业务混用,尤其需要避免将同一Tair实例同时用作高速缓存和内存数据库业务。带来的影响例如针对某个业务淘汰策略设置、产生的慢请求或执行FLUSHDB命令影响将扩散至其他业务。 |
★★★★☆ | 设置合理的过期淘汰策略。 | Tair默认的默认逐出策略为 volatile-lru ,关于各逐出策略的说明,请参见Redis开源版配置参数列表。 |
★★★☆☆ | 合理控制压测的数据和压测时间。 | Tair不会对您压测的数据执行自动删除操作,您需要自行控制压测数据的数据量和压测时间,避免对业务造成影响。 |
Key设计规范
重要程度 | 规范 | 说明 |
★★★★★ | 设计合理的Key中Value的大小,推荐小于10 KB。 | 过大的Value会引发数据倾斜、热点Key、实例流量或CPU性能被占满等问题,应从设计源头上避免此类问题带来的影响。 |
★★★★★ | 设计合理的Key名称与长度。 |
|
★★★★★ | 对于支持子Key的复杂数据结构,应避免一个Key中包含过多的子Key(推荐低于1,000)。 说明 常见的复杂数据结构例如Hash、Set、Zset、Geo、Stream及Tair(企业版)特有的exHash、Bloom、TairGIS等。 | 由于某些命令(例如HGETALL)的时间复杂度直接与Key中的子Key数量相关。如果频繁执行时间复杂度为O(N)及以上的命令,且Key中的子Key数量过多容易引发慢请求、数据倾斜或热点Key问题。 |
★★★★☆ | 推荐使用串行化方法将Value转变为可读的结构。 | 由于编程语言的字节码随着版本可能会变化,如果存储裸对象(例如Java Object、C#对象)会导致整个软件栈升级困难,推荐使用串行化方法将Value变成可读的结构。 |
SDK使用规范
重要程度 | 规范 | 说明 |
★★★★★ | 推荐使用JedisPool或者JedisCluster连接实例。 | 如果使用单连接的方式,一旦遇到单次超时则无法自动恢复。关于JedisPool的连接方法,请参见客户端程序连接教程、JedisPool资源池优化和JedisCluster。 |
★★★★☆ | 程序客户端需要对超时和慢请求做容错处理。 | 由于Tair服务可能因网络波动或资源占满引发超时或慢请求,您需要在程序客户端上设计合理的容错机制。 |
★★★★☆ | 程序客户端应设置相对宽松的超时重试时间。 | 如果超时重试时间设置的非常短(例如200毫秒以下),可能引发重试风暴,极易引发业务层雪崩。更多信息,请参见Redis客户端重连指南。 |
命令使用规范
重要程度 | 规范 | 说明 |
★★★★★ | 避免执行范围查询(例如KEYS *),使用多次单点查询或SCAN命令来获取延迟优势。 | 执行范围查询可能导致服务发生抖动、引发慢请求或产生阻塞。 |
★★★★★ | 推荐使用扩展数据结构(数据结构模块集成)实现复杂功能,避免使用Lua脚本。 | Lua脚本会占用较多的计算和内存资源,且无法被多线程加速,过于复杂或不合理的Lua脚本可能导致资源被占满的情况。 |
★★★★☆ | 合理使用管道(pipeline)降低链路的往返时延RTT(Round-trip time)。 | 如果有多个操作命令需要被迅速提交至服务器端,且客户端不依赖每个操作返回的结果,那么可以通过管道来作为优化性能的批处理工具,注意事项如下:
|
★★★★☆ | 正确使用Redis命令。 | 使用事务(Transaction)时,需要注意其限制:
|
★★★★☆ | 避免使用Redis命令执行大量的消息分发工作。 | 由于Pub和Sub不支持数据持久化,且不支持ACK应答机制无法实现数据可靠性,当执行大量消息分发工作时(例如订阅客户端数量超过100且Value超过1 KB),订阅客户端可能因服务端资源被占满而无法接收到数据。 说明 为提升性能和均衡性,Tair对Pub和Sub类命令进行了优化,集群架构下,代理节点会根据channel name进行Hash计算,并分配至对应数据节点。 |
运维管理规范
重要程度 | 规范 | 说明 |
★★★★★ | 充分了解不同的实例管理操作带来的影响。 | 在对Tair实例执行变更配置、重启等操作时,实例的状态将发生变化并产生某些影响(例如产生秒级的连接闪断),在操作前您需要充分了解。更多信息,请参见实例状态与影响。 |
★★★★★ | 验证客户端程序的差错处理能力或容灾逻辑。 | Tair支持节点健康状态监测,当监测到实例中的主节点不可用时,会自动触发主备切换,保障实例的高可用性。在客户端程序正式上线前,推荐手动触发主备切换,可帮助您验证客户端程序的差错处理能力或容灾逻辑。具体操作,请参见手动执行主备切换。 |
★★★★★ | 禁用高耗时或高风险的命令。 | 生产环境中,无限制地使用命令可能带来诸多问题,例如执行FLUSHALL会直接清空全部数据;执行KEYS会阻塞Redis服务。为保障业务稳定、高效率地运行,您可以根据实际情况禁用特定的命令,具体操作,请参见禁用高风险命令。 |
★★★★☆ | 及时处理阿里云发起的计划内运维操作(即待处理事件) | 为提供更优质的服务,持续提升产品性能和稳定性,阿里云会不定期地发起计划内运维操作(即待处理事件),对部分实例所属的机器执行软硬件或网络换代升级(例如数据库小版本升级)。当您收到来自阿里云的事件通知后,您可以查看本次事件的影响,根据业务需求评估是否需要调整执行时间。更多信息,请参见查看并管理计划内事件。 |
★★★★☆ | 为核心指标配置监控报警,帮助掌握实例运行状态。 | 为CPU使用率、内存使用率、带宽使用率等核心指标配置监控报警,实时掌握实例运行状态。具体操作,请参见报警设置。 |
★★★★☆ | 通过Tair提供的丰富的运维功能,定期检查实例状态或辅助排查资源消耗异常问题。 |
|
★★★☆☆ | 评估并开启审计日志功能。 | 开通审计日志功能后,可记录写操作的审计信息,为您提供日志的查询、在线分析、导出等功能,助您时刻掌握产品安全及性能情况。更多信息,请参见开通审计日志。 重要 开通审计日志后,视写入量或审计量可能会对Tair实例造成5%~15%的性能损失。如果业务对Tair实例的写入量非常大,建议仅在运维需要(例如故障排查)期间开通审计功能,以免带来性能损失。 |