前语

Redis 作为高功用缓存被广泛运用到各个事务, 比方游戏的排行榜, 散布式锁等场景。通过在 IEG 的长时间运营, 咱们也遇到 Redis 一些痛点问题, 比方内存占用高, 数据可靠性差, 事务保护缓存和存储的一致性繁琐。由 腾讯互娱 CROS DBA 团队 & 腾讯云数据库团队联合研发的 Tendis 推出了: 缓存版 、 混合存储版 和 存储版 三种不同接口测验的流程和步骤形状, 针对不同的事务需求, 本Git文首要介绍 混合存储版 的全体架构, 而且详细揭秘内部的原理。

导语

本文首要介绍腾讯 IEGGitHub 运营 Redis 遇到的一些痛点问题, 然后介github打不开绍由 腾讯互娱 CROS DBA 团队 & 腾讯云数据库团队联合研发的 Tendis 的三种不同的产品形状。毕竟要害介绍冷热混合存储版的架构, 而且要害介绍各个组件的功用特性。

布景介绍

Redis 有哪些痛点 ?

在运用的过程中, 首要遇到以下一些痛点问题|Redi产品介绍s实战学习笔记。

  • 内存本钱高
  • 事务不同阶段对 QPS 要求不同 比方游戏事务, 刚上线的新游戏特别火爆, 为了支撑上千万一起在线, 需求不断接口测验地进行扩容增加机器。运营一段时间后, 游戏玩家或许变少, 拜访频率(QPS)没那么高, 依然占用许多机器, 保护本钱很高。
  • 需求为 Fork 预留内存 Redis 保存全量数据时, 需求 Fork 一个进程。Linux 的 fogithub永久回家地址rk 系统调用依据 Copy On Write 机制, 假定在此期间 Rgithub中文官网网页ed接口和抽象类的差异is 有许多的写github永久回家地址操作产品, 父子进程就需求各自保护一github官网份内存。因此布置 Redi产品设计s 的产品设计机器往往需求预留一半的内存。
  • 缓存一致性的GitHub问题 关于 Redis + MySQL 的架构需求事务方花费许多的精力来保护缓存和数据库的一致性。
  • 数据可靠性 Redis 本质上是一个内存数据库, 用户尽管能够运用 AOF 的 Always 来罗盘保证数据可靠性,产品质量法 可是会带来功用的GitHub大幅下降, 因此出产环境很少有运用。别的 不支开源我国撑 回档, Master 缺陷后, 异步复制github怎样下载文件会构成数据的丢掉。
  • 异步复制 Redis 主备运用异步复制, 这个是异步复制固有的问题。主备运用异步复制, 呼应推延低, 功用高, 可是 Mas开源阅览app下载安装ter 缺陷后, 会构成数据丢掉。

Tendis 是什么 ?

Tend开源是什么意思is 是集腾讯许多海量 KV 存储优势于一身的 Redis 存储处理计划, 并 100% 兼容 Redis 协议和 Redis4.0 一切数据模型。作为一个高可用、高功用的散布式 KV 存储数据库, 从拜访时延、产品耐久化需求、全体本钱等不同维度的考量, Tendis 推出了开源节流是什么意思是什么 缓存版混合存储版存储版 三种不同产品形状,并将存储版开源感兴趣的小伙伴 能够去 Github 注重咱们的项目: Tencent/Tendis

腾讯的Tendis这么牛皮,能否替代Redis的位置?

Tendis 缓存版适用于对推延要求特别活络, 而且接口英文对 QPS 要求很高的事务。依据社区 Redis 4.0 版别进行定制开发。

Tendis 存储版适用于大容量, 推延不活络型github事务, 数据悉数giti轮胎存储在 磁盘, 适宜温冷数据的产品介绍存储。Tendis 存储版是腾讯互娱 CROS D接口和抽象类的差异BA 团队 & 腾讯云数据库团队 自主规划和研发的开源散布式高功用 KV 存储系统。别的在 可靠性、复制机制、并发操控、gossip 结束以及数据搬家等做了许多的优化,gitlab 而且处理了一些 Redis cluster 比较棘手的问题。完giti轮胎全兼容 Redis 协议, 并运用 RocksDB 作为底层存储引擎。

