Tendis存储版是腾讯互娱CROS团队针对游戏场景开发的KV存储,满足业务高性能,大容量,低成本的需求。

上一个版本是Tendis SSD,从架构、功能、性能、可运维性都做了深度的优化和重构。(vsTendis SSD

Tendis存储版 集群架构

Tendis存储版使用去中心化集群架构,每个数据节点都拥有全部的路由信息。

  • 用户可以访问集群中的任意节点,并且通过redis的MOVE协议,最终路由到正确的节点。
  • 每个Tendis存储版节点维护属于各自的slot数据,任意两个master节点之间的slot不重复
  • Tendis存储版的主备节点之间通过binlog进行复制
  • 任意两个节点之间通过gossip协议进行通讯
  • master节点之间支持基于slot的数据搬迁

架构

用户也可以通过支持redis cluster协议的proxy来访问Tendis存储版集群,例如predixyredis-cluster-proxy等。这样更低版本的redis client(不支持MOVE)也能正常访问。

数据分片

类似redis cluster,Tendis存储版使用redishashslot算法对数据进行划分,默认整个集群的数据划分为16384(2^14)个slot,每个Tendis存储版节点负责一部分slot。

可以通过参数chunksize来修改默认的slot数量,但只允许是Tendis存储版进程第一次启动时候指定。一旦Tendis存储版初始化,chunksize就不能改变。一般情况下,不需要配置和改变这个值。同时需要注意的是,必须保证集群的所有节点都采用相同的chunksize配置。

Tendis存储版

架构 - 图2

  • 整体使用线程池模式,不同功能模块使用不同的线程池,每个线程池支持动态调整线程资源
  • 支持多线程,实现key lock来保证并发控制。并实现key lock, chunk lock, store lock的分层并发控制。
  • 支持配置多个rocksdb,突破单一rocksdb的性能瓶颈,并控制单个rocksdb的容量规模
  • binlog保存在rocksdb中,保证数据和binlog的事务一致性

存储引擎

使用rocksdb作为存储引擎的原因

  • rocksdb的读写性能比较高,并且具有较高的压缩比
  • rocksdb完整支持事务ACID特性,支持很多高级特性
  • rocksdb作为目前最火的开源kv存储,稳定性比较好,社区也足够活跃
  • 腾讯互娱从2015年开始大量使用rocksdb,实际运营经验丰富

多rocksdb

Tendis存储版默认单进程使用10个rocksdb实例,

kvstore_rocks

线程池

Network线程池

专门处理网络读写事件的应答,处理Redis RESP协议的解析和状态流转。当协议解析完成,交给Worker线程池处理。

network

gossip

Worker线程池

处理所有的command执行逻辑,接受网络线程池的输入,并异步将回包交给网络线程池

Replication线程池

分为全量复制线程池和增量复制线程池

Cluster线程池

专门处理Gossip协议的解析和执行

Migrating线程池

专门处理slot迁移任务的线程池,分为sender线程池和receiver线程池

Expiration线程池

专门处理过期数据的线程池,主动过期Hashlist,set,zset等结构的过期数据。