小红书KV存储破局:万亿数据与跨云多活的自研之路

小红书KV存储破局:万亿数据与跨云多活的自研之路

一、万亿量级存储的架构设计核心

1.1 分布式分层存储模型

小红书KV存储采用”热-温-冷”三层数据分布模型:

  • 热数据层:基于全内存的Redis集群,通过一致性哈希分片实现纳秒级响应,支撑用户行为、实时推荐等高QPS场景。内存分片采用动态扩容机制,当单分片内存占用超过80%时,自动触发分裂迁移,确保无单点瓶颈。
  • 温数据层:采用RocksDB作为持久化引擎,通过LSM-Tree结构优化写吞吐。配置SSD作为存储介质,通过多盘并行写入将IOPS提升至30万+,同时启用WAL(Write-Ahead Log)保障数据一致性。
  • 冷数据层:对接对象存储(如AWS S3兼容接口),通过压缩算法(ZSTD)将存储成本降低至内存层的1/50。冷数据访问采用预加载机制,根据访问模式预测数据需求,提前从对象存储加载至SSD缓存。

1.2 动态扩缩容机制

架构引入Kubernetes Operator管理存储节点,实现资源弹性伸缩:

  1. # 存储集群扩缩容配置示例
  2. apiVersion: storage.xiaohongshu.com/v1
  3. kind: KVCluster
  4. metadata:
  5. name: kv-production
  6. spec:
  7. replicas: 3
  8. storageClass: ssd-premium
  9. autoScale:
  10. metrics:
  11. - type: CPU
  12. target: 70%
  13. - type: Memory
  14. target: 85%
  15. minReplicas: 3
  16. maxReplicas: 20

当监控系统检测到某分片CPU使用率持续超过70%时,自动触发分片分裂并新增节点,整个过程在30秒内完成,确保业务无感知。

1.3 存储压缩与去重技术

针对用户生成内容(UGC)的重复性特征,实现三级压缩体系:

  1. 行级压缩:对KV对的Value部分采用LZ4算法压缩,压缩率达60%
  2. 块级去重:对相同Key前缀的数据块进行指纹比对(SHA-256),去重率提升25%
  3. 全局字典:维护高频字符串的字典编码,将”点赞”、”收藏”等常用操作的数据体积压缩至1字节

二、跨云多活的实现路径

2.1 多云同步协议设计

基于Raft改进的Multi-Raft协议实现跨云强一致:

  • 选举超时调整:跨云网络延迟导致的心跳间隔从200ms动态调整至500ms
  • 日志复制优化:采用批处理+压缩技术,将跨云日志传输量减少40%
  • 脑裂防护:引入云厂商元数据服务作为仲裁者,当检测到分区时自动冻结少数派写入

2.2 流量调度与容灾

构建全球负载均衡系统(GLB):

  1. // 流量调度算法核心逻辑
  2. func routeRequest(req *http.Request) string {
  3. // 1. 基于GeoIP定位用户区域
  4. region := geoIP.Lookup(req.RemoteAddr)
  5. // 2. 检查区域健康状态
  6. if !healthCheck.IsRegionHealthy(region) {
  7. region = fallbackRegion(region) // 降级策略
  8. }
  9. // 3. 选择最优节点(延迟+负载综合评分)
  10. node := selectBestNode(region, req.Headers.Get("X-KH-UserID"))
  11. return node.Endpoint
  12. }

当某云区域发生故障时,系统在10秒内完成流量切换,RTO(恢复时间目标)控制在30秒内。

2.3 数据一致性保障

实施Quorum NWR模型:

  • Write Quorum (W):跨云至少2个副本确认写入
  • Read Quorum (R):优先读取本地云副本,超时后读取跨云副本
  • 耐久性配置 (N):默认3副本(本地2+跨云1),金融级场景可配置5副本

三、性能优化实践

3.1 多级缓存体系

构建四级缓存架构:

  1. 客户端缓存:LocalStorage存储最近访问的100个KV对
  2. 边缘缓存:CDN节点缓存热点数据,TTL动态调整(1min-24h)
  3. 代理层缓存:Sidecar模式部署的Envoy过滤器,实现请求级缓存
  4. 存储层缓存:RocksDB的Block Cache与MemTable双重缓冲

3.2 异步化处理

关键操作采用异步设计:

  1. // 异步写入示例
  2. public CompletableFuture<Void> asyncPut(String key, byte[] value) {
  3. // 1. 写入本地WAL
  4. CompletableFuture<Void> walFuture = diskWAL.append(entry);
  5. // 2. 异步复制到跨云副本
  6. CompletableFuture<Void> replicaFuture = crossCloudReplicator.send(entry);
  7. // 3. 组合未来
  8. return walFuture.thenCombine(replicaFuture, (a, b) -> null);
  9. }

通过异步化将P99延迟从12ms降至4ms。

四、运维监控体系

4.1 全链路追踪

实现OpenTelemetry集成:

  1. message KVTrace {
  2. string trace_id = 1;
  3. string span_id = 2;
  4. enum OperationType {
  5. GET = 0;
  6. PUT = 1;
  7. DELETE = 2;
  8. SCAN = 3;
  9. }
  10. OperationType operation = 3;
  11. int64 latency_ns = 4;
  12. string cloud_region = 5;
  13. }

通过追踪数据发现跨云网络抖动导致15%的请求延迟增加,针对性优化后P99延迟下降35%。

4.2 智能预警系统

构建基于Prophet的时间序列预测模型:

  • 存储容量预测准确率达92%
  • 流量突增检测延迟<1分钟
  • 自动触发扩容决策,误报率<0.5%

五、实施建议

  1. 渐进式迁移:先迁移读多写少的场景(如用户配置),逐步过渡到核心业务
  2. 混部策略:与状态无关的计算任务混部,提升资源利用率20%+
  3. 压测方案:使用自研分布式压测工具,模拟5倍日常流量验证架构极限
  4. 混沌工程:定期注入云网络分区、节点宕机等故障,验证容灾能力

该架构在小红书内部已承载日均万亿次请求,存储数据量突破5PB,跨云同步延迟控制在50ms以内。通过持续优化,单位存储成本较开源方案降低40%,为业务全球化扩张提供了坚实基础。