Skip to content

Latest commit

 

History

History
558 lines (410 loc) · 17.5 KB

File metadata and controls

558 lines (410 loc) · 17.5 KB

MetaStore etcd 接口实现状态报告

概述

本文档详细列出了 MetaStore 项目中已实现的 etcd v3 兼容接口、实现程度以及已知缺陷。

生成日期: 2025-10-27 项目路径: /Users/bast/code/MetaStore 接口包位置: api/etcd/


已实现的 etcd 服务

MetaStore 当前实现了 4 个主要的 etcd v3 gRPC 服务:

  1. KV Service - 键值存储服务
  2. Watch Service - 监听服务
  3. Lease Service - 租约服务
  4. 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})

1. KV Service - 键值存储服务

实现文件: api/etcd/kv.go

1.1 已实现的接口

接口 状态 实现位置 说明
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 接口已实现,底层行为可能简化

1.2 支持的特性

Range 查询特性

  • ✅ 单键查询 (rangeEnd 为空)
  • ✅ 范围查询 (指定 rangeEnd)
  • ✅ 前缀查询 (使用 "\x00" 作为 rangeEnd)
  • ✅ Limit 限制返回数量
  • ✅ Revision 历史查询
  • ✅ More 标识是否有更多数据
  • ✅ Count 返回匹配数量

Put 操作特性

  • ✅ PrevKv 返回旧值
  • ✅ Lease 绑定
  • ✅ 自动更新 Version 和 Revision

DeleteRange 操作特性

  • ✅ 单键删除
  • ✅ 范围删除
  • ✅ PrevKv 返回被删除的值
  • ✅ 返回删除数量

Transaction 事务特性

  • ✅ Compare 条件支持:
    • VERSION - 版本比较
    • CREATE - 创建 revision 比较
    • MOD - 修改 revision 比较
    • VALUE - 值比较
    • LEASE - 租约比较
  • ✅ Compare 结果支持:EQUAL, GREATER, LESS, NOT_EQUAL
  • ✅ Then/Else 操作支持:Range, Put, Delete, 嵌套 Txn
  • ✅ 原子性保证
  • ✅ 返回操作响应列表

2. Watch Service - 监听服务

实现文件: api/etcd/watch.go

2.1 已实现的接口

接口 状态 实现位置 说明
Watch ✅ 完全实现 watch.go:32-53 流式 Watch 服务
CreateWatch ✅ 完全实现 watch.go:56-103 创建 watch 订阅
CancelWatch ✅ 完全实现 watch.go:124-138 取消 watch 订阅
SendEvents ✅ 完全实现 watch.go:141-204 异步发送事件

2.2 支持的特性

Watch 选项

  • PrevKV - 返回修改前的键值对
  • ProgressNotify - 周期性进度通知
  • Filters - 事件过滤
    • FilterNoPut - 过滤 PUT 事件
    • FilterNoDelete - 过滤 DELETE 事件
  • Fragment - 大 revision 分片

Watch 功能

  • ✅ 单键监听
  • ✅ 范围监听
  • ✅ 前缀监听
  • ✅ 历史事件回放 (StartRevision)
  • ✅ 客户端指定 WatchId
  • ✅ 服务端生成 WatchId
  • ✅ 事件类型:PUT, DELETE
  • ✅ 流式事件推送
  • ✅ 自动清理失败的 watch

2.3 实现细节

  • 使用 WatchManager 统一管理所有 watch
  • 每个 watch 有独立的事件通道
  • 异步 goroutine 发送事件,避免阻塞
  • 发送失败自动取消 watch

3. Lease Service - 租约服务

实现文件: api/etcd/lease.go

3.1 已实现的接口

接口 状态 实现位置 说明
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 列出所有租约

3.2 支持的特性

Lease 功能

  • ✅ 自定义 Lease ID
  • ✅ 自动生成 Lease ID
  • ✅ TTL 过期时间管理
  • ✅ 自动过期检查
  • ✅ 过期自动删除关联的键
  • ✅ 流式 KeepAlive(持续续约)
  • ✅ 查询剩余时间
  • ✅ 查询关联的键列表
  • ✅ 列出所有租约

3.3 实现细节

  • 使用 LeaseManager 统一管理
  • 后台 goroutine 定期检查过期租约(每秒)
  • 租约过期时自动删除所有关联的键
  • 续约时重置 GrantTime

4. Maintenance Service - 维护服务

实现文件: api/etcd/maintenance.go

4.1 已实现的接口

接口 状态 实现位置 说明
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 仅占位实现

4.2 Status 返回字段

Version:   "3.6.0-compatible"  // 固定版本号
DbSize:    dbSize              // ✅ 实际计算快照大小
Leader:    s.server.memberID   // ⚠️ 简化:假设当前节点是 leader
RaftIndex: CurrentRevision()   // ✅ 返回当前 revision
RaftTerm:  1                   // ⚠️ 简化:固定返回 1

