缓存Tair高性能使用规范

缓存Tair高性能使用规范_第1张图片
2x.png

不要短时间大量重复读写相同的key

server端的原理是网络收包后,放入到工作队列(读写队列分离,但都只有一个),再由工作线程从队列中取出进行处理。这里一个问题是,为保证数据的正确性,会对同一个key的读写加锁,而如果存在大量读写同一个key的情况,则势必会阻塞其他线程(锁不慢,锁竞争才慢),导致拖慢整个服务端的处理速度。

不要使用时间戳作为key的一部分,容易导致一段时间内所有流量都访问一台服务端机器,导致服务端压力过大而出现大量超时


Value大小多大合适

value建议不超过50KB,value越大,服务端能承受qps越低,请求耗时越大,当value大小超过1MB时,缓存失效,读写性能将严重受影响


超时时间设置多少合适

普通kv接口:单key请求超时时间建议设置100ms以上,批量请求超时时间建议设置200ms以上

特殊数据结构接口:超时时间建议设置500ms左右


超时是否需要重试

写超时:除非服务端压力过大丢弃请求,否则所有写请求在服务端都会执行成功,只是没有返回结果给客户端,除非业务逻辑依赖数据的强一致性,否则不需要重试

读超时:如果是批量接口,建议设置返回比例(参数为BatchReturnPercent),如果需要重试,建议sleep 100ms左右后重试,重试不要超过3次


批量请求使用注意

批量请求key个数

批量请求key个数建议不要超过100个

batchGet请求如何提升可用性

可以设置批量请求返回比例(参数为BatchReturnPercent)


复杂数据结构中元素不宜过多

tair目前引擎对于复杂数据结构,如list,set,map,prefix接口,支持的不够友好。

这些复杂数据结构的元素不要存储超过2000个,后续服务端会限制元素个数,个数超过后禁止写入。


作为缓存使用时,不要在获取数据失败时直接重写缓存数据

获取数据失败的原因很多,但是只有在确定数据不存在的情况下,才需要重写缓存数据。如果没有正确区分失败的情况就直接重写缓存数据,则可能会加剧失败的可能,同时会对集群造成更大的压力。例如在超时的情况下重写缓存数据,超时次数可能会更多,且有雪崩的风险。

只有出现下面其中一个返回码时,才需要重写缓存数据:

  • NOTEXIST (-3998) - 数据不存在
  • EXPIRED (-3988) - 数据已过期

Prefix接口相关

不要在同一个pkey下存放过多skey

一个pkey下skey个数建议小于1000,在同一个pkey下存放过多的skey可能会导致性能问题。同一个pkey下的所有skey数据在物理上都存放在同一个机器上,当skey数量过多时,到同一台机器的请求也会增多。如果存在一个pkey是热点key, 则热点流量会集中到一台机器上,且无法通过扩容均衡压力。一种极端的错误使用情况是,整个数据空间只有一个pkey, 所有数据都作为skey,这个情况下整个集群的全部流量都集中在集群中的一台机器上,造成整个集群的性能降低为只相当于单机的性能。为了避免这些情况,不要在pkey下存放过多skey, 并且在整个数据空间中需要存在足够数量的pkey,以将流量均衡到集群中的各台机器上。

batchPrefixGetMulti接口使用注意

该接口没有部分返回机制和重试机制,容易受网络问题、热点问题等影响而出现少量超时,减少每个包中的pkey个数可以缓解

优先使用prefixGet,而不是getRange

prefixGet比getRange拥有更好的性能。prefixGet会优先从内存缓存中获取数据,而getRange只能通过磁盘扫描来获取数据。

注意传入getRange接口的参数

传入getRange接口的参数,对于getRange接口的性能,以及对集群造成的压力都有很重要的影响,因此传入正确的参数非常重要。

  1. 尽量设置skey的范围,即skey_start和skey_end

  2. offset不宜较大,可以通过设置skey_start,而避免设置offset为较大的数值

可能需要多次调用getRange来获取全部数据

getRange接口最多返回1M的数据。如果pkey下面skey的value较大,全部数据大小超过了1M,getRange只会返回1M的数据,同时返回码为HAS_MORE_DATA。

getRange接口有三个较重要的返回码:

  • OK (0) - 表示参数中要求的所有数据都已正确获取
  • HAS_MORE_DATA (150) - 只获取了参数中要求的部分数据,需要再次调用来获取剩余数据。需要注意的是,再次调用时需要调用者调整调用参数。
  • NOTEXIST (-3998) - 参数中要求的数据不存在

因此,当getRange接口返回HAS_MORE_DATA时,则需要调用者根据已经获取到的数据,调整调用参数,继续调用getRange来获取剩余的数据,直到getRange返回OK或者NOT_EXIST。


欢迎关注 高广超的博客 与 收藏文章 !
欢迎关注 头条号:互联网技术栈 !

个人介绍:

高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能、可扩展的互联网架构。

本文首发在 高广超的博客 转载请注明!

你可能感兴趣的:(缓存Tair高性能使用规范)