|
览
下图中展示了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集群交互的主要流程分为两大部分:
-
写数据到某个etcd server中。
-
该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模块中的,因为这个模块只是添加一条日志,所以速度会很快,
(编辑:桂林站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|