没有合适的资源?快使用搜索试试~ 我知道了~
etcd1-13梳理.pdf
需积分: 5 0 下载量 59 浏览量
2022-11-02
15:35:35
上传
评论
收藏 10.19MB PDF 举报
温馨提示
试读
48页
etcd1-13梳理.pdf
资源推荐
资源详情
资源评论
整体架构
基础模块介绍
client 层: 包含 client v2 和 v3 两个⼤版本 API 客户端
API ⽹络层:
主要包含 clent 访问 server 和 server 节点之间的通信协议
clent 访问 server 分为两个版本:v2 API 采⽤ HTTP/1.x 协议,v3 API 采⽤ gRPC 协议
server 之间的通信:是指节点间通过 Raft 算法实现数据复制和 Leader 选举等功能时使⽤的 HTTP 协议
Raft 算法层:
实现了 Leader 选举、⽇志复制、ReadIndex 等核⼼算法特性
⽤于保障 etcd 多节点间的数据⼀致性、提升服务可⽤性等,是 etcd 的基⽯和亮点
功能逻辑层:
etcd 核⼼特性实现层
如典型的 KVServer 模块、MVCC 模块、Auth 鉴权模块、Lease 租约模块、Compactor 压缩模块等
其中 MVCC 模块主要有 treeIndex 模块和 boltdb 模块组成
存储层:
包含预写⽇志 WAL 模块、快照 Snapshot 模块、 boltdb 模块
其中 WAL 可保障 etcd crash 后数据不丢失,boltdb 则保存了集群元数据和⽤户写⼊的数据
写流程 简单了解
写流程 简单了解
简单了解⼀下写流程==
1. client 发起⼀个更新 hello 为 world 请求后
2. 若 Leader 收到写请求,它会将此请求持久化到 WAL ⽇志,并⼴播给各个节点
a. 若⼀半以上节点持久化成功,则该请求对应的⽇志条⽬被标识为已提交
b. 之后,etcdserver 模块异步从 Raft 模块获取已提交的⽇志条⽬,应⽤到状态机(boltdb等)
读流程 详细了解
串⾏读(数据敏感度低,适⽤计数等)
W——WAL 新数据;S——状态机 旧数据
串⾏读
直接读状态机数据返回、⽆需通过 Raft 协议与集群进⾏交互
具有低延迟、⾼吞吐量的特点
为什么串⾏读,会读到旧数据?
因为 Follower 节点收到 Leader 节点的同步些请求后,应⽤⽇志条⽬到状态机是个异步过程
因此产⽣⼀种需求,能否确保最新的数据已经应⽤到状态机中?—— 产⽣了线性读 ReadIndex 机制
线性读(数据敏感度⾼,要求⼀致性)
线性读 ReadIndex,原理图如上所示,以下简要⽂字描述
1. Follower C 收到⼀个线性读请求时,⾸先会从 Leader 获取集群最新的已提交的⽇志索引(committed
index),如上图流程2(发起请求)
2. Leader 收到 ReadIndex 请求时,为了防⽌脑裂等异常场景,会向 Follower 节点发送⼼跳确认
⼀半以上节点确认 Leader 身份后,才能将已提交的索引(committed index)返回给节点 C (上图
流程3)
3. C 节点会等待,直到状态机已应⽤索引(applied index)⼤于等于 Leader 的已提交索引时
(committed index)(⻅上图流程4)
然后去通知读请求,数据已赶上 Leader,可以去状态机中访问数据了(上图流程5)
简⽽⾔之,就是当前节点向 Leader 问”你进⾏到哪了“,Leader 回复⼀个当前号码”committed index“,当前
节点⽤⾃⼰的状态机号码"applied index"对⽐⼀下,若当前节点落后,则等⼀等,等到号码赶上
(这中间还会涉及到,Leader 是否是真正的 Leader,因此会采⽤⼼跳机制向周围节点确认,防⽌该 Leader
是个假的,也就是防⽌脑裂)
架构图中的流程梳理
KVServer 模块收到线性读请求后,通过架构图中的流程 3 向 Raft 模块发起 ReadIndex 请求
Raft 模块将 Leader 最新的已提交⽇志索引封装在架构图流程 4 的 ReadState 结构体中
通过 channel 层层返回给线性读模块
线性读模块等待本节点状态机追赶上 Leader 进度
追赶完成后,就通知 KVServer 模块,进⾏架构图中流程 5,与状态机中的 MVCC 模块进⾏交互了
写流程 详细了解
简单了解⼀下写流程
1. client 发起⼀个更新 hello 为 world 请求后
2. 若 Leader 收到写请求,它会将此请求持久化到 WAL ⽇志,并⼴播给各个节点
a. 若⼀半以上节点持久化成功,则该请求对应的⽇志条⽬被标识为已提交
b. 之后,etcdserver 模块异步从 Raft 模块获取已提交的⽇志条⽬,应⽤到状态机(boltdb等)
回顾⼀下写⼊过程(详细版)
client 发送 put请求时,⾸先到达 KVServer 模块(此部分还有认证、鉴权、限速模块),之后到达 Raft 模
块,将⽇志条⽬写⼊到 Wal 模块(持久化),之后将⽇志条⽬写⼊到 Raft 稳定⽇志(内存中),此时标记为
已提交状态,之后到达 Apply 模块,此模块利⽤ consistent index 字段记录已执⾏的⽇志(这个也是保证了
crash-safe 和幂等性),之后达到 MVCC 模块,实现真正的存储,MVCC 模块包含两部分 treeIndex 和
boltdb,treeIndex 是在内存中,维护 版本号 和⽤户key的映射关系,真正的数据是存储在 boltdb 中,
boltdb 中,key 为版本号,value 是个结构体(包含⽤户的 key-value信息、关联的 LeaseID 等),boltdb
剩余47页未读,继续阅读
资源评论
HSMgogogo!
- 粉丝: 9
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 设计1.ms14
- vscode-1.64.1.tar源码文件
- vscode-1.64.0.tar源码文件
- vscode-1.52.0.tar源码文件
- Music-Player +PlayerActivity+ rockplayer+ SeeJoPlayer 播放器JAVA源码
- vscode-1.46.0.tar源码文件
- 最近很火植物大战僵尸杂交版2.08苹果+安卓+PC+防闪退工具V2+修改工具+高清工具+通关存档整合包更新
- 超级好用的截图工具PixPin,可录制Gif图
- Screenshot_2024-05-21-17-06-42-64_2332cb9b27b851b548ba47a91682926c.jpg
- 毕业设计参考 - 基于树莓派、OpenCV及Python的人脸识别
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功