副本层

总体概览

副本层 - 图1

  • 一个存储设备(store)可以 存储若干Range,被一个 Rocksdb实例管理

  • 一个range是一段有序键值 区间【K1,K2】的数据分片, 是DRDB存储管理的最小单位

  • 每个Range分片默认大小 64MB,默认3个副本。分布 在不同的节点上

功能组件

RAFT

副本层 - 图2

  • 每个Range维护一个Raft Group,Range中的多副本通过Raft保证数据一致性

  • 对于每个Range只有一个Replica成为Leader,Leader与Follower通过heartbeats维护状态

  • 每个节点上有多个Range,所以存在多个Raft Group

副本层 - 图3

  • Range 的 数目远远大约节点数

  • 每个t Raft Group 单独通信会造成 大量的网络开销

副本层 - 图4

  • 合并发往位于同一个节点上的 Range心跳信息

  • 每个单位时间交换一次节点间的 心跳信息

SnapShot
  • 每个 replica被 可以被 “snapshotted”

  • Raft Log 不会永久保存

  • 宕机节点重新加入集群需要追上最新的数据 ( snapshot+raftlog )

  • 新加入节点通过 Snapshot 复制数据

  • 加载完 snapshot ,还需要 replay raftlog

Lease Holder
  • Range Leases:Range 的一个时间片

  • Leaseholder:对于一个 Range,持有 “range lease” 的 replica 称为 “leaseholder”

  • 接收DistSender的BatchRequests请求

  • 协调对range的读写操作

  • 对于写操作,必须通过raft实现共识后在返回用户

  • 对于写操作,可以绕过raft,直接获取数据返回用户(reduces the network round trips)

Lease-读场景

副本层 - 图5

  1. Node2(网关节点)接 收 client 读取 table3 的请求

  2. table3 的 leaseholder 在 Node3 上,请求被路由到 Node3

  3. Node3 获取数据返回给 Node2

  4. Node2 将数据返回给 Client

Lease-写场景

副本层 - 图6

副本层 - 图7