尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

基于Raft分布式Kv存储:Kvserver怎么与上层KvDB沟通?

基于Raft分布式Kv存储:Kvserver怎么与上层KvDB沟通?
📅 发布时间:2026/7/30 2:21:00

这里需要先澄清:项目里的“上层 KVDB”并不是独立进程,也没有通过 RPC 与KvServer通信。

KVDB 就是KvServer内部持有的跳表对象:

class KvServer { private: SkipList<std::string, std::string> m_skipList; };

因此两者通过普通的 C++ 成员函数调用沟通。

```mermaid flowchart TD C["Clerk 客户端"] -->|"RPC"| K["KvServer RPC 接口"] K -->|"Start(Op)"| R["本机 Raft"] R -->|"已提交 ApplyMsg"| AC["applyChan"] AC --> A["KvServer 应用线程"] A -->|"insert_set_element"| DB["跳表 KVDB"] K -->|"search_element"| DB ```

写操作
客户端发送 Put 后:

Clerk → KvServer::PutAppend() → Raft::Start(op) → Raft 集群复制并提交日志 → applyChan → KvServer::GetCommandFromRaft() → ExecutePutOpOnKVDB() → m_skipList.insert_set_element()

关键代码:

void KvServer::ExecutePutOpOnKVDB(Op op) { m_mtx.lock(); m_skipList.insert_set_element(op.Key, op.Value); m_lastRequestId[op.ClientId] = op.RequestId; m_mtx.unlock(); }

见 [kvServer.cpp (line 66)](/C:/Users/LENOVO/Desktop/KVstorageBaseRaft-cpp-main/src/raftCore/kvServer.cpp:66)。

最重要的一点是:KvServer 收到 Put RPC 后不会立即写跳表,必须等 Raft 日志提交后才能写。

Raft 如何通知 KvServer
KvServer和本机Raft共享一个队列:

std::shared_ptr<LockQueue<ApplyMsg>> applyChan;

初始化 Raft 时传进去:

m_raftNode->init(servers, m_me, persister, applyChan);

Raft 提交日志后执行:

applyChan->Push(message);

KvServer 一直阻塞读取:

void KvServer::ReadRaftApplyCommandLoop() { while (true) { auto message = applyChan->Pop(); if (message.CommandValid) { GetCommandFromRaft(message); } if (message.SnapshotValid) { GetSnapShotFromRaft(message); } } }

见 [kvServer.cpp (line 281)](/C:/Users/LENOVO/Desktop/KVstorageBaseRaft-cpp-main/src/raftCore/kvServer.cpp:281)。

随后GetCommandFromRaft()解析Op并修改 KVDB:

if (!ifRequestDuplicate(op.ClientId, op.RequestId)) { if (op.Operation == "Put") { ExecutePutOpOnKVDB(op); } if (op.Operation == "Append") { ExecuteAppendOpOnKVDB(op); } }

读操作
Get 也先进入 Raft,提交后唤醒等待的 RPC 线程,最后直接查询跳表:

m_skipList.search_element(op.Key, *value);

对应流程:

KvServer::Get() → Raft::Start(GetOp) → 等待该日志提交 → ExecuteGetOpOnKVDB() → m_skipList.search_element() → 返回 value

Get 进入 Raft 的目的,是保证读取发生在之前已经提交的写操作之后,提供线性一致读。

快照通信
KvServer 制作快照时直接调用跳表:

m_serializedKVData = m_skipList.dump_file();

恢复快照时:

m_skipList.load_file(m_serializedKVData);

所以 KvServer 和 KVDB 之间有三类直接调用:

写入:insert_set_element(key, value) 读取:search_element(key, value) 快照:dump_file() / load_file()

相关新闻

  • 免费解锁Microsoft 365完整功能:Ohook开源激活方案完全指南
  • 四足机器人ROS仿真控制:从零到一的完整实战指南
  • 2026 年当下,井冈山正规的吉安腾米厨电生产商哪家强,厨房的烟火气被重新定义?这款吉安腾米厨电凭什么悄悄成了主妇的心头好?-腾米厨电 - 行业甄选官

最新新闻

  • # 鸿蒙 HarmonyOS 应用开发实战(第38期)|密码锁(Password Lock)— Grid 网格键盘与四阶段状态机
  • 协助企业申请Google Play帐号、上架
  • Java开发环境搭建全攻略:从JDK安装、环境变量配置到多版本管理
  • R语言生信分析环境搭建:从CRAN、Bioconductor到GitHub的完整部署指南
  • 终极暗黑破坏神2高清补丁:D2DX三步安装教程与画质革命
  • CI 中的测试策略分层:smoke、integration 与 e2e 的执行时机

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号