关于我从零写一个 C++ 分布式 KV 存储系统原型
写在开头也算是很久没有写blog了上次写还是OB复赛打完了之后写的一篇凄凄惨惨的总结文一晃半年过去了。没想到距离自己上次写随笔都是半年前的事情了。先简单交代一下自己的背景吧自从比赛打完了之后就开始准备找实习了找实习其实并没有我想象中很困难我大概面了有五六家字节的基架OB的数据库内核开发还有一些小厂的杂七杂八游戏引擎自动驾驶等等刷刷面试经验。本来是打算投字节给面试OB涨点经验的结果没想到字节的效率太快了没几天就发了offer。最后自己纠结了下害怕自己选择数据库内核后路走窄了就想着去基础架构试试吧。后来是差不多实习了有1个月吧发现自己实习基本上没有学到什么实际的代码开发都没有多少每天就是在排查问题简单的改点代码测试性能之类的我就在想如果我保持现在这样到秋招自己恐怕到时候成废物了而组内的项目代码又不可能会让我来参与实际代码开发我总得另寻出路。恰巧组内的项目是做分布式KV的那不如了解清楚组内的项目然后我去写一个自己的分布式KV。好歹以后面试的时候发现我的实习内容很水我可以狡辩一下说自己私下学习组内项目自己搓了个分布式KV出来有点小丑的是由于自己设定的场景和组内的不同以及V1版本的功能方面没办法实现的很全面导致自己魔改了之后可以说除了模块名字几乎和组内的项目都不沾边了。至此以上就是我打算写这个分布式KVAdvisKV的想法了。其实也有点想抱着做出来自己的一个代表作的想法毕竟之前写的那些rmdbminiobseekdb的代码都不算是我自己的项目。开始写这个文档的时候项目基本上完成的差不多了吧benchmark起码可以完整跑通bushi。 想着架构啥的肯定不会大改了并不是这样的后来又重构了很多顶多就是后期可能再会尝试优化下性能以及删除我项目里面加的乱七八糟的注释所以差不多就可以开笔了。AdvisKV 是什么简单来说AdvisKV 是我用 C17 写的一个分布式 KV 存储系统原型。实现它的原因说的功利一点就是希望可以秋招体面一点。顺带其实也希望可以完成自己的第一个从头开始搞的项目。希望各位不要期望太高定位并没有多高就是一个学习向系统的原型罢了。大概概括这个项目的主线的话就是 Meta/SDM 作为控制面维护表、副本和路由的期望状态Storage 作为数据面负责 KV 读写和 Raft 复制控制面和数据面通过心跳和 reconciler 不断把系统状态收敛到预期。这个项目里面大概分成四个模块Meta 负责DBTable这些元数据和DDL。SDM 负责 Storage 节点注册、心跳、ReplicaGroup 编排、期望副本下发和 Route 维护。Storage 负责 KV 数据读写、Raft 和本地持久化。SDK 对外提供基于 db table key 的put/get/delete 接口。目前这个项目可以跑通建库建表路由查询KV的读操作写操作副本数调整自动替换坏了的副本raftWALsnapshotrecover等这些功能然后目前有两百多个gtest单测一批E2E测试例如最基础的端到端 KV 链路leader崩溃后切主follower追日志和追snapshotMeta/SDM重启恢复啊等等等等还有benchmark和metrics。关于详细的内容和数据这里就不详说了我更想的其实是写关于这个项目的自我感受一直以来就是这个样子所以就不写的那么官方味了。这里贴上github地址: https://github.com/advisedy/adviskv 想了解的可以去README里面查看。Show这个分布式KV的数据模型就像和正常的数据库差不多会有dbtable的概念。用户可以创建自己的DB然后在DB里面创建table。每一个 table 在创建的时候可以指定 shard 数和 replica 数。一个 table 会被拆成多个 shard每一个 shard 又会有多个 replica。这里需要说明一下V1 版本里 shard 数是在创建 table 的时候确定的后续暂时不能动态修改replica 数现在可以通过 alter_table 去调整也支持缩到 0 再扩回来。也就是说目前不是完全没有扩缩容只是支持的是副本数这条链路自动 rebalance 和 shard 数变更还没有做以后应该也不会做了吧这个项目应该已经要到此为止了。routeros项目里提供了一个交互式 CLI adviskvctl 方便进行演示(AI大哥跑的我只是简单看了看)建库建表adviskv create_db demo_db dc1OK db_id1create_table resource_pooladviskv create_table demo_db demo_table 4 3 defaultOK table_id1wait_table [timeout_ms]adviskv wait_table demo_db demo_tableOK table_stateNORMALputadviskv put demo_db demo_table hello worldOKgetadviskv get demo_db demo_table helloOK value“world”adviskv delete demo_db demo_table helloOKrouteadviskv route demo_db demo_table helloRoutetable: demo_db.demo_tablekey: helloshard: table_id1 shard_id2replicas:- replica_id1:2:0 endpoint127.0.0.1:50051 roleLEADER- replica_id1:2:1 endpoint127.0.0.1:50052 roleFOLLOWER- replica_id1:2:2 endpoint127.0.0.1:50053 roleFOLLOWERkey hello 会先定位到 table 某个 shard然后 SDK 再通过 SDM 查询该 shard 对应的 route通过 route 上的 endpoint最终把请求发送到对应的 leader 的 Storage 节点这里是副本的扩容缩容alter_tableadviskv alter_table demo_db demo_table 2OK table_id1 replica_count2然后关于这个KV我们目前支持的操作就是最基本的同步的putgetdelete。关于这些操作是交给我们的sdk模块使用的。我们可以创建一个KVClient进行putget等操作。这里顺手说一下CLI 里面命令可以写 deleteSDK 里面对应的方法名叫 del。这个是我们简单的SDK的使用方式arduino#include#include “sdk/client.h”int main() {adviskv::sdk::KVClientConf conf;conf.db_name “demo_db”;conf.table_name “demo_table”;conf.sdm_host “127.0.0.1”;conf.sdm_port 50049;conf.sdm_timeout_ms 3000;conf.storage_timeout_ms 3000;adviskv::sdk::KVClient client(conf); adviskv::Status put_status client.put(hello, world); if (put_status.fail()) { std::cerr put_status.to_string() std::endl; return 1; } adviskv::Value value; adviskv::Status get_status client.get(hello, value); if (get_status.ok()) { std::cout value std::endl; // value:world } return 0;}Minimal Overview整体架构的粗略介绍这个项目主要是分为了四个模块: metasdm storage sdk。SDK先来说一下最外层的sdksdk其实本身并不算是隶属在分布式KV里面的服务端模块它就是一个客户端库给使用者执行putget这种操作。拿 put 操作来说在当前版本里sdk 会先向 sdm 查询 route也就是路由表。这个 route 里面包含当前 db/table 对应的 shard 信息以及每个 shard 下面的 replica 节点信息。sdk 根据 key 算出它应该落在哪一个 shard 上然后从这个 shard 的 replica 列表里面找到 leader 节点然后直接给这个节点发送put操作。删除操作也是这个样子。值得一提的是在我们的V1版本里面get操作也是只有leader才可以执行。后续版本会考虑优化这里MetaMinimal architecture diagram:这个模块主要负责 DDL 和 DB/Table 这些元信息。创建 table 的时候请求会先打到 Meta。Meta 收到 CreateTable 之后会先在自己的 catalog 里面记录这个 table并把 table 状态标记成创建中的状态。然后 Meta 会向 SDM 发送 PlaceTable 请求让 SDM 去负责后续的 replica 放置和 route 生成。这里需要注意的是CreateTable 返回成功并不一定代表这个 table 立刻就已经可以读写了。这个接口本身是一个异步操作返回的OK只是代表meta这边接受了这个DDL并不保证DDL最后一定会成功。后续 table 是否真正 ready主要是取决 Meta 和 SDM 里的后台 reconciler 能否把状态推进到最终状态。后面做副本数调整之后这里也多了 AlterTableReplicaCount。用户发起 alter_table 的时候Meta 会先把 catalog 里面的 replica_count 和状态改掉然后通知 SDM 去把每个 shard 的目标副本数调到新值。这个过程也不是同步等所有 replica 都调整完最后还是靠后台 reconciler 推回来。而创建db这种操作的话就不会发送给sdm因为像DB这边的概念是只有meta才会知晓的概念sdm那边不会在乎db也不会持久化db。sdm侧应当只会关心table以及对应的shard_count和replica_count来进行编排。虽然sdk通过传递db_name和table_name和hash(key)找到路由表但是db_name这个其实是附在table上的所以对于db而言不需要往sdm知道sdm只需要了解到table的内容其实就可以了。SDMMinimal architecture diagram:

