xcache是由喜马拉雅系统架构团队基于开源项目codis,redis和pika深度定制开发的一套分布式KV持久化存储系统。该系统主要有以下几个特点:
xchace的整体架构和coids-redis架构保持一致,最主要的区别是将codis-server组件替换成了pika组件,如下图:
在pika组件中,我们引入了一个缓存层(MEM-cache,该模块是基于redis实现),当存在冷热数据时,可以缓存热key到内存中,从而提高QPS以及降低命令延时。整体的命令调用流程如下:
xcahe底层存储引擎支持string数据类型的kv分离存储,在value较大时,可以有效降低LSM的写放大问题,从而降低磁盘IO,减少命令延时。下图是我们对线上存储大value服务优化的效果。 优化前每天有10w左右的300ms超时报警,优化后每天1000左右,降低99%以上。
早期数据都是存储在磁盘上,这样就造成了内存的浪费。本着对资源充分利用的目的,xcache引入了一个缓存层,该模块是基于redis实现,支持动态开关。测试缓存命中时,可以大大提升QPS,并且降低访问延时,吞吐量测试数据如下: 缓存命中时,QPS大概提升了50%左右。
ehash是一种可为field设置过期时间的hash类型数据结构。支持和redis hash一样丰富的数据接口,极大地提高了hash数据结构的灵活性,简化了很多场景下的业务开发工作。
主要特性:
xcache支持设置zset存储的最大元素个数,当超过用户设置的最大元素个数时,可以自动清理zset中不需要的数据,非常适合只保存定量历史数据的业务场景。
主要特性:
xcache支持将快命令和慢命令分离执行,这样可以有效降低命令之间的相互影响,避免执行较慢的命令阻塞执行较快的命令。下图是测试set和zadd命令,设置set为快命令,zadd为慢命令。set命令QPS为1w,zadd命令QPS为2w。
set命令延时如下:
zadd命令延时如下:
可以看出快慢命令分离前,set和zadd的延时毛刺都差不多,因为zadd和set命令在相同的执行队列中,zadd会阻塞set命令的执行。快慢命令分离后,zadd命令不会阻塞set命令,所以set的延时毛刺降低了很多,从200ms降低到了20ms左右,降低了90%。
PS:考虑到pika底层hash结构和set结构存储协议一致,所以没有测试set数据类型。
正常压力,每个命令测试1个小时
最大吞吐量测试
xcache的存储引擎是基于pika3.0.4代码做的开发,自定义的版本号使用两位有效数字,即主版本号和次版本号,如V3.2。该版本号和pika的版本号没有任何关系,请做区分。
xcache的具体使用可以参考wiki,我们会持续更新。QQ交流群:914191190,欢迎随时骚扰:-)