本文档记录需要调用方、部署配置或持久化状态协同升级的不兼容变更。升级前必须按对应条目的前置条件处理,不能仅替换 KVCM 二进制。
Introduced by: PR #293
TairMempool DRAM 继续使用 ST_TAIRMEMPOOL/pace,LocalSSD 新增
ST_TAIRMEMPOOL_SSD/pace_ssd。两者仍共享 pace:// 数据面协议,但 KVCM 从此分别统计
quota 和类型水位,使 DRAM 高水位能够触发到 SSD 的自动迁移。
- Proto/领域枚举新增
ST_TAIRMEMPOOL_SSD = 9,配置 JSON 新增持久化类型字符串"pace_ssd",写入策略新增CPS_ALWAYS_TAIR_MEMPOOL_SSD = 9和CPS_PREFER_TAIR_MEMPOOL_SSD = 10。 - 老 Worker Client 不认识
pace_ssd。Manager 把新 Storage 配置下发给老 Worker 后,老 Client 会把它解析为 UNKNOWN,并可能以ER_INVALID_SDKBACKEND_CONFIG结束整个 TransferClient 初始化,而不只是跳过 SSD backend。 - 老 KVCM Server 不认识 Registry 中的
"type":"pace_ssd"。直接回滚旧二进制会导致该 Storage backend 恢复失败,Registry recovery 无法完成并持续重试。 - Storage 类型属于持久化 CacheLocation 和用量账本的一部分,不支持同名 Storage 从
pace原地改成pace_ssd。服务端现在拒绝涉及 TairMempool DRAM/SSD 的原地类型变更; 修改 timeout、domain 等同类型参数仍可使用update_storage。 - 开源占位 backend 已按
StorageConfig.type()返回类型。实际部署使用的 PACE backend 也 必须返回配置中的类型,并在构造 URI 时固定使用pacescheme;若仍硬编码ST_TAIRMEMPOOL或使用ToString(GetType())构造 scheme,独立计量会静默失效或生成 不兼容的pace_ssd://URI。
- 先升级所有 Worker Client,使其能够解析类型 9、创建对应 TairMempool SDK,并继续识别
pace://URI。在确认集群不存在老 Client 后再进入下一步。 - 升级全部 KVCM Server 和实际 PACE backend,确认 backend 的
GetType()等于StorageConfig.type(),DRAM/SSD 生成的 URI scheme 均为pace。 - 为 SSD 新建不同名称的
pace_ssdStorage。不要对已有paceStorage 执行类型更新。kvcm_ops中add_storage pace只接受 media type 0/2;pace_ssd子命令固定使用 media type 5。update_storage pace未指定 media type 时会读取并保留原 Storage 的 type/media, 包括旧的ST_TAIRMEMPOOL + media_type=5,不会在修改 timeout 时静默改变介质或类型。pace与pace_ssd只能更新各自类型的 Storage,子命令与已注册类型不匹配时直接拒绝。 - 在每个启用迁移的 Instance Group 中,为
pace与pace_ssd分别配置正数quota_config.capacity。类型水位只遍历显式 quota;缺少源类型 quota 时迁移不会触发, 缺少 SSD quota 时 SSD 没有独立水位和类型容量保护。 - 迁移规则继续以 DRAM Storage 为
source_storage_name、新 SSD Storage 为target_storage_name。SSD 只作迁移目标时无需加入storage_candidates;直接写 SSD 时 才加入候选并选用 SSD 专用 CachePreferStrategy。 - 用空 Instance Group 或测试 Instance 验证一次 DRAM 写入与 DRAM→SSD 迁移:新 Location
分别记录 type 3/type 9,DRAM 用量下降、SSD 用量上升,且 Worker 能读写
pace://URI。
旧的 ST_TAIRMEMPOOL + media_type=5 配置仍可读取并继续按旧类型计量,但不能通过原地改类型
获得独立水位。迁移方式是新建 pace_ssd Storage,将新迁移流量切到它;旧 Storage 必须保留
到历史 Location 排空,避免 GC/读取找不到原 backend。
创建任何 pace_ssd Registry 配置前,可以直接回滚,因为新类型尚未进入持久化状态。创建后
不能直接换回不认识类型 9 的旧 Server/Client。回滚前必须停止新写入和迁移,删除或排空所有
type 9 CacheLocation,确认其物理数据已清理,再删除 pace_ssd Storage 与相关 quota/迁移配置;
之后才能回滚二进制。仅把新 Storage 改名或原地改回 pace 不能修复已有 Location 的类型和
用量,且服务端会拒绝这种类型更新。
Introduced by: PR #249
PR #249 将 Vineyard 专用事件上报泛化为 EventReportBackend,并区分 EVENT_REPORT_L1P5 与 EVENT_REPORT_L2。这是一次不兼容升级,不支持新旧 KVCM 二进制、旧 Vineyard 管控客户端和新 EventReport reporter 混合部署。
StorageType.ST_VINEYARD = 7被替换为ST_EVENT_REPORT_L1P5 = 7,并新增ST_EVENT_REPORT_L2 = 8。即使 L1.5 复用了数值7,旧符号和新契约也不构成受支持的源代码或混合版本兼容性。- Admin
StorageConfig的VineyardStorageSpec vineyard = 10被替换为EventReportStorageSpec event_report = 14,并通过storage_type区分 L1.5/L2。旧 Admin 请求中的 oneof 字段不会被新服务识别为 EventReport 配置。 - ReportEvent 的参数消息统一改为
*EventParams,Block Delete 新增按spec_names删除的语义,并新增 Host Cache State 等接口。所有外部调用方必须使用 PR #249 对应的协议生成代码。
- Storage 的规范类型从
vineyard改为event_report_l1p5或event_report_l2,storage spec 也从 Vineyard 命名切换为 EventReport 命名。 - Instance Group 的候选字段从
event_reporting_storage_candidates改为event_report_storage_candidates。 - Instance/Client 配置的实例级默认字段最终统一为
default_query_type,用于 GetHostCacheState 请求未指定 QueryType 时的默认查询方式。PR #249 初版使用的query_type已在后续 review 中纠偏,详见下方不兼容变更。
- Vineyard location id 为
kvs#v6d#<medium>#<host_ip_port>。 - EventReport location id 为
kvs#event_report_l1p5#<medium>#<host_ip_port>或kvs#event_report_l2#<medium>#<host_ip_port>。 - 新服务按新的 storage type 和 location id 做匹配、删除及 host cleanup。旧 location 不会自动迁移,也不能作为新 reporter 的有效缓存事实继续使用。
- 使用 Vineyard/EventReport 的 Admin 客户端、Reporter 和调度查询调用方。
- Registry 中持久化的 Vineyard storage、Instance Group 候选列表和相关 Instance 信息。
- MetaIndexer/MetaStorage 中由旧 Vineyard reporter 产生的 CacheLocation。
- 依赖旧 location id、旧 storage type 名称或旧 oneof 字段的运维脚本。
标准 NFS、3FS、Mooncake、TairMemPool 等 storage 不受此条目影响,但与 EventReport 共用同一 Instance/元数据空间时仍需确认清理范围。
- 备份 Registry 与 MetaStorage,并记录受影响的 storage、Instance Group 和 Instance 清单。
- 停止受影响 Instance 的 reporter 事件写入和调度消费,避免清理期间继续生成旧 location。
- 将所有外部 Admin/MetaService 客户端和 reporter 更新为 PR #249 对应的 PB 生成代码;确认不再发送
vineyard = 10或依赖ST_VINEYARD。 - 删除并以
event_report_l1p5/event_report_l2重建 Vineyard storage,更新 Instance Group 的event_report_storage_candidates,并确认候选 storage type 与 reporter 上报的storage_type一致。 - 清理受影响 Instance 中形如
kvs#v6d#...的旧 CacheLocation。若无法精确区分,清空并重建该 Instance 的 EventReport 元数据,不能让旧、新 location 共存后直接恢复流量。 - 在同一升级窗口部署全部 KVCM 节点;不要以新旧版本滚动混跑。
- 启动 reporter,先发送 Node Register,再回放当前仍有效 block 的 Block Add 事件以重建元数据。
EVENT_BLOCK_SNAPSHOT在 PR #249 中只是占位契约,升级流程不能依赖它完成恢复。 - 验证 Host Cache State 只返回新 reporter host,确认 L1.5/L2 指标与 cleanup 正常后再恢复调度流量。
回滚到旧 Vineyard 版本同样需要停写并清理 PR #249 生成的 kvs#event_report_l1p5#.../kvs#event_report_l2#... location,恢复旧 storage/Instance Group 配置,再由旧 reporter 重建元数据。禁止在保留新 EventReport 状态的情况下直接替换为旧二进制。
Introduced by: PR #249 review follow-up
PR #249 review 进一步确认,Instance 注册信息中的 query_type 表示请求未显式指定查询类型时使用的 instance 级默认值,而不是某次请求实际采用的查询类型。因此,该字段在 InstanceInfo、注册协议、Registry JSON 和 Client 配置中统一重命名为 default_query_type。
- Meta/Admin protobuf 的
InstanceInfo.query_type与RegisterInstanceRequest.query_type重命名为default_query_type。字段类型和编号8保持不变,因此 protobuf 二进制 wire 数据兼容,但生成代码的 getter/setter 与源码 API 不兼容,调用方必须重新生成并编译。 - HTTP/protobuf JSON、Registry 持久化 JSON 和 Client JSON 配置仅接受、序列化
default_query_type,不兼容读取旧query_typekey。旧配置中的值会回落为QT_UNSPECIFIED。 - 请求级
GetHostCacheStateRequest.query_type及其他查询、事件和 trace 中的query_type不变。显式的请求级query_type始终优先;只有请求值为QT_UNSPECIFIED时才使用InstanceInfo.default_query_type。
- 将 Registry 快照、Client 配置和 RegisterInstance HTTP JSON 中的实例级
query_type改为default_query_type。 - 使用新 proto 重新生成并编译所有 Meta/Admin gRPC 与 SDK 调用方,将实例注册和 InstanceInfo accessor 切换为新名称。
- 在同一升级窗口更新 KVCM 与注册调用方。混合版本虽然可传输字段号
8的 protobuf 二进制数据,但 Registry/HTTP JSON 与生成源码 API 不构成受支持的混合版本契约。 - 升级后检查 GetInstanceInfo/Registry 回显中的
default_query_type;未配置时应为QT_UNSPECIFIED,显式请求级query_type的行为不变。