副本层
总体概览
一个存储设备(store)可以 存储若干Range,被一个 Rocksdb实例管理
一个range是一段有序键值 区间【K1,K2】的数据分片, 是DRDB存储管理的最小单位
每个Range分片默认大小 64MB,默认3个副本。分布 在不同的节点上
功能组件
RAFT
每个Range维护一个Raft Group,Range中的多副本通过Raft保证数据一致性
对于每个Range只有一个Replica成为Leader,Leader与Follower通过heartbeats维护状态
每个节点上有多个Range,所以存在多个Raft Group
Range 的 数目远远大约节点数
每个t Raft Group 单独通信会造成 大量的网络开销
合并发往位于同一个节点上的 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-读场景
Node2(网关节点)接 收 client 读取 table3 的请求
table3 的 leaseholder 在 Node3 上,请求被路由到 Node3
Node3 获取数据返回给 Node2
Node2 将数据返回给 Client