云数据库 Tendis 混合存储版(集群架构)基于腾讯内部广泛使用的 KV(key-value)存储引擎 Tendis ,Tendis 是腾讯自研兼容 Redis 协议的 Rocksdb 存储引擎,拥有高性能、高压缩比、高稳定性特性,在腾讯内部有着丰富的运营经验。
混合存储版(集群架构)由缓存 Redis 和引擎 Tendis 两大组件构成,适用于 KV 存储场景,平衡了存储场景中性能和成本之间难题,在冷数据占比较大的场景中可帮业务降低多达80%的运营成本。
混合存储版(集群架构)完全兼容 Redis 4.0 集群版的版本命令,使用门槛低,可以充分利用 Redis 丰富的数据结构和操作命令带来的高效率。
混合存储版(集群架构)的全量数据存储于磁盘,全量 Key 和热 Key 的 Value 缓存于内存。
混合存储版特点
低成本
- 数据自动降冷自动缓存,全量数据存储于磁盘,热数据缓存于内存,和内存版相比运营成本可降低40% - 80%。
- 数据落盘自动压缩,采用 LZ4 压缩算法在性能和容量中寻找平衡,最大可降低 90% 的磁盘空间。
高效率
- 100%兼容 Redis 协议,业务可以完整地体验 Redis 高效的数据组织结构和操作接口。
- 使用 Tendis 混合存储版,业务无需再处理数据的冷热交换,以及传统缓存方案中数据一致性、缓存击穿、缓存雪崩等问题,降低了业务的复杂性,提升开发效率,降低运维成本。
高性能
- 提供与 Redis 一致的热数据访问性能,最大提供300万+ QPS。
- 支持高达100万 QPS 的并发写入。
大容量
- 提供240GB - 32TB的超大存储容量规格。
- 磁盘数据支持6副本,充分保障数据的可靠性。
混合存储版架构
云数据库 Tendis 混合存储版(集群架构)核心组件由 Proxy、缓存 Redis、引擎 Tendis 组成,每个组件功能介绍如下:
- Proxy:负责对客户端请求进行路由分发,将不同的 Key 命令分发到正确的分片,同时 Proxy 还负责部分监控数据的采集,以及高危命令在线禁用等功能。
- 缓存 Redis:缓存 Redis 组件源于 Redis 4.0 Cluster,为了支持冷数据自动降冷,我们对 Redis 进行了 Value 淘汰、写入数据同步 Tendis、冷数据访问、主备热数据同步、按时间淘汰 Value 等核心功能的改造,改造后的混合存储版100%兼容 Redis Cluster 命令。
- 引擎 Tendis:腾讯自研的 KV 存储引擎,兼容 Redis 协议,该引擎已经在腾讯内部运营多年,性能和稳定性得到了充分的验证,在混合存储系统中主要负责全量数据的存储和读取,以及数据备份,增量日志备份等功能。
混合存储版规格
说明:
- 磁盘最小容量必须大于内存容量,否则可能存在数据无法写入的情况。
- 磁盘配置过小,可能存在内存无法存储足够的 Key(所有 Key 都会缓存至内存,淘汰的只是 Value),请评估好磁盘空间。
- 最大写入性能是在 Set 命令128字节 value 情况下的测试结果,测试命令如下:
redis-benchmark -h 10.0.0.5 -p 6379 -c 100 -n 60000000 -r 1000000000 -d 128 -t set -a passwd
分片数量 | 总缓存容量(GB) | 总磁盘容量范围(GB) | 最大写入性能(QPS) |
---|---|---|---|
4 | 64 | 240 - 520 | 60,000 |
4 | 128 | 480 - 960 | 60,000 |
4 | 256 | 1000 - 2000 | 60,000 |
8 | 128 | 480 - 960 | 120,000 |
8 | 256 | 960 - 1920 | 120,000 |
8 | 512 | 2000 - 4000 | 120,000 |
16 | 256 | 960 - 1920 | 240,000 |
16 | 512 | 1920 - 3840 | 240,000 |
16 | 1024 | 4000 - 8000 | 240,000 |
32 | 512 | 3840 - 7680 | 480,000 |
32 | 1024 | 7680 - 15360 | 480,000 |
32 | 2048 | 16000 - 32000 | 480,000 |
数据降冷说明
Value 驱逐策略
- value-eviction-policy
- value-eviction-policy 参数支持 time-to-eviction、none,默认为 none,表示在内存足够的情况下 Key 默认不被驱逐出内存。
- 通过设置 value-eviction-policy 为 time-to-eviction,可指定 N 分钟未访问的 Key 自动被驱逐出内存。value-time-to-eviction 参数默认值为10080分钟(7天),可在 控制台 自助调整该参数值。
- maxmemory-policy
- 混合存储版仅支持 allkeys-lru、allkeys-random,默认为 allkeys-lru。
- 当内存使用到达 maxmemory,系统将按照 maxmemory-policy 从内存策略驱逐 Value。
Value 缓存策略
value-cache-policy
通过该参数,用户可以配置数据何时缓存至 Tendis 缓存,通过以下参数可以避免遍历数据等情况,造成缓存失效的问题。- value-cache-policy-period 参数默认值为300秒(5分钟),可指定 N 秒钟内 Key 访问次数大于等于 N 次(value-cache-policy-threshold 参数值),Tendis 会将 Value 缓存至内存。
- value-cache-policy-threshold 参数默认值为1,范围值可设置为1-100,该参数配置为1,冷数据将立即缓存。
Expire 语义说明
对于设置了 Expire Time 的 Key,混合存储版将保持原有的语义,将到期的 Key 和 Value 从内存和磁盘中删除。EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT 命令对 Key 进行设置过期时间也是相同原理,到期后 Key 和 Value 都会删除。大 Key 驱逐说明
为保障读性能,混合存储当前版本对于超过8MB或者 filed 超过1000个的复杂结构 Value(非 string),将不从内存中驱逐,因此如果存在大 Hash 等复杂数据结构情况下,降冷效果不明显,后续我们将持续优化。
命令兼容性说明
混合存储版(集群架构)数据是分布式存储的,集群架构命令支持情况分为支持、自定义命令、不支持,详细命令兼容性列表请参见 命令兼容性。
不支持的命令
系统将返回如下错误:keys * (error) ERR unknown command 'keys'
有限支持的命令
混合存储版(集群架构)兼容 Jediscluster 等智能客户端,为兼容 Jedis cluster 的使用场景,云数据库 Tendis 对 Cluster 支持命令返回对 IP 列表进行了修改,返回信息中每个节点的 IP 地址为实例的 VIP。- CLUSTER NODES
- CLUSTER SLOTS
- CONFIG GET
跨 Slot 命令支持
混合存储版(集群架构)目前支持跨 Slot 访问的命令,包括 MGET、MSET、DEL,其他多 Key 命令的跨 Slot 访问暂不支持。自定义命令
混合存储版(集群架构)通过 VIP 封装,在集群模式下提供了单机版的使用体验,对业务的使用带来的极大的便利,但是对运维不够透明,因此通过自定义命令来弥补这块空缺,支持集群中每个节点的访问,支持方式为在原有命令的参数列表最右边新增一个参数【节点ID】,COMMAND arg1 arg2 ... [节点ID],节点 ID 可通过 cluster nodes 命令,或者在 控制台 中获取:
10.1.1.1:2000> cluster nodes
25b21f1836026bd49c52b2d10e09fbf8c6aa1fdc 10.0.0.15:6379@11896 slave 36034e645951464098f40d339386e9d51a9d7e77 0 1531471918205 1 connected
da6041781b5d7fe21404811d430cdffea2bf84de 10.0.0.15:6379@11170 master - 0 1531471916000 2 connected 10923-16383
36034e645951464098f40d339386e9d51a9d7e77 10.0.0.15:6379@11541 myself,master - 0 1531471915000 1 connected 0-5460
53f552fd8e43112ae68b10dada69d3af77c33649 10.0.0.15:6379@11681 slave da6041781b5d7fe21404811d430cdffea2bf84de 0 1531471917204 3 connected
18090a0e57cf359f9f8c8c516aa62a811c0f0f0a 10.0.0.15:6379@11428 slave ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171 0 1531471917000 2 connected
ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171 10.0.0.15:6379@11324 master - 0 1531471916204 0 connected 5461-10922
原生命令:
info server
自定义命令:
info server ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171
SCAN 命令示例:
scan 0 238b45926a528c85f40ae89d6779c802eaa394a2
scan 0 match a* 238b45926a528c85f40ae89d6779c802eaa394a2
KEYS 命令示例:
keys a* 238b45926a528c85f40ae89d6779c802eaa394a2
多数据库(DB)支持
混合存储版(集群架构)不支持多 DB,支持 SELECT 0 命令。低性能命令
- linsert、lrem:List 命令族中的 linsert、lrem 命令不建议使用,这两个命令会在磁盘中遍历 list 节点,命令的执行时间复杂度为 O(n),性能较差,list 节点数较大时,命令会执行超时。
- append:append 命令在字符长度超过1MB后性能较差。