我是靠谱客的博主 高高悟空,最近开发中收集的这篇文章主要介绍【博客383】etcd存储结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内容:记录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存储结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部