K8s中的ETCD存储机制
K8s中的ETCD存储机制
当客户端有请求发到Leader时
第1步:做预检查,会检查当前节点的配额是否还能写入数据,配额不足直接拒绝请求;会检查请求频率,触发限流则阻塞请求;会对请求做鉴权操作,权限不足或请求不合法则拒绝请求;同时会拒绝包大小超过1.5M的请求
第2步:会将通过预检查的请求转发到KVserver
第3步:KVserver会调用propose方法将请求发送到一致性模块,此时一致性模块会把该请求置于其raftLog的unstable集合中,并返回给KVserver一个ready的结构体
第4步:Leader会把该请求写入本地WAL二进制日志(unstable),执行fsync后变为stable;之后通过MsgApp RPC并发地发送给所有Follower;Follower收到Msgapp后类似的写入WAl日志并持久化后会向Leader发送MsgAppResp
第5步:当KVserver收到半数Follower的MsgAppResp,此时会将raftlog的请求的状态转到commited的状态,并应用到状态机,此时MVCC模块(多版本并发控制模块)会更新内存中的treeindex,该索引记录的是请求的key和revision映射关系和gerneration信息;同时把revision→(key, value, create/mod revision, version) 写入BoltDB,当需要读取key的值时,只需要在treeindex中匹配key和revison,匹配到就可以去Boltdb读到值,实现多版本并发控制
注:
1、(写请求到follower会转发到leader)
2、wal日志存在的意义:保证数据的一致性
wal日志存在的意义:保证数据的一致性