有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

云数据库 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后性能较差。