相关新闻

Cursor收购案解析:AI编程工具的技术革新与行业影响

Cursor收购案解析:AI编程工具的技术革新与行业影响

1. 项目概述:Cursor收购案的行业震动2023年6月,SpaceX以全股票交易方式收购AI编程工具Cursor的消息在科技圈引发轩然大波。这笔交易的特殊性不仅体现在600亿美元的惊人估值上,更在于其背后反映出的AI行业新动向。作为一款2022年才面世的AI编程…

2026/10/15 10:40:14 阅读更多 →
Cursor的Token经济模型与开发者效率优化实践

Cursor的Token经济模型与开发者效率优化实践

1. 项目概述:Cursor与Token的经济账作为一名长期混迹在开发者社区的码农,我最近发现一个有趣的现象:越来越多的同行开始在薪资并不丰厚的背景下,悄悄为Cursor这个AI编程工具续费。月薪8000元左右的开发者群体,正在成为…

2026/10/5 13:49:22 阅读更多 →
AI编程助手环境配置与开发集成实战:Claude与GPT安装使用指南

AI编程助手环境配置与开发集成实战:Claude与GPT安装使用指南

在实际开发工作中,AI辅助编程工具已经成为提升效率的重要助手。GPT和Claude作为两大主流AI编程助手,各自有着不同的技术特性和使用场景。对于开发者来说,了解如何正确安装、配置和使用这些工具,以及解决常见的环境问题和错误提示&…

2026/10/11 20:12:55 阅读更多 →

最新新闻

SAP作业调度集成:BC_EXT_APPJOB_MANAGEMENT实战指南

SAP作业调度集成:BC_EXT_APPJOB_MANAGEMENT实战指南

1. 项目背景与核心价值企业级应用系统之间的作业调度集成一直是IT架构中的关键痛点。当SAP系统需要与外部调度器(如Control-M、Autosys、Tidal等)进行深度整合时,传统方案往往面临两大困境:要么依赖笨重的中间文件传输&#xff0c…

2026/10/15 10:41:43 阅读更多 →
快递物流轨迹订阅推送接口整理与使用教程

快递物流轨迹订阅推送接口整理与使用教程

id"wenyan">快递物流轨迹订阅推送接口整理与使用教程说明:本文基于公开文档与网上流传的接入写法整理,未对每个接口做真实请求实测,接口可用性以公开文档为准,集成前请自行发请求验证。写在前面做电商、仓储、客服系…

2026/10/15 10:41:43 阅读更多 →
PCI 3.0规范工程实践:配置空间、MSI中断与排障要点

PCI 3.0规范工程实践:配置空间、MSI中断与排障要点

简介:《PCI Local Bus Specification R3.0》是PCI-SIG发布的PCI局部总线规范3.0版官方PDF文档,面向硬件工程师、驱动开发者及计算机体系结构学习者,用于理解高速32/64位复用地址数据总线在高度集成外设、扩展卡与处理器/内存系统间的互连机制…

2026/10/15 10:41:43 阅读更多 →
AHP协议与Dev Container:AI智能体如何真正进入开发环境操作容器

AHP协议与Dev Container:AI智能体如何真正进入开发环境操作容器

升级一周,我把VS Code更新到了最新版本,最大的感受不是界面又换了什么皮肤,也不是哪个扩展多了几个按钮,而是AI智能体正在从"旁边给建议的助手"变成"真的能上手干活的操作员"。这次更新里最值得关注的一件事&…

2026/10/15 10:41:43 阅读更多 →
EfficientNet骨干网络替换YOLOv3:Pytorch实现与优化指南

EfficientNet骨干网络替换YOLOv3:Pytorch实现与优化指南

1. 项目概述与整体思路拆解 最早接触YOLOv3的时候,用的是原始的Darknet53作为骨干特征提取网络。后来做项目时遇到一个很现实的问题:模型参数量不够精简,在边缘设备上推理速度总差一口气,而且对尺度过小的目标召回率不太理想。当时…

2026/10/15 10:41:43 阅读更多 →
从线上事故到生产级Celery定时任务体系搭建实战

从线上事故到生产级Celery定时任务体系搭建实战

1. 从一次线上事故说起:为什么我最终选了Celery做定时任务去年冬天的一个凌晨,我被报警电话吵醒。一个跑了半年的数据同步脚本突然不执行了,导致下游三个业务模块的数据全部延迟了六个小时。排查下来原因很朴素:那台服务器上跑着七…

2026/10/15 10:40:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →