本文档详细列出了 MetaStore 项目中已实现的 etcd v3 兼容接口、实现程度以及已知缺陷。
生成日期: 2025-10-27
项目路径: /Users/bast/code/MetaStore
接口包位置: api/etcd/
MetaStore 当前实现了 4 个主要的 etcd v3 gRPC 服务:
- KV Service - 键值存储服务
- Watch Service - 监听服务
- Lease Service - 租约服务
- Maintenance Service - 维护服务
在 server.go:87-91 中注册的服务:
pb.RegisterKVServer(grpcSrv, &KVServer{server: s})
pb.RegisterWatchServer(grpcSrv, &WatchServer{server: s})
pb.RegisterLeaseServer(grpcSrv, &LeaseServer{server: s})
pb.RegisterMaintenanceServer(grpcSrv, &MaintenanceServer{server: s})实现文件: api/etcd/kv.go
| 接口 | 状态 | 实现位置 | 说明 |
|---|---|---|---|
| Range | ✅ 完全实现 | kv.go:32-63 | 支持单键查询、范围查询、limit、revision |
| Put | ✅ 完全实现 | kv.go:66-97 | 支持 PrevKv 选项、Lease 绑定 |
| DeleteRange | ✅ 完全实现 | kv.go:100-134 | 支持范围删除、PrevKv 选项 |
| Txn | ✅ 完全实现 | kv.go:137-177 | 支持 Compare-Then-Else 事务语义 |
| Compact | kv.go:180-189 | 接口已实现,底层行为可能简化 |
- ✅ 单键查询 (rangeEnd 为空)
- ✅ 范围查询 (指定 rangeEnd)
- ✅ 前缀查询 (使用 "\x00" 作为 rangeEnd)
- ✅ Limit 限制返回数量
- ✅ Revision 历史查询
- ✅ More 标识是否有更多数据
- ✅ Count 返回匹配数量
- ✅ PrevKv 返回旧值
- ✅ Lease 绑定
- ✅ 自动更新 Version 和 Revision
- ✅ 单键删除
- ✅ 范围删除
- ✅ PrevKv 返回被删除的值
- ✅ 返回删除数量
- ✅ Compare 条件支持:
- VERSION - 版本比较
- CREATE - 创建 revision 比较
- MOD - 修改 revision 比较
- VALUE - 值比较
- LEASE - 租约比较
- ✅ Compare 结果支持:EQUAL, GREATER, LESS, NOT_EQUAL
- ✅ Then/Else 操作支持:Range, Put, Delete, 嵌套 Txn
- ✅ 原子性保证
- ✅ 返回操作响应列表
实现文件: api/etcd/watch.go
| 接口 | 状态 | 实现位置 | 说明 |
|---|---|---|---|
| Watch | ✅ 完全实现 | watch.go:32-53 | 流式 Watch 服务 |
| CreateWatch | ✅ 完全实现 | watch.go:56-103 | 创建 watch 订阅 |
| CancelWatch | ✅ 完全实现 | watch.go:124-138 | 取消 watch 订阅 |
| SendEvents | ✅ 完全实现 | watch.go:141-204 | 异步发送事件 |
- ✅ PrevKV - 返回修改前的键值对
- ✅ ProgressNotify - 周期性进度通知
- ✅ Filters - 事件过滤
- FilterNoPut - 过滤 PUT 事件
- FilterNoDelete - 过滤 DELETE 事件
- ✅ Fragment - 大 revision 分片
- ✅ 单键监听
- ✅ 范围监听
- ✅ 前缀监听
- ✅ 历史事件回放 (StartRevision)
- ✅ 客户端指定 WatchId
- ✅ 服务端生成 WatchId
- ✅ 事件类型:PUT, DELETE
- ✅ 流式事件推送
- ✅ 自动清理失败的 watch
- 使用 WatchManager 统一管理所有 watch
- 每个 watch 有独立的事件通道
- 异步 goroutine 发送事件,避免阻塞
- 发送失败自动取消 watch
实现文件: api/etcd/lease.go
| 接口 | 状态 | 实现位置 | 说明 |
|---|---|---|---|
| LeaseGrant | ✅ 完全实现 | lease.go:30-50 | 创建租约 |
| LeaseRevoke | ✅ 完全实现 | lease.go:53-64 | 撤销租约 |
| LeaseKeepAlive | ✅ 完全实现 | lease.go:67-92 | 流式续约 |
| LeaseTimeToLive | ✅ 完全实现 | lease.go:95-120 | 查询租约剩余时间 |
| Leases | ✅ 完全实现 | lease.go:123-140 | 列出所有租约 |
- ✅ 自定义 Lease ID
- ✅ 自动生成 Lease ID
- ✅ TTL 过期时间管理
- ✅ 自动过期检查
- ✅ 过期自动删除关联的键
- ✅ 流式 KeepAlive(持续续约)
- ✅ 查询剩余时间
- ✅ 查询关联的键列表
- ✅ 列出所有租约
- 使用 LeaseManager 统一管理
- 后台 goroutine 定期检查过期租约(每秒)
- 租约过期时自动删除所有关联的键
- 续约时重置 GrantTime
实现文件: api/etcd/maintenance.go
| 接口 | 状态 | 实现位置 | 说明 |
|---|---|---|---|
| Alarm | maintenance.go:30-35 | 总是返回空告警列表 | |
| Status | maintenance.go:38-54 | 返回基本状态,部分字段简化 | |
| Defragment | ❌ TODO | maintenance.go:57-62 | 仅占位实现 |
| Hash | ❌ TODO | maintenance.go:65-71 | 仅占位实现,返回 0 |
| HashKV | ❌ TODO | maintenance.go:74-80 | 仅占位实现,返回 0 |
| Snapshot | ✅ 完全实现 | maintenance.go:83-109 | 支持流式快照传输 |
| MoveLeader | ❌ TODO | maintenance.go:112-117 | 仅占位实现 |
| Downgrade | ❌ TODO | maintenance.go:120-125 | 仅占位实现 |
Version: "3.6.0-compatible" // 固定版本号
DbSize: dbSize // ✅ 实际计算快照大小
Leader: s.server.memberID // ⚠️ 简化:假设当前节点是 leader
RaftIndex: CurrentRevision() // ✅ 返回当前 revision
RaftTerm: 1 // ⚠️ 简化:固定返回 1- ✅ 流式传输,分块发送(每块 4MB)
- ✅ RemainingBytes 进度指示
- ✅ 支持大快照传输
根据 prompt/add_etcd_api_compatible_interface.md 的要求,以下服务是必需但尚未实现的:
状态: ❌ 完全未实现
缺失的接口:
- AuthEnable / AuthDisable - 启用/禁用认证
- Authenticate - 用户认证
- UserAdd / UserDelete / UserChangePassword / UserGrantRole / UserRevokeRole / UserGet / UserList - 用户管理
- RoleAdd / RoleDelete / RoleGrantPermission / RoleRevokePermission / RoleGet / RoleList - 角色管理
影响:
- 无法保护敏感数据
- 无法控制客户端访问权限
- 生产环境存在安全风险
prompt 要求:
Authentication/Authorization(如启用):用户/角色管理、Token 验证(如果产品需求包含)
状态: ❌ 完全未实现
缺失的接口:
- MemberAdd - 添加成员
- MemberRemove - 删除成员
- MemberUpdate - 更新成员
- MemberList - 列出成员
- MemberPromote - 提升成员
影响:
- 无法动态管理集群成员
- 无法实现集群扩缩容
- 集群配置固定,缺乏灵活性
prompt 要求:
Maintenance/Cluster 管理 API(至少提供与客户端期望的 API 路由/错误码)
状态: ❌ 未提供高层接口
缺失功能:
- etcd concurrency 包兼容的 Lock/Unlock API
- Session 管理
- Election 选举
现状:
- 底层 Txn + Lease 机制已实现,理论上可以支持
- 但没有提供兼容
go.etcd.io/etcd/client/v3/concurrency的高层接口
prompt 要求:
Lock/Concurrency 高层接口(通过 Lease + txn 实现,兼容 etcd 的 concurrency 包行为,至少保证常用锁/会话语义)
位置: server.go:140
RaftTerm: 0, // TODO: 从 Raft 获取 term问题:
- 响应头中的 RaftTerm 总是返回 0
- Status API 中返回固定值 1
- 无法反映真实的 Raft Term
影响:
- 客户端无法准确判断 Raft 状态变化
- 可能影响某些依赖 RaftTerm 的客户端逻辑
Leader: s.server.memberID, // 简化:当前节点就是 leader问题:
- Status API 总是假设当前节点是 leader
- 没有真正检查 Raft leader 状态
影响:
- 客户端可能收到错误的 leader 信息
- 影响客户端的负载均衡和重定向逻辑
func (s *MaintenanceServer) Defragment(...) (*pb.DefragmentResponse, error) {
// TODO: 实现数据库碎片整理
return &pb.DefragmentResponse{...}, nil
}问题: 仅返回成功响应,未执行任何碎片整理
影响:
- Pebble 长期运行后可能出现碎片
- 无法优化存储空间使用
Hash: 0, // 占位问题: 总是返回 0
影响:
- 无法进行数据一致性校验
- 集群节点间无法比对数据哈希
问题: 仅占位实现
影响:
- 无法手动转移 leader
- 运维场景受限(如升级、维护)
问题: 总是返回空告警列表
影响:
- 无法检测和报告系统告警
- 如存储空间不足、数据不一致等问题无法感知
位置: errors.go
需要验证所有错误码是否与 etcd 客户端预期一致:
- codes.NotFound
- codes.FailedPrecondition
- codes.InvalidArgument
- codes.ResourceExhausted
- 等等
某些边界情况可能与 etcd 原生行为有差异:
- 空 key 处理
- revision 0 的语义
- compact 后的历史查询行为
- watch 断线重连行为
当前实现:
- 每个 watch 一个 goroutine 发送事件
- 大量 watch 可能导致 goroutine 泄漏
建议:
- 添加 watch 数量限制
- 实现连接池管理
- 添加超时和资源回收机制
当前实现:
- 每秒全量扫描所有租约
建议:
- 使用优先队列优化过期检查
- 大量租约时性能可能下降
当前实现:
- 一次性加载整个快照到内存
建议:
- 对于大数据集可能导致 OOM
- 考虑流式读取或增量快照
- ✅ Memory 引擎单节点测试
- ✅ Pebble 引擎单节点测试
- ✅ Memory 引擎集群一致性测试
- ✅ Pebble 引擎集群一致性测试
- ✅ KV 基本操作:Put, Get, Delete
- ✅ Range 查询
- ✅ Transaction(单节点 + 集群)
- ✅ Watch(单节点 + 集群)
- ✅ Lease(grant, revoke, keepalive, 过期)
- ✅ 跨协议访问(HTTP + etcd)
- ❌ Compact 功能测试
- ❌ Snapshot 恢复测试
- ❌ 大规模数据集性能测试
- ❌ 并发压力测试
- ❌ 故障恢复测试
- ❌ Leader 切换测试
| 功能要求 | 实现状态 | 完成度 | 备注 |
|---|---|---|---|
| KV 基本操作 | ✅ 完全实现 | 100% | Range, Put, Delete 全部支持 |
| Watch | ✅ 完全实现 | 100% | 创建、取消、事件类型、历史事件、流式 watch 全部支持 |
| Lease | ✅ 完全实现 | 100% | grant, revoke, keepalive, 绑定 key, 过期行为全部支持 |
| Authentication/Authorization | ❌ 未实现 | 0% | 完全缺失,严重不符合要求 |
| Maintenance/Cluster API | 40% | Snapshot 完整,Status 简化,其他 TODO | |
| Lock/Concurrency 高层接口 | ❌ 未实现 | 0% | 无高层接口,不符合要求 |
| 错误语义、错误码 | 70% | 已实现 toGRPCError,需全面验证 |
| 功能要求 | 实现状态 | 完成度 | 备注 |
|---|---|---|---|
| Txn(事务) | ✅ 完全实现 | 100% | Compare-Then-Else 全部支持 |
| Compact、Revision | 80% | 接口实现,行为可能简化 |
| 验收标准 | 符合情况 | 说明 |
|---|---|---|
| 使用 clientv3 对接并完成基本操作 | ✅ 符合 | 测试中使用 clientv3,Put/Get/Txn/Watch/Lease 均通过 |
| 10 个 API 用例自动化测试 | ✅ 符合 | test/ 目录下有完整集成测试 |
| txn 语义一致性 | ✅ 符合 | Compare-Then-Else 原子性已验证 |
| lease 到期删除 key | ✅ 符合 | 已实现并测试 |
| HTTP API 与 etcd 兼容层独立包 | ✅ 符合 | api/http vs api/etcd 分离 |
| 示例代码可运行 | 测试用例可作为示例,缺少独立 examples/ 目录 |
-
实现 Auth Service - prompt 明确要求的必须功能
- 用户/角色管理
- Token 验证
- 权限控制
-
实现 Lock/Concurrency 高层接口 - prompt 明确要求
- 兼容 etcd concurrency 包
- 提供 Lock/Unlock/Session/Election API
-
完善 Cluster 管理 API - prompt 要求至少提供 API 路由
- 实现 MemberList(最低要求)
- 提供正确的错误码
- 修复 RaftTerm 硬编码 - 影响客户端判断
- 修复 Leader 检测 - Status API 应返回真实 leader
- 实现 Defragment - Pebble 长期运行必需
- 实现 Hash/HashKV - 数据一致性校验必需
- 实现 Alarm 机制 - 生产监控必需
- Watch 连接管理优化 - 添加限流和资源控制
- Lease 过期检查优化 - 使用优先队列提升性能
- Snapshot 内存优化 - 避免大数据集 OOM
- 完善错误码映射 - 全面验证与 etcd 一致性
- 补充边界测试 - Compact、故障恢复等
- 创建 examples/ 目录 - 提供独立示例代码
- 创建 limitations.md - prompt 要求明确列出限制
- 性能测试报告 - 提供性能基准数据
MetaStore 成功实现了 etcd v3 协议的核心数据面功能:
✅ 数据操作层:KV 操作(Range, Put, Delete)完全兼容 ✅ 事务支持:Txn 语义完整实现,Compare-Then-Else 原子性保证 ✅ 实时监听:Watch 服务功能完整,支持历史回放和过滤 ✅ 租约管理:Lease 生命周期管理完整,自动过期清理 ✅ 双引擎支持:Memory 和 Pebble 两种引擎均通过测试 ✅ 集群一致性:Raft 共识保证集群数据一致 ✅ 跨协议访问:HTTP API 和 etcd API 共享存储
❌ Auth Service 完全未实现 - 无法保护生产数据
❌ Lock/Concurrency 高层接口缺失 - 不符合 prompt 要求
❌ Cluster 管理 API 缺失 - 动态集群管理受限
核心功能完成度: 85%(KV + Watch + Lease + Txn 完整) prompt 要求符合度: 65%(缺少 Auth、Lock、部分 Maintenance) 生产可用性: 60%(缺少安全认证和完整运维工具)
主要优势:
- etcd 客户端可直接使用,数据面兼容性好
- 集成测试完整,质量有保证
- 双引擎支持,灵活性高
主要风险:
- 缺少认证授权,安全性不足
- 缺少分布式锁高层接口,应用场景受限
- 部分运维功能不完整
- 实现基础 Auth Service(UserAdd, Authenticate, Token 验证)
- 实现 Cluster MemberList API(至少返回当前成员信息)
- 修复 RaftTerm 和 Leader 检测
- 创建 docs/limitations.md 文档
- 补充 examples/ 示例代码
- 实现完整 Auth/Authorization(角色、权限)
- 实现 Lock/Concurrency 高层接口
- 实现 Defragment、Hash、MoveLeader
- 优化 Watch、Lease 性能
- 完善集成测试(Compact、故障恢复)
- 实现完整 Cluster 管理
- 性能优化和基准测试
- 生产环境验证和调优
- 文档完善和社区推广
文档版本: v1.0 最后更新: 2025-10-27