写扩展与批量化是什么
写比读更难扩展:读可以靠复制副本,写最终都要落到同一份数据上。可行的路径依次是批量化(把多次单条写合并成批量提交,摊薄事务与网络开销)、异步化(先入队再批量落库,削平写峰值)、分片(按分片键把写压力分散到多个节点)、追加日志替代随机写。每一步都会改变一致性与延迟特征,必须在改之前想清楚代价,例如批量会拉长单事务锁持有时间,异步会带来读己之写的延迟。
基本信息
| 批量化 | 合并单条写为批量提交,摊薄事务与网络开销 |
|---|---|
| 异步化 | 先入队再批量落库,平滑写峰值,接受延迟入账 |
| 分片 | 按分片键分摊写压力,配套跨片查询与再平衡方案 |
| 追加写 | 日志结构存储替代随机写,需评估读放大代价 |
| 写放大 | 按副本数与下游数量估算放大后的实际写入量 |
典型使用场景
- 日志与埋点写入:高频小写入,批量化后吞吐显著提升
- 订单与流水:写入密度高,按用户或时间分片分摊压力
- 计数与统计:用合并写降低同键行锁竞争
- 导入与同步:大批量数据装载,用批量提交替代逐条写入
- 热点更新:单调递增键加扰动,减少页分裂与写集中
- 异步入账:把非实时写先入队,按稳定速率落库
批量写入要点
批量写入要点
# 1 批大小取值:在吞吐收益与单事务锁持有时间之间找平衡
# 过大:单批失败重试成本高,锁等待加剧
# 过小:往返与提交开销摊不薄
# 2 失败粒度:整批重试实现简单,但必须整批幂等;单条重试影响面小
# 3 异步落库:先写队列或日志,确认业务能接受读己之写的延迟
# 4 分片键:单调递增键加扰动,避免写入集中在最后一个分片
# 5 写放大核算:主从两副本时,物理写入量约为逻辑写入量的两倍
# 6 验证口径:同时观察写吞吐、复制延迟与查询延迟,防止单项改善整体退化手段与代价
| 手段 | 收益 | 代价 |
|---|---|---|
| 批量化 | 摊薄事务与网络开销,吞吐上升 | 单事务锁持有时间变长,失败重试成本上升 |
| 异步化 | 削平写峰值,保护存储层 | 读己之写出现延迟,需要监控积压 |
| 分片 | 写压力分散,容量可线性扩展 | 跨片查询与再平衡复杂度上升 |
| 追加写 | 顺序写吞吐高,适合高密度写入 | 读放大与合并成本,查询模式受限 |
| 写合并 | 降低同键行锁竞争 | 短窗口内的写入结果被延迟可见 |
批量大小存在甜蜜点:过大导致锁持有时间与失败重试成本上升,过小则摊不薄开销,必须用压测确定而不是沿用经验值。
异步写入要配背压:队列持续增长却看不到真实写入能力,等问题暴露时往往已经积压到无法追平。