腾讯云超火开源数据库产品架构揭秘
腾讯云数据库
共 6940字,需浏览 14分钟
· 2021-04-13
Redis&Tendis
Tendis混合存储版整体架构
缓存层Redis Cluster
一、版本控制
如下所示, 在 redisObject 中添加 64bits, 其中 48bits 用于版本控制。
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
/* for hybrid storage */
unsigned flag:4; /* OBJ_FLAG_... */
unsigned reserved:4;
unsigned counter:8; /* for cold-data-cache-policy */
unsigned long long revision:REVISION_BITS; /* for value version */
void *ptr;
} robj;
2020 年 6 月份上线的 1:1 版的冷热混合存储, 缓存层 Redis 存储全量的 Keys 和热 Values(All Keys + Hot values), 存储层 Tendis 存储全量的 Keys 和 Values(All Keys + All values)。在上线运行了一段时间后, 发现全量 Keys 的内存开销特别大, 冷热混合的收益并不明显。为了进一步释放内存空间, 提高缓存的效率, 我们放弃了 Redis 缓存全量 Keys 的方案, 驱逐的时候将 key 和 Value 都从缓存层淘汰。
如果缓存层不存储全量的 Keys, 就会出现缓存击穿和缓存穿透的问题。为了解决这一问题, 缓存层引入 Cuckoo Filter 表示全量的 keys 。我们需要一个支持删除、可动态伸缩并且空间利用率高的 Membership Query 结构, 经过我们的调研和对比,最终选择 Dynamic Cuckoo Filter。
项目初期参考了 RedisBloom 中 Cuckoo Filter 的实现, 在开发的过程中也遇到了一些坑,RedisBloom 实现的 Cuckoo Filter 在删除的时候会出现误删, 最终给 RedisBloom 提 PR 修复了问题。
最终采用将 Key 和 Value 同时从缓存层淘汰, 降低内存的收益很大。比如现网的一个业务, 总共有 6620 W 个 Keys , 在缓存全量 Keys 的时候 占用 18408 MB的内存, 在 Key 降冷后 仅仅占用 593MB 。
当缓存层 Redis 内存使用到达 maxmemory, 系统将按照 maxmemory-policy 的内存策略将 Key/Value 从缓存层驱逐, 释放内存空间。(驱逐是指将 Key/Value 从缓存层中淘汰掉, 存储层 和 缓存层的 Cuckoo Filter 依然存在该 Key;
如果配置 value-eviction-policy, 后台会定期将用户 N 天未访问的 Key/Value 被驱逐出内存;
2) 管控端向目标节点下发slot同步命令: cluster slotsync beginSlot endSlot [[beginSlot endSlot]...]
3) 目标节点向源节点发送 sync [slot ...], 命令请求同步slot数据
4) 源节点生成指定 slot 数据的一致性快照全量数据(RDB), 并将其发送给目标节点
5) 源节点开始持续发送增量数据(Aof)
6) 管控端定位获取源节点和目标节点的落后值 (diff_bytes), 如果落后值在指定的阈值内, 管控端向目标节点发送 cluster slotfailover (流程类似 Redis 的 cluster failover, 首先阻塞源节点写入, 然后等待目标节点和源节点的落后值为 0, 最后将 搬迁的 slots 归属目标节点)
同步层 Redis-sync
针对问题 2, Redis-sync 会在并行和串行模式之间进行转换。比如收到 FLUSHDB 命令, 这是需要将 FLUSHDB 命令 前的命令都执行完, 再执行 FLUSHDB 命令。
针对问题 3, Redis-sync 会定期将已发送给存储层的 aof 的 Version 持久化到 存储层。如何 Redis-sync 故障, 首先从 存储层获取上次已发送的位置, 然后向对应的 Redis 节点发送 psync, 请求同步。
针对问题 4, Redis-sync 会定期从存储层获取 Slot 到 Tendis 节点的映射关系, 并且维护这些 Tendis 节点的连接池。请求从 缓存层到达, 然后计算请求所属的 slot, 然后发送到正确的 Tendis 节点。
存储层 Tendis Cluster
Tendis 是兼容 Redis 核心数据结构与协议的分布式高性能 KV 数据库, 主要具有以下特性:
评论
合一云2024年五一劳动节放假安排通知
亲爱的用户:      “五一”劳动节即将到来,根据《国务院办公厅关于2024年部分节假日安排的通知》并结合网站的实际情况,现将合一云2024年“五一”劳动节放假安排通知如下:     一、放假时间:2024年5月1日(星期三)至2024年5月5日(
合一云
0
Apache Paimon毕业,湖仓架构的未来发展趋势!
北京时间 2024 年 4 月 16日,开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache Paimon 毕业成为 Apache 顶级项目(TLP, Top Level Project)。经过社区的共同努力和持续创新,Apache Paim
程序源代码
0
轻松掌握开源项目的二次开发技巧
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群本文作者:@方长_beezen 原文链接:https://juejin.cn/post/7358647992608489535前言随着软件行业的迅速
程序员成长指北
0
人工智能周刊#18:微软发布手机端大模型、Llama 3 中文模型列表、苹果开源新项目、
主打尊重隐私的搜索引擎 duckduckgo,也推出了 ai chat 服务,可以使用 chatgpt 或者 claude机器学习周刊:关注 Python、机器学习、深度学习、大模型等硬核技术本期目录:1、Qwen1.5-110B:Qwen1.5 系列的首个千亿参数开源模型2、苹果开源
机器学习算法与Python实战
0
微软开源MS-DOS操作系统源码,冲到GitHub第一了!
大家好,我是轩辕。这两天逛GitHub的时候,突然发现一个叫 MS-DOS的项目冲到Trending榜首了!定睛一看,微软官方啊,搜了一下才知道,原来前两天,微软把MS-DOS 4.0系统开源了!关于这个系统,估计现在很多程序员都不知道了,或者只在古老的教科书上看过这玩意儿。MS-DOS,全称为Mi
编程技术宇宙
6
热搜第一,腾讯又一游戏停运了!
腾讯又有一款游戏要停运了。最近,腾讯游戏宣布:由于游戏的代理协议即将到期,《食物语》将于2024年6月18日11:00停止在中国大陆地区的运营。并且这次的停运话题一度冲上热搜榜第一位,引发网友热议。据了解,《食物语》是一款中华美食拟人的国风女性向RPG养成手游,于2019年9月份公开测试,运营至今已
逆锋起笔
0
机械臂抓取/6D位姿估计/三维点云/缺陷检测方向交流群成立啦
点击下方卡片,关注「3D视觉工坊」公众号选择星标,干货第一时间送达添加小助理: dddvision,备注:研究方向+学校/公司+昵称(如机械臂抓取+清华+小草莓)▲长按扫码添加助理大家好,我是小草莓!我们3D视觉工坊成立了计算机视觉各个方向的交流群,详细如下所示,欢迎添加小助理,邀请你加群!3D视觉
3D视觉工坊
0
纪不懂法,云浩止耕:要种地,先交钱
“我是建华镇党委副书记,我姓纪叫纪云浩,听懂了吗?等会车我们一定要扣走,地不属于你们的…”、“别找我,我不懂法“。。。“纪不懂法,云浩止耕”所说的就是最近非常火的内蒙古自治区通辽市开鲁县建华镇党委副书记、政法委员:纪云浩,而他还是一位90后,07年入伍,09年转业。。。春耕,农民的希望与挑战。又到一
机器学习算法工程师
0