Tendis 冷热混合存储版冷热混合存储 归纳了缓存版和存储版的长处产品介绍, 缓存层存放热数据, 全量数据存放在存储层。这既保证了热数据的拜访功用giti,一起保证了全量数据的可靠性,一起热数据支撑主动降冷。

Tendis 冷热混合存储版 全体架构

Tendis 冷热混合存储版首要由 Proxy缓存层 Redis存储层 Tendis 存储版同步层 Redis-sync 组成, 其间每个组件的功用如下:

Proxy 组件: 担任对客户端央求进行路由分接口测验发,将不同的 Key 的指令分发到正确的分github是干什么的片,一起 Proxy 还担任了部分监控数据的收集,以及高危指令在线禁用等功用。

缓存层 Redis Cluster: 缓存层 Redis 依据 社区 Redis 4.0 进行开发。Redis 具有以下功用: 1) 版别操控 2) 主动将 冷数据从接口测验的流程和步骤缓存层中挑选, 将热数据从存储层加载到缓存层; 3)接口和抽象类的差异 运用 Cuckoo Filter 标明全量开源软件 Keys, 防止缓存穿透; 4) 依据 RDB+AOF 扩缩容方法, 扩缩容愈加高效快捷。

存储层 Tendis Cluster: Tendis产品设计 存储版 是腾讯依据 RocksDB 自研的 兼容 Redis 协议的 KV 存储GitHub引擎, 该引擎已经在腾讯集团内部运营多年, 功用和稳定性得到了充接口测验分的验证。在混合存储系统中首要担任全量数据的存储和读取, 以及数据备github是干什么的份, 增量日志备份等功用。

同步层 Redis-sync: 1) 并行数据导入 存储层 Tendis; 2) 服务无状况, 缺陷从头拉起; 3) 数据主动路由。

腾讯的Tendis这么牛皮,能否替代Redis的位置?

Tendis 冷热混合存储的一些重要特性介绍:

  • 缓存层 Redis Cluster 和 存储层 Tendis Cluster 别离进行扩缩容, 集github是干什么的群自治办理等。
  • 冷数据主动降冷, 下降内存本钱; 热数据主动缓存, 下降拜访推延

缓存层 Redisgithub是干什么的 Cluster

冷热混合存储缓存层 Redis 在社区版的基础上增加了以下功用:

  • 版别操控
  • 冷热github中文官网网页数据交互
  • Cuckoo Filter 防止缓存穿透
  • 智能挑选算法
  • 依据 RDB+AOF 扩缩容

下面别离对这几个特性进行详细的说明。

版别操控

首要依据社区版 Redis 改动是版别操控。咱们为每个 Key 和 每条 Aof 增加一个 Version , 而且 Version 是单调递加的。在每次更新/新增一个 Key 后, 将其接口英文时节点的 Version 赋值给 Key 和 Value, 然后对大局的 Vgithub怎样下载文件ersion++; 如下所示, 在 red开源代码网站githubisObject 中增加 64bits, 其间 48bits 用于版别操控。

typedefstructredisObject{
unsignedtype:4;
unsigneden接口类型coding:4;
unsignedlru:LRU_BITS;/*LRUtime(relativetogloballru_clock)orgit指令
*LFUdata(least接口是什么significant8bitsfrequency
*andmostsignificant16bitsacce产品设计sstime).*/
intrefcount;
/*forhybridstorage*/
unsignedflag:4;/*OBJ_FLAG_...*/
unsignedreserved:4;
unsignedcou接口crc过错计数nter:8;/*forcold-data-cache-policy*/
unsignedl开源是什么意思onglongrevision产品运营:REVISION_BITS;/*forvalueversion*/
void*ptr;
}robj;

引进版别操控首要带来以下优势:

  1. 增量 RDB

社区版 Redis 主备在断线重连后, 假定 slave 发送的 psync_offset 对应的数据不在当时的 Master 的 repl_backlog 中, 则主备需求github中文官网网页从头进行全量同步。再引进 Version 之后, slave 断线重连, 给 Master 发送 带 Version接口 的 PSYNC replid psygiti轮胎nc_offset version指令。假定呈现上述状况, Master 将大于等于 Version 的数据生成增量 RDB, 发给 Slave, 然后处理需求增量, 同步比较慢的问题。

  1. Aof 的幂等

假定同步层 Redis-sync 呈现网络瞬断(时间短的和缓存层或许存储层断开), 作为一个无状况的同步组件, Redis-sync 会从头拉取未同步到 Tendis 的增量数据, 从头发送给 Tend接口英文is。每条 Aof 都具有一个 Version, Tendis 在实施的时分仅会实施比当时 Versigithub是干什么的on 大的 Aof, 防止 aof 实施屡次导致的数据不一致。

冷热数据交互

冷数据的github永久回家地址康复指当用户github永久回家地址拜访的 Key 不在缓存层, 需求将数据从存储层从头加载到缓存层。数据康复这儿是缓存层直接和存储层直接交互, 当冷 Keys 拜访的央求比较大, 数据康复很简单成为瓶颈, 因此为每个 Tendis 节点树立一个连接池, 专门担任与这个 Tendis 节点进行冷热数据康复。

腾讯的Tendis这么牛皮,能否替代Redis的位置?

用户拜访一个 Key 的详细流开源我国程如下:

  1. 首要判别 Key 是否在缓存层, 假定缓存层存在, 则实施指令; 假定缓存层不存在, 查询 Cuckoo Filter, 判别 Key 是否有或许在存储层;
  2. 假定 Key 或许在存储层, 则向存储层发送 dumpx dbigithub永久回家地址d key withttl 指令测验从存储层获取数据, 而且堵塞当时央求的客户端;
  3. 存储层收到 dumpx , 假定 Key 在存产品介绍储层, 则向缓存层回来 RESTOREEX dbid key ttl value; 假定 Key 不在存储层(Cuckoo Filter 的误判), 则向缓存层回来 DUMPXERROR key;
  4. 存储层收到 RESTOREEX 或许 DUMgithub是干什么的PXERROR 后, 将冷数据康复。开源然后就可开源阅览以唤醒堵塞的客户端, 实施客户端的央求。

Key 降冷 与产品司理 Cuckoo Filter

