{"repo":"advisedy/adviskv","free":true,"listed":false,"github":"https://github.com/advisedy/adviskv","clone":"git clone https://github.com/advisedy/adviskv.git","description":"C++17 分布式 KV 存储 / distributed key-value store · Raft · shard routing · replica resize · recovery","language":"C++","stars":15,"topics":["cpp","cpp17","database","distributed-system","grpc","key-value-store","protobuf","raft","snapshot","storage-engine"],"license":"MIT","category":"databases-storage","readme_excerpt":"AdvisKV C++17 分布式 KV 存储系统 库表管理 · 分片路由 · Raft 复制 · 副本数调整 · 故障恢复 English · 快速开始 · 设计博客 · Benchmark · 当前限制 --- 项目简介 AdvisKV 是我用 C++17 从零实现的分布式 Key-Value 存储系统。客户端以 db + table + key 访问数据：Catalog 管理库表与 DDL，Topo 管理节点、分片副本与路由，Storage 通过 Raft 复制写入，并配合 WAL / Snapshot 做持久化与恢复，SDK 将请求路由到对应分片 Leader。 当前版本为 v0.1.0 。已支持能力见下一节，边界见文末 当前限制；更细的说明与链接见 版本说明。 目前支持 - 库表与分片路由 ：支持建库、建表和基本 DDL；SDK 按 db + table + key 获取路由，并把请求发送到对应分片的 Leader。 - 副本数在线调整与坏副本替换 ： AlterTableReplicaCount 支持从 0 个副本启动、缩容到 0 个以及 N → M 。副本进入 LOST 或 ERROR 后，Topo 会清理旧副本并补充新副本，Storage 通过 Raft 成员变更将其加入集群。 - Raft 复制与恢复 ：Storage 使用 Raft 复制 KV 写入，并通过 WAL、Snapshot、日志追赶和重启恢复保持副本状态；选举侧实现了 PreVote，降低旧 Leader 网络恢复后干扰新 Leader 的情况。 - SDK 重试和幂等 ：SDK 支持路由刷新和请求重试。Put/Delete 可以带上 request id ，相同写重试不会被重复执行；若最终无法确认是否提交则返回 UNKNOWN。Leader 故障切主场景下，写失败比例相关验收见 SDK 重试验收。 - 测试与状态观测 ：GoogleTest 覆盖 Raft、Replica、WAL、Snapshot 等模块，Python E2E 覆盖多进程链路；服务端和 SDK 提供日志与 metrics。本地 benchmark 见 v0.1.0 Benchmark。 快速开始 环境要求：推荐使用 Linux（Ubuntu 24.04）、C++17 编译器、CMake 3.20+、Ninja、Git 和 Python 3。 首次构建前初始化依赖： 如果需要运行 Maelstrom 测试，把上面的 setup 命令替换为： 启动本地集群并打开 adviskvctl ： 在交互式 shell 中执行： 本地演示： Demo 退出时会清理本地进程；也可以手动执行： 手动构建 也可以通过环境变量选择构建类型或目标： 主要二进制位于 build/bin/ 。 架构 模块 作用 --- --- Catalog 保存库表定义，处理建库、建表和其他 DDL。 Topo 管理 Storage 节点、分片副本和路由，推进副本状态变化。 Storage 为分片提供 KV 读写，用 Raft、WAL 和 Snapshot 完成复制与恢复。 SDK 获取并缓存路由，将请求发送到对应分片的 Storage Leader。 一次写请求的大致路径： 数据面时序： 模块图： - Topo 最小架构 - Storage 最小架构 - Catalog 最小架构 测试 运行测试： 如果本地已经安装 Maelstrom，还会先运行一个无故障的 3 节点 Raft 测试，再运行一个 5 节点的故障注入压力测试，否则跳过 M","default_branch":null,"files":null,"tree":[],"storefront":"/r/advisedy","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/advisedy/adviskv/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}