概述
内容:记录etcd的存储结构
etcd框架:
模块解析:
etcd server:对外接收客户端的请求,对应etcd代码中的etcdserver目录,其中还有一个
raft.go的模块与etcd-raft库进行通信。etcdserver中与存储相关的模块是applierV3,
这里封装了V3版本的数据存储,WAL(write ahead log),用于写数据日志,etcd启动时
会根据这部分内容进行恢复。
etcd raft:etcd的raft库,前面的文章已经具体分析过这部分代码。除了与本节点的etcd
server通信之外,还与集群中的其他etcd server进行交互做一致性数据同步的工作
etcd的数据处理步骤:
一个请求与一个etcd集群交互的主要流程分为两大部分:
1. 写数据到某个etcd server中。
2. 该etcd server与集群中的其他etcd节点进行交互,当确保数据已被存储之后应答客户端。
请求流程划分为了以下的子步骤:
• 1.1:etcd server收到客户端请求。
• 1.2:etcd server将请求发送给本模块的raft.go,它负责与etcd raft模块进行通信。
• 1.3:raft.go将数据封装成raft日志的形式提交给raft模块。
• 1.4:raft模块会首先保存到raftLog的unstable存储部分。
• 1.5:raft模块通过raft协议与集群中其他etcd节点进行交互。
注意:
如果写入数据的etcd是leader节点,则直接在leader节点处理提交的数据。
如果提交数据到非leader节点的话需要路由到etcd leader节点去。
而应答步骤如下:
• 2.1:集群中其他节点向leader节点应答接收这条日志数据。
• 2.2:当超过集群半数以上节点应答接收这条日志数据时,etcd raft通过Ready结构体
通知etcd server中的raft该日志数据已经commit。
• 2.3:raft.go收到Ready数据将首先将这条日志写入到WAL模块中。
• 2.4:通知最上层的etcd server该日志已经commit。
• 2.5:etcd server调用applierV3模块将日志写入持久化存储中。
• 2.6:etcd server应答客户端该数据写入成功。
• 2.7:最后etcd server调用etcd raft,修改其raftLog模块的数据,将这条日志写入到
raftLog的storage中。
注意:
• etcd raft模块在应答某条日志数据已经commit之后,是首先写入到WAL模块中的,
因为这个模块只是添加一条日志,所以速度会很快,即使在后面applierV3写入失败,
重启的时候也可以根据WAL模块中的日志数据进行恢复。
• etcd raft中的raftLog,按照前面文章的分析,其中的数据是保存到内存中的,
重启即失效,上层应用真实的数据是持久化保存到WAL和applierV3中的。
最后
以上就是高高悟空为你收集整理的【博客383】etcd存储结构的全部内容,希望文章能够帮你解决【博客383】etcd存储结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复