这儿首要说明混合存储从 1:1 版的缓存层缓存全量 Keys, 到 N:M 版的缓存层将 Key 和 Value 一起驱赶的演进, 以及咱们引进 Cuckoo Filter 防止缓存穿透, 一起节约许多内存。

  1. Key 降冷的布景介绍2020 年 6 月份上线的 1:1 版的冷热混合存储, 缓存层 Redis 存储全量的 Keys 炽热 Values(All Keys + Hot values), 存储层 Tendis 存储全量的 Keys 和 Values(All Keys + All values)。在上线运行了github敞开私库一段时间后, 发现全量 Keys 的内存开支特别大,开源众包 冷热混合的收益并不显着。为了进一步开释内存空间, 前进缓存的功率, 咱们扔掉了 Redis 缓存全量 Keys 的github敞开私库计划, 驱赶的时分将 key 和 Value 都从缓存层挑选。
  2. Cuckoo Filter 处理缓存击穿和缓存穿透假定缓存层不存储全量产品设计的 Keys, 就会呈现缓存击穿和缓存穿透的问题。为了处理这一问题, 缓存层引产品战略入 Cuckoo Filter 标明全量的 keys 。咱们需求一个支撑删去、可动态弹性而且空间利用率高的 Membership Query 结构, 通过咱们的调研和比照分析, 毕竟挑选 Dynam开源矿工ic Cuckoo Filter。
  3. Dynamic Cuckoo Filter 结束项目初期参看了 RedisBloom 中 Cuckoogitlab Filter 的结束, 在开发的过程中也遇到了一些坑, RedisBloom 结束了 Cuckoo Filter 在删去的时分会呈现误删, 毕竟给 RedisBloom 题 PR(Fix Cuckoo filter compact caugiteese deleted by mistake #260) 批改了问题。
  4. Key 降冷的收益毕竟选用将 Key 和 Value 一起从缓存层挑选接口, 下降内存产品生命周期产品定位收益很大。比方现网的一个事务, 总共有 6620 W 个 Keys , 在缓存全量 Keys 的时分 占用 18408 MB 的内存, 在 Key 降冷后 只是占用 593MB 。

智能挑选/加载战略

作为冷热混合存储系统, 热数据在缓存层, 全量产品战略数据在存储层。接口是什么要害的问题是挑选和加载战略, 这儿直接影响缓存的功率, 细分首要有两点: 1) 当缓存层内存满时, 挑选哪些数据挑选; 2) 当用户拜访存储层的数据时, 是否需求将其放入缓存层

  1. 首要介绍混合存储的挑选战略, 首要有以下两个挑选战略:
  • maxmemory-policy 当缓存层 Redis 内存运github直播平台永久回家用抵达 maxmemory, 系统将依照 maxmemory-policy 的内存战略将 Key/Value 从缓存层驱赶, 开释内存空间。(驱赶是指将 Key/Value 从缓存层中挑选掉,giti轮胎 存储层 和 缓存层的 Cuckoo Filter 依然存在该 Ke接口y; )
  • value-eviction-policy 假定装备 valu接口卡e-eviction-policy, 后台会守时将用户 N 天未拜访的 Key/Value 被驱赶出内存;
  1. 缓存加载战略 为了防止缓存污染的git教程问题(比方相似 Scan 的拜访, 遍历存储层的数据, 将缓存层真实的热数据选gitlab择, 然后构成了缓存功率低下) 。咱们结束缓存加载战略: 只是将规矩时间内拜访频率超越某个阈值的数据加载到缓存中, 这儿的时间和阈值都是可装备的。

依据 RDB+AOF 扩缩容

社区版 Redis 的扩容流程:

腾讯的Tendis这么牛皮,能否替代Redis的位置?

社区版 Redis 扩容存在的一些问题:接口类型

  1. impogithub官网rting 和 migrating 的设置不是原子的

先设置方针节点 slot 为 importing 状况, 再设置源节点的 slot 为 migrating 状况。假定反过来, 因为两次操作非原子: 源节点设置为 migrating , 方针节点还未设置 migrating 情giti轮胎况, 央求在这两个节点间重复 Move 。接口类型

  1. giti迁以 Key 为粒度, 功率较低

Migrate 指令每次搬家一个或许多个 Keys, 将整个 Slot 搬家到方针节点需求屡次网络交互。

  1. 大 Key 问题

因为 MigratGitHube 指令是同步指令, 在搬家过程中是不能处理其他用户央求的, 因此或许会影响业产品设计专业务。(推延时间不坚定较大)

接口于社区版 Redis 存在的上述问题, 咱们结束了依据 RDB+Aof 的扩缩容方法产品设计, 大致流程如下:

  1. 管控增加新节点, 规划待搬家 slots;
  2. 管控端向方针节点下发 slot 同步指令: cluster slotsygithub官网nc beginSlot endSlot [[beginSlot endSlot]…]
  3. 方针节点向源节点发送 sync [slot …], 指令开源代码网站github央求同步 slot 数据
  4. 源节点生成指定 slot 数据的一致性快照全量数据(RDB), 并将其发送给政开源是什么意思策节点
  5. 源节点开端继续发送增量数据(Aof)
  6. 管控端定位获取源节点和方针节点的落后值 (diff_bytesgithub中文官网网页), 假定落后值在指定的阈值github下载内,giti轮胎 管控端向政github敞开私库策节点发送 cluster slotfailover (流程相似 Redis 的 cluster failover, 首要堵塞源节点写入, 然后等候方针节点和源节点的落后值为 0, 毕竟将 搬家的 slots 归属方针节点)

腾讯的Tendis这么牛皮,能否替代Redis的位置?

同步层 Redis-sy产品战略nc

同步层 Redis-sync 模仿 Redis Slave 的行为, 接纳 RDB 和 Aof, 然后并行地导开源是什么意思入到存储层 Tendis。同步层首要需求处理以下问题:

  • 并发地导入到存储层 Tendis, 怎样保证时序正确 ?
  • 特别指令的处理, 比方 FLUSHALL/FLUSHDB/SWAPDB/SELECT/Mgithub永久回家地址ULTI 等 ?
  • 作为一个无状况的同步接口卡组件, 怎样保证缺陷后, 数据断点续传 ?
  • 缓存层和存储层 别离进行扩缩容, 怎样将央求路由到正确的 Tendis 节点 ?

腾讯的Tendis这么牛皮,能否替代Redis的位置?

为了处理上述的三个问题, 咱们结束了下面产品介绍的功用:

  • Slot 内开源矿工串行, Slot 间并行 针对接口和抽象类的差异问题 1, Redis-sync 中选用与 Redis 相同的核算 Slot 的算法, 解析接口类型到详细的指令后, 依据GitHub Key 所属的 slot, 将其放到对应的 行产品设计列中( slot%QueueSize )。因此同一个 Slot 的数据是串行开源是什么意思写入, 不同 slot 的数据能够并行写入, 不会呈现时序紊乱的行为。
  • 串并转化 针对问题 2, Redis-sync 会在并行和串行形式之间进行转化。比方收到 FLUSHDB 指令, 这是需求将 FLUSHDB 指令 前的指令都实施完, 在实施 FLUSHDB 指令。
  • 守时上报 针对问题 3, RedisGitHub-s开源ync 会守时将已发送给存储产品定位层的 aof 的 Version 耐久化到 存开源节流是什么意思是什么储层。怎样 Redis-sync 缺陷, 首要从 存储层获取前次已发送的方位,git指令 然后向对应的 Redigithub是干什么的s 节github中文官网网页点发送 psync, 央求同步。
  • 数据主动路由 针对问题 4, R接口的作用edis-sync 会守时从存储层获取 Slot 到 Tendis 节点的映射联络, 而且保护这些 Tendis 节点的连接池。央求从 缓存层抵达, 然后核算央求所属github敞开私库的 slot, 然后发送到正确的 Tendis 节点。

存储层 Tendis C接口luster

Tendis 是兼容 Redis 中心数据结构与协议的散布式高功用 KV 数据库,开源阅览 首要具有以下特性:

  • 兼容 Redis 协议 完全兼容 red开源众包is 协接口类型议,支撑 redis 首要数据结开源代码网站github构和接口,兼容大部分原生 Redis 指令。
  • 耐久化存储 运用 rocksdb 作为存储引擎,一切数据以特定格式存储在 rocksdb 中,最大支撑 PB 级存储。
  • 去中心化架构 相似于 redis cluster 的分产品定位布式结束,一切节点通过 gossip 协议通讯,可指定 hashtag 来操控数据散布和拜访,运用和运维本钱极低。
  • Redis中心面试真题,期望对您有帮忙!
  • 水平扩展 集群支撑增删节点,而且数据能够依照 slo接口文档t 在开源众包任意两节点之间搬家,扩容产品生命周期和缩容过程中对运用运维人产品质量法员通明,支撑扩展至 1000 个节点。
  • 产品介绍点主动切换 主动检测缺陷节点,当缺陷发生后,sl开源节流是什么意思是什么ave 会主动提升为 master 继续对外供给服务。

腾讯的Tendis这么牛皮,能否替代Redis的位置?