Tendis存储版
是腾讯互娱CROS团队针对游戏场景开发的KV存储,满足业务高性能,大容量,低成本的需求。
上一个版本是Tendis SSD
,从架构、功能、性能、可运维性都做了深度的优化和重构。(vsTendis SSD
)
Tendis存储版 集群架构
Tendis存储版
使用去中心化集群架构,每个数据节点都拥有全部的路由信息。
- 用户可以访问集群中的任意节点,并且通过redis的
MOVE
协议,最终路由到正确的节点。 - 每个
Tendis存储版
节点维护属于各自的slot数据,任意两个master节点之间的slot不重复 Tendis存储版
的主备节点之间通过binlog
进行复制- 任意两个节点之间通过gossip协议进行通讯
- master节点之间支持基于slot的数据搬迁
用户也可以通过支持redis cluster协议的proxy来访问Tendis存储版
集群,例如predixy
,redis-cluster-proxy
等。这样更低版本的redis client(不支持MOVE
)也能正常访问。
数据分片
类似redis cluster,Tendis存储版
使用redishashslot
算法对数据进行划分,默认整个集群的数据划分为16384
(2^14)个slot,每个Tendis存储版
节点负责一部分slot。
可以通过参数chunksize
来修改默认的slot数量,但只允许是Tendis存储版
进程第一次启动时候指定。一旦Tendis存储版
初始化,chunksize
就不能改变。一般情况下,不需要配置和改变这个值。同时需要注意的是,必须保证集群的所有节点都采用相同的chunksize
配置。
Tendis存储版
- 整体使用线程池模式,不同功能模块使用不同的线程池,每个线程池支持动态调整线程资源
- 支持多线程,实现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实例,
线程池
Network线程池
专门处理网络读写事件的应答,处理Redis RESP
协议的解析和状态流转。当协议解析完成,交给Worker线程池处理。
Worker线程池
处理所有的command执行逻辑,接受网络线程池的输入,并异步将回包交给网络线程池
Replication线程池
分为全量复制线程池和增量复制线程池
Cluster线程池
专门处理Gossip
协议的解析和执行
Migrating线程池
专门处理slot迁移任务的线程池,分为sender线程池和receiver线程池
Expiration线程池
专门处理过期数据的线程池,主动过期Hash
,list
,set
,zset
等结构的过期数据。