加入收藏 | 设为首页 | 会员中心 | 我要投稿 桂林站长网 (https://www.0773zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

深度解析Etcd存储设计

发布时间:2021-03-07 15:10:04 所属栏目:外闻 来源:互联网
导读:览 下图中展示了etcd如何处理一个客户端请求的涉及到的模块和流程。图中淡紫色的矩形表示etcd,它包括如下几个模块: etcd server:对外接收客户端的请求,对应etcd代码中的etcdserver目录,其中还有一个raft.go的模块与etcd-raft库进行通信。etcdserver中与

下图中展示了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节点,因为在raft协议中,如果提交数据到非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模块中的,因为这个模块只是添加一条日志,所以速度会很快,

(编辑:桂林站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读