第5章:MorphoSys 启发的 lever 工程化 —— A2 affinity / A3 split / A4 reservoir
A2 affinity binding(cohort union-find + min_edge=5.0 + max_cluster=3)、A3 cohort split(contention_score = Σ W² / |c| 阈值切分)、A4 future-cost reservoir(256-sample 滑动窗 + predicted_local_ratio)的工程化细节,配合 drift workload 下 migrations 0→21/tick、splits 11→64 的数据 walk-through
第 4 章把 A1(cost-coefficient tuner)讲透了——但 A1 只能调权重,它不会改变 cohort 本身的形状或归属。如果 workload 漂了,cohort 该合该拆、该绑哪个 owner,这些动作来自 A2/A3/A4 这三个 lever:A2 affinity 把多个 cohort 绑到同一 owner CN(用 union-find 做亲和聚类)、A3 split 把过度争用的 cohort 切开(用 contention_score 阈值)、A4 reservoir 用 256-sample 滑动窗预测下一步 workload 形状。三者的命名直接借自 MorphoSys (VLDB’20),但工程化细节是 v27 自家做的——min_edge=5.0、max_cluster=3、contention_score = Σ W²/|c| 这些超参不是凭空选的,都有 drift workload 上的实验依据。本章把三个 lever 的实现 walk-through 一遍,然后用 drift_5sec 上 migrations 0→21/tick、splits 11→64 的真实数据演示它们如何”被工作负载触发”。
📑 目录
- 1. 三 lever 速览:作用域与触发频率
- 2. A2 affinity binding:cohort union-find 聚类
- 3. A3 cohort split:contention_score 阈值切分
- 4. A4 future-cost reservoir:256-sample 滑动窗
- 5. Drift workload walk-through:三 lever 怎么协同
- 6. MorphoSys 起源与本地化改造
- 7. 章末小结:A2/A3/A4 与 A1 的协作分工
1. 三 lever 速览:作用域与触发频率
A2/A3/A4 三个 lever 各自工作在不同 scope、不同频率、不同 actuation 类型:
| Lever | 作用域 | 输入 | 输出 | 触发频率 | actuate 类型 |
|---|---|---|---|---|---|
| A2 affinity | cohort 之间 | cohort-cohort 亲和边权 | ”绑到一起”的 cluster | 每 100 ms | 直接 actuate |
| A3 split | 单个 cohort 内部 | cohort 内 key 访问频率 | 切成两个 cohort | 每 100 ms | 直接 actuate |
| A4 reservoir | 全局 workload | 历史 txn 样本 | predicted_local_ratio | 每 5 ms 加样本 | 仅诊断(v27) |
几个关键观察:
- A2 + A3 是”形状改造”levers——它们改变 cohort 表本身(合并 / 切分),影响 OwnerMap 输出
- A4 是”未来预测”lever——它给 planner 一个未来 workload 的预期,但 v27 还没接进 planner loop,只做 telemetry
- 三者都在 router 进程跑——跟 A1 tuner、planner 在同一个 RouterControlLoop 里
🍎 直觉比喻:A2 = 焊枪(聚合)、A3 = 切刀(拆分)、A4 = 雷达(预测)。A1(第 4 章)是温控旋钮(调权重)。4 个动作配合,构成 v27 的完整 lever 体系。
2. A2 affinity binding:cohort union-find 聚类
2.1 动机
planner 单独看每个 cohort 时,可能”局部最优”——cohort i 放 CN 0、cohort j 放 CN 1。但如果同一笔 txn 经常同时访问 i 和 j(例如 TPC-C 的 NewOrder 同时碰 STOCK 和 ORDER),把它们分到两个 CN 反而引入 cross-CN RPC。
解法:把”经常一起被访问”的 cohort 绑到同一 owner CN。
2.2 算法:union-find + 亲和边权
输入:cohort-cohort 亲和边权矩阵 W[i][j] —— 在过去 N 个 txn 里,cohort i 和 cohort j 同时被访问的次数。
算法:
1. 初始化:每个 cohort 自成一个 cluster
2. 对所有 cohort pair (i, j):
if W[i][j] >= min_affinity_edge (= 5.0):
union(i, j)
3. 检查每个 cluster:
if size(cluster) > max_cluster_cohorts (= 3):
拆开(保留 3 个亲和度最强的,剩余分出去)
4. 每个 cluster 选一个 owner CN(用 planner 的 Benefit 评分)
5. cluster 内所有 cohort 都用同一 owner CN
2.3 超参解读
| 超参 | 默认值 | 防什么 |
|---|---|---|
min_affinity_edge | 5.0 | 边权太小不连——防止把”偶尔一起”的 cohort 错绑 |
max_cluster_cohorts | 3 | cluster 不能太大——防止全连成一团变回”单 CN holds everything”(CREST 模式) |
为什么是 5.0 和 3?实验测的:
-
min_edge = 1.0:把 noise 当亲和,cluster 数太少,dispatch skew 严重(CN0 拿 4× 流量)
-
min_edge = 5.0:保留真实亲和,CN0 拿 ~2.3× 流量
-
min_edge = 10.0:错过有效亲和,跨 CN RPC 没明显改善
-
max_cluster = 2:太碎,把”NewOrder 同时碰 STOCK + ORDER + WAREHOUSE 3 表”的 affinity 拆开
-
max_cluster = 3:刚好覆盖 TPC-C NewOrder 主路径
-
max_cluster = 6:cluster 变大,单 CN 负载失衡
2.4 实现位置
src/transaction/aura/AffinityBinder.cc,依赖 cohort-cohort co-access 矩阵(在 RouterControlLoop 里维护)。
2.5 效果
TPC-C 4-CN 静态 workload:
- A2 off:CN0/CN1/CN2/CN3 dispatch 比例 = 4 : 1 : 1 : 1(CN0 4× 倾斜)
- A2 on:比例 = 2.3 : 1.2 : 1 : 0.9(仍倾斜但缩小到 2.3×)
🧠 关键洞察:A2 把”局部最优 cohort 划分”修正成”全局最优 cohort 划分”——单个 cohort 看最优整体上可能是次优。这跟 MorphoSys 的 “workload-aware clustering” 思想一致。
3. A3 cohort split:contention_score 阈值切分
3.1 动机
A2 的反向需求——有时单个 cohort 内部太热,应该切开。
例:cohort c 里有 100 个 key,但其中 1 个 key(warehouse_id=1)占 95% 访问。把整个 cohort 当一个 lock 单位会导致所有 99 个其他 key 也排队等 warehouse_id=1 的锁。
解法:把热 key 分离成独立 cohort。
3.2 算法:contention_score 阈值
定义 contention_score:
contention_score(c) = Σ_{k ∈ c} W(k)² / |c|
其中:
W(k):key k 的访问权重(最近 N 次 txn 里 k 的访问次数)- 平方让”热得离谱”的 key 放大其贡献
- 除以 cohort 大小防止”大 cohort 天然得分高”
如果 contention_score(c) > contention_split_threshold:
- 找 score 最大的 key 作为 “hot core”
- 把这个 key 提取成新 cohort c’
- 余下 99 个 key 留在原 cohort c
3.3 为什么是 Σ W² 而不是 Σ W
Σ W 是均匀访问 cohort 的总访问量——大 cohort 天然得分高。
Σ W² 强调分布的偏度——所有 key 均匀访问时得分低,单 key 集中访问时得分高。
🍎 直觉比喻:Σ W² 跟统计学里的 “Gini coefficient” 或 “concentration ratio” 思想类似——衡量”集中度”而不是”总量”。
3.4 实现位置
src/transaction/aura/CohortSplitter.cc,每 100 ms tick 时遍历所有 cohort。
3.5 效果(drift_5sec)
drift workload 60s 内 split 数变化:
phase A (0-5s): splits ≈ 11 /tick (基线,TPC-C 自然分布)
phase B (5-10s): splits ≈ 64 /tick (热区切换,新热 key 触发切分)
phase A (10-15s): splits ≈ 30 /tick (旧 cohort 还没合并回去,过渡期)
...
📊 数据 commit:159381a,results/v27_drift_smoke_*/。
splits 从 11 → 64 的跳变,是 §6.3 “adaptation visible” 的证据之一。
4. A4 future-cost reservoir:256-sample 滑动窗
4.1 数据结构
reservoir 维护 256 个最近 txn 样本,每个样本记录:
struct TxnSample {
std::vector<KeyId> read_set;
std::vector<KeyId> write_set;
CohortId cohort_at_dispatch;
Timestamp ts;
};
每 5 ms 加一个样本(FIFO,超过 256 后丢最老)。
4.2 关键计算:predicted_local_ratio
planner 想知道:“如果现在切换 OwnerMap,下一波 txn 有多大比例还是 local 命中?”
计算方式:
for each sample in reservoir:
candidate_owner = OwnerMap_proposed.get(sample.cohort_at_dispatch)
if all keys in (read_set ∪ write_set) belong to candidate_owner:
local_count += 1
predicted_local_ratio = local_count / 256
predicted_local_ratio 越高 → 当前 OwnerMap 提案越优 → planner 更愿意切换。
4.3 物理意义
A4 给 planner 一个”未来 workload 的镜像”——基于过去 256 笔 txn 推断下一步。
跟 A3 split 的对比:A3 看当前 cohort 的内部争用,A4 看整体 workload 的稳定性。两者维度不同。
4.4 v27 的诚实分级:A4 只做 diagnostic
v27 paper §3.7 明确说:
Used for diagnostic in this paper; planner-loop integration is future work.
为什么不接进 planner loop?两个原因:
- 接进 loop 需要修改 Benefit 函数——加
predicted_local_ratio作为第 5 项,但这会破坏 4 项的简洁性 - 没有足够实验证明 A4 不引入震荡——256-sample 窗的 lag 跟 planner tick 100 ms 不对齐,可能反复触发不必要的迁移
→ v27 决定 A4 只做 telemetry。诚实分级再次出现。
4.5 实现位置
benchmark/Client/access/TxnAccessReservoir.cc,~300 LOC。
⭐ 教学重点:A4 是故意只做 diagnostic 不做 actuator 的——这是 v27 的诚实化决定,跟”5 维度分级”一脉相承。
🌟 结论:A4 的存在价值是 §6.3 drift workload 的**“adaptation visible”证据来源**——predicted_local_ratio 在 drift_5sec 下从 0.10 振荡到 0.22,证明 planner 真的看到了 workload 变化。
5. Drift workload walk-through:三 lever 怎么协同
用 drift_5sec 60s 真实数据,按时间顺序讲一遍三 lever 协同。
5.1 数据 + 时序
实验:drift_period_ms = 5000,每 5s 切换 district_id bias。
t = 0s: phase A 开始,hot 是 district [0, 5)
A4: predicted_local_ratio = 0.22
A2: cluster {c0, c1, c2} → CN0; {c3, c4} → CN1
A3: splits ≈ 11/tick (baseline)
A1: weights {atomic 0.5, rpc 1.0, move 2.5, load 0.18}
t = 5.0s: phase 切换,hot 改为 district [5, 10)
t = 5.1s: A4 注意到 sample 里新热 key 占比突增
predicted_local_ratio: 0.22 → 0.10 (剧降)
t = 5.2s: planner 100ms tick 触发
Benefit 重新评估,旧 OwnerMap 评分降
migrations: 0 → 21/tick (cohort owner 大规模迁移)
t = 5.5s: A3 检测到新热区争用
splits: 11 → 64/tick
t = 6.0s: A2 重新聚类
新 cluster {c0, c5} → CN1; {c3, c8} → CN2 (反映新热区分布)
t = 6.5s: A1 SGD 看到 rpc cost 升 (cross-CN 增加)
weights {atomic 0.5, rpc 1.2, move 2.5, load 0.18}
t = 10.0s: phase A 回切
整个过程重新走一遍 (反向)
📊 数据 commit:159381a (drift 3-rep + Drift::Stop 修复)
5.2 4 个 lever 各自的角色
🍎 直觉比喻:phase 切换像突然下雨——
- A4 (雷达) —— 第一个发现 “天气变了”(reservoir 看到样本变化)
- A3 (切刀) —— 把新热区切出来,单独处理(cohort split)
- A2 (焊枪) —— 把新热 cohort 跟相关 cohort 一起绑新 owner(affinity binding)
- A1 (温控旋钮) —— 调权重,让 Benefit 评分跟上新分布(cost coefficient tuner)
四个动作有先后顺序——A4 给信号 → A3/A2 改 cohort 形状 → A1 调权重。
5.3 这个 walk-through 是 paper §6.3 的核心叙事
§6.3 想说:“adaptive 的 levers 在 drift 下真的在动,不是摆设。”
证据:
- migrations 从 0 → 21/tick ——A2 + planner 协同
- splits 从 11 → 64/tick ——A3 触发
- predicted_local_ratio 从 0.22 → 0.10 oscillation ——A4 跟踪
- SGD weights 跟着 phase 跳变(第 4 章 §6 已展示)
四条证据互相印证,单条任何 reviewer 攻击都还有另外三条——这是 robust evidence 的特征。
🌟 结论:drift walk-through 是 v27 §6.3 的 headline 叙事,比静态 5-cell ablation 更有说服力。
6. MorphoSys 起源与本地化改造
6.1 MorphoSys (VLDB’20) 简介
MorphoSys 是 adaptive physical design 的现代代表作。它的核心 lever 体系:
| MorphoSys lever | 操作对象 | 触发依据 |
|---|---|---|
| L1 | row layout transform | column access pattern |
| L2 | column store reorganization | workload cluster |
| L3 | index migration | hot index identification |
| L4 | future workload predictor | sliding window |
6.2 AURA v27 借用的方法论
v27 的 A1/A2/A3/A4 跟 MorphoSys 的 L1-L4 不是 1:1 对应——是方法论迁移:
| AURA lever | MorphoSys 启发点 | 操作对象(v27 自家) |
|---|---|---|
| A1.b SGD tuner | MorphoSys cost model learning | 4 个 cost coefficient |
| A2 affinity binding | MorphoSys workload cluster (L2) | cohort 聚类 |
| A3 cohort split | MorphoSys reorganization trigger | cohort 切分 |
| A4 reservoir | MorphoSys future workload predictor (L4) | predicted_local_ratio |
借的不是代码,是格式约定——cost model 是 first-class learning target、加 lever 时要有 trigger metric、reservoir 维度跟 planner tick 解耦等。
6.3 本地化改造:actuation surface 完全不同
MorphoSys 操作的是 storage object(row / column / index);AURA 操作的是 control plane object(cohort / owner / lock authority)。
| 维度 | MorphoSys | AURA v27 |
|---|---|---|
| actuation surface | storage layout | transaction control |
| 触发频率 | 分钟级(heavy 操作) | 100 ms(light 操作) |
| 一致性挑战 | offline rebuild | online migration(I1/I2/I3) |
| 系统类型 | OLAP / mixed | pure OLTP |
→ MorphoSys 在 batch 系统里 reorganize,AURA 在 OLTP 在线 reorganize——后者必须证明 I1-I3 不变式(见第 6 章)。
🧠 关键洞察:AURA 用了 MorphoSys 的方法论格式但完全没用它的算法——A2 是 union-find(不是 MorphoSys 的 spectral cluster)、A3 是 Σ W² 阈值(不是 MorphoSys 的 column dependency)、A4 是简单 reservoir(不是 MorphoSys 的 LSTM predictor)。方法论可借,算法必须本地化。
⭐ MEMOIRABLE QUOTE:“AURA 借了 MorphoSys 的写作格式,但把它的算法全部换掉——因为 actuation surface 完全不同。“
7. 章末小结:A2/A3/A4 与 A1 的协作分工
7.1 4 个 lever 的分工表
| Lever | 角色 | 调什么 | 类比 |
|---|---|---|---|
| A1 | 权重调节 | cost coefficient 4 个值 | 温控旋钮 |
| A2 | 聚合 | cohort 之间绑 owner | 焊枪 |
| A3 | 拆分 | 单 cohort 切两个 | 切刀 |
| A4 | 预测 | predicted_local_ratio | 雷达 |
7.2 协同方式
┌───────────────┐
│ Workload │
│ (drift txn) │
└───────┬───────┘
│
▼
┌───────────────┐
│ A4 reservoir │ (5 ms 加 sample)
│ predicted_local_ratio
└───────┬───────┘
│ diagnostic only
▼
┌─────────────────────────┐
│ Planner 100 ms tick │
└────────┬────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ A2 │ │ A3 │ │ A1 │
│ affin │ │ split │ │ tuner │
│ -ity │ │ │ │ │
└────┬───┘ └────┬───┘ └────┬───┘
│ │ │
▼ ▼ ▼
OwnerMap update + Benefit re-score
7.3 当前 v27 状态
- A1/A2/A3 直接进 planner loop——OwnerMap 更新会真实生效
- A4 只做 diagnostic——telemetry / paper §6.3 证据来源
- 4 个 lever 一起在 5-cell ablation 里”组合不是相加”(第 4 章 §7)—— paper §6.2 的诚实结论
🌟 结论:A2/A3/A4 是 v27 在 v25/v26 之上的结构性新增——v25 只有 access graph + cohort merge,v27 把 lever 显式化为 A2/A3/A4 + 加上 A1 在线 tuner,整体方法论格式 align 到 MorphoSys。
✅ 自我检验清单
- 三 lever 角色:能默写 A2/A3/A4 的全名 + 一句话作用 + 触发频率
- A2 超参:能解释
min_affinity_edge=5.0和max_cluster_cohorts=3各自防什么 + 为什么是这两个具体数字(基于实验) - A3 score:能写出
contention_score = Σ W² / |c|并解释每一项 + 为什么是 W² 而不是 W - A4 reservoir:能解释 256-sample 滑动窗 + predicted_local_ratio 的物理意义
- 诊断 vs actuate:能解释为什么 v27 把 A4 写成 diagnostic 而不接进 planner loop(2 条理由)
- drift walk-through:能按时间顺序讲 drift_5sec phase 切换时 4 个 lever 的协同动作(5-6 个时间点)
- MorphoSys 对照:能说出 AURA 借用 MorphoSys 的方法论格式但完全不用其算法,并解释 actuation surface 的本质区别
- 4 lever 协同:能画 lever 协作流程图(A4 → planner → A1/A2/A3 → OwnerMap)
📚 参考资料
概念入门
- v27 paper outline §3.5 + §3.6 + §3.7 —— 三 lever 的 source of truth
- v27 paper outline §6.3 —— drift workload 数据
关键论文
- MorphoSys (VLDB’20) —— 本章 lever 命名 + 方法论起源
- Adaptive Indexing (Idreos, CIDR’07) —— online reorganization 的早期工作
- Bao (SIGMOD’21) —— learned cost model 在 query optimizer 的应用
- Spectral Clustering for Workload Analysis —— A2 union-find 的对照基线
行业讨论
- 模块十五《分离式事务的动态锁所有权》第14章-Router-centric重构与9216-cohort全表展开 —— v25 时期 cohort 工程化笔记
- 模块二十三《AURA 论文精讲》第5章-访问图与cohort学习 —— v25 时期的 cohort 学习视角
框架文档(代码 anchor)
src/transaction/aura/AffinityBinder.cc—— A2 union-find 实现src/transaction/aura/CohortSplitter.cc—— A3 切分实现benchmark/Client/access/TxnAccessReservoir.cc—— A4 滑动窗实现(~300 LOC)bench/aura/run_v27_drift_smoke.sh—— drift workload harnessresults/v27_drift_smoke_*/—— migrations + splits 时序数据
📎 v25 对照视角:模块二十三-AURA 论文精讲 第5章-访问图与cohort学习(v25 时期 cohort 是 access graph 学出来的,没有 A2/A3 这种 explicit lever;v27 把 lever 显式化 + 加 A4 reservoir)