【博客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中的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值