4.3 Snapshot 特性

  • ✅ 流式传输,分块发送(每块 4MB)
  • ✅ RemainingBytes 进度指示
  • ✅ 支持大快照传输

未实现的 etcd 服务

根据 prompt/add_etcd_api_compatible_interface.md 的要求,以下服务是必需但尚未实现的:

1. Auth Service - 认证授权服务

状态: ❌ 完全未实现

缺失的接口:

  • AuthEnable / AuthDisable - 启用/禁用认证
  • Authenticate - 用户认证
  • UserAdd / UserDelete / UserChangePassword / UserGrantRole / UserRevokeRole / UserGet / UserList - 用户管理
  • RoleAdd / RoleDelete / RoleGrantPermission / RoleRevokePermission / RoleGet / RoleList - 角色管理

影响:

  • 无法保护敏感数据
  • 无法控制客户端访问权限
  • 生产环境存在安全风险

prompt 要求:

Authentication/Authorization(如启用):用户/角色管理、Token 验证(如果产品需求包含)

2. Cluster Service - 集群管理服务

状态: ❌ 完全未实现

缺失的接口:

  • MemberAdd - 添加成员
  • MemberRemove - 删除成员
  • MemberUpdate - 更新成员
  • MemberList - 列出成员
  • MemberPromote - 提升成员

影响:

  • 无法动态管理集群成员
  • 无法实现集群扩缩容
  • 集群配置固定,缺乏灵活性

prompt 要求:

Maintenance/Cluster 管理 API(至少提供与客户端期望的 API 路由/错误码)

3. Lock/Concurrency 高层接口

状态: ❌ 未提供高层接口

缺失功能:

  • etcd concurrency 包兼容的 Lock/Unlock API
  • Session 管理
  • Election 选举

现状:

  • 底层 Txn + Lease 机制已实现,理论上可以支持
  • 但没有提供兼容 go.etcd.io/etcd/client/v3/concurrency 的高层接口

prompt 要求:

Lock/Concurrency 高层接口(通过 Lease + txn 实现,兼容 etcd 的 concurrency 包行为,至少保证常用锁/会话语义)


已知缺陷和限制

1. 架构层面的简化

1.1 RaftTerm 硬编码

位置: server.go:140

RaftTerm:  0, // TODO: 从 Raft 获取 term

问题:

  • 响应头中的 RaftTerm 总是返回 0
  • Status API 中返回固定值 1
  • 无法反映真实的 Raft Term

影响:

  • 客户端无法准确判断 Raft 状态变化
  • 可能影响某些依赖 RaftTerm 的客户端逻辑

1.2 Leader 假设简化

位置: maintenance.go:50

Leader:    s.server.memberID,  // 简化:当前节点就是 leader

问题:

  • Status API 总是假设当前节点是 leader
  • 没有真正检查 Raft leader 状态

影响:

  • 客户端可能收到错误的 leader 信息
  • 影响客户端的负载均衡和重定向逻辑

2. Maintenance API 不完整

2.1 Defragment - 未实现

位置: maintenance.go:57-62

func (s *MaintenanceServer) Defragment(...) (*pb.DefragmentResponse, error) {
    // TODO: 实现数据库碎片整理
    return &pb.DefragmentResponse{...}, nil
}

问题: 仅返回成功响应,未执行任何碎片整理

影响:

  • Pebble 长期运行后可能出现碎片
  • 无法优化存储空间使用

2.2 Hash / HashKV - 未实现

位置: maintenance.go:65-80

Hash:   0, // 占位

问题: 总是返回 0

影响:

  • 无法进行数据一致性校验
  • 集群节点间无法比对数据哈希

2.3 MoveLeader - 未实现

位置: maintenance.go:112-117

问题: 仅占位实现

影响:

  • 无法手动转移 leader
  • 运维场景受限(如升级、维护)

2.4 Alarm - 空实现

位置: maintenance.go:30-35

问题: 总是返回空告警列表

影响:

  • 无法检测和报告系统告警
  • 如存储空间不足、数据不一致等问题无法感知

3. 错误处理和语义一致性

3.1 错误码映射

位置: errors.go

需要验证所有错误码是否与 etcd 客户端预期一致:

  • codes.NotFound
  • codes.FailedPrecondition
  • codes.InvalidArgument
  • codes.ResourceExhausted
  • 等等

3.2 边界行为

某些边界情况可能与 etcd 原生行为有差异:

  • 空 key 处理
  • revision 0 的语义
  • compact 后的历史查询行为
  • watch 断线重连行为

4. 性能和资源管理

4.1 Watch 连接管理

当前实现:

  • 每个 watch 一个 goroutine 发送事件
  • 大量 watch 可能导致 goroutine 泄漏

建议:

  • 添加 watch 数量限制
  • 实现连接池管理
  • 添加超时和资源回收机制

4.2 Lease 过期检查

当前实现:

  • 每秒全量扫描所有租约

建议:

  • 使用优先队列优化过期检查
  • 大量租约时性能可能下降

4.3 Snapshot 内存占用

当前实现:

  • 一次性加载整个快照到内存

建议:

  • 对于大数据集可能导致 OOM
  • 考虑流式读取或增量快照

5. 集成测试覆盖

5.1 已有测试

  • ✅ Memory 引擎单节点测试
  • ✅ Pebble 引擎单节点测试
  • ✅ Memory 引擎集群一致性测试
  • ✅ Pebble 引擎集群一致性测试

5.2 测试覆盖的功能

  • ✅ KV 基本操作:Put, Get, Delete
  • ✅ Range 查询
  • ✅ Transaction(单节点 + 集群)
  • ✅ Watch(单节点 + 集群)
  • ✅ Lease(grant, revoke, keepalive, 过期)
  • ✅ 跨协议访问(HTTP + etcd)

5.3 缺失的测试

  • ❌ Compact 功能测试
  • ❌ Snapshot 恢复测试
  • ❌ 大规模数据集性能测试
  • ❌ 并发压力测试
  • ❌ 故障恢复测试
  • ❌ Leader 切换测试

与 prompt 要求的对比

必须实现(最优先)- 完成度评估

功能要求 实现状态 完成度 备注
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/ 目录

优先级排序的问题列表

P0 - 必须解决(不符合 prompt 硬性要求)

  1. 实现 Auth Service - prompt 明确要求的必须功能

    • 用户/角色管理
    • Token 验证
    • 权限控制
  2. 实现 Lock/Concurrency 高层接口 - prompt 明确要求

    • 兼容 etcd concurrency 包
    • 提供 Lock/Unlock/Session/Election API
  3. 完善 Cluster 管理 API - prompt 要求至少提供 API 路由

    • 实现 MemberList(最低要求)
    • 提供正确的错误码

P1 - 重要(影响生产可用性)

  1. 修复 RaftTerm 硬编码 - 影响客户端判断
  2. 修复 Leader 检测 - Status API 应返回真实 leader
  3. 实现 Defragment - Pebble 长期运行必需
  4. 实现 Hash/HashKV - 数据一致性校验必需
  5. 实现 Alarm 机制 - 生产监控必需

P2 - 建议优化(提升质量)

  1. Watch 连接管理优化 - 添加限流和资源控制
  2. Lease 过期检查优化 - 使用优先队列提升性能
  3. Snapshot 内存优化 - 避免大数据集 OOM
  4. 完善错误码映射 - 全面验证与 etcd 一致性
  5. 补充边界测试 - Compact、故障恢复等

P3 - 文档和示例(提升易用性)

  1. 创建 examples/ 目录 - 提供独立示例代码
  2. 创建 limitations.md - prompt 要求明确列出限制
  3. 性能测试报告 - 提供性能基准数据

总结

已实现的核心价值

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 缺失 - 动态集群管理受限 ⚠️ Maintenance API 不完整 - 运维功能受限 ⚠️ 部分字段简化 - RaftTerm、Leader 状态等

整体评价

核心功能完成度: 85%(KV + Watch + Lease + Txn 完整) prompt 要求符合度: 65%(缺少 Auth、Lock、部分 Maintenance) 生产可用性: 60%(缺少安全认证和完整运维工具)

主要优势

  • etcd 客户端可直接使用,数据面兼容性好
  • 集成测试完整,质量有保证
  • 双引擎支持,灵活性高

主要风险

  • 缺少认证授权,安全性不足
  • 缺少分布式锁高层接口,应用场景受限
  • 部分运维功能不完整

建议的后续工作

短期目标(1-2 周)

  1. 实现基础 Auth Service(UserAdd, Authenticate, Token 验证)
  2. 实现 Cluster MemberList API(至少返回当前成员信息)
  3. 修复 RaftTerm 和 Leader 检测
  4. 创建 docs/limitations.md 文档
  5. 补充 examples/ 示例代码

中期目标(1-2 月)

  1. 实现完整 Auth/Authorization(角色、权限)
  2. 实现 Lock/Concurrency 高层接口
  3. 实现 Defragment、Hash、MoveLeader
  4. 优化 Watch、Lease 性能
  5. 完善集成测试(Compact、故障恢复)

长期目标(3-6 月)

  1. 实现完整 Cluster 管理
  2. 性能优化和基准测试
  3. 生产环境验证和调优
  4. 文档完善和社区推广

文档版本: v1.0 最后更新: 2025-10-27