当前位置:网站首页>Etcd database source code analysis - brief process of processing entry records
Etcd database source code analysis - brief process of processing entry records
2022-07-04 23:16:00 【Tertium FATUM】
(1) When the client etcd After the cluster sends a request , Encapsulation in request Entry Records will be submitted to etcd-raft Module processing , among ,etcd-raft The module will first Entry Record saved to raftLog.unstable in .
We use ETCD Database source code analysis —— Server side PUT technological process For example ,kvServer Structure Put Function processing flow is as follows : First, all aspects of the request message will be checked , After checking, all the requests will be sent to the encapsulated RaftKV Interface for processing , After receiving the response message after the processing is completed , Will pass header.fill() Method to fill in the header information of the response , Finally, the complete response message is returned to the client . therefore , Track down srv.(KVServer).Put(ctx, in) In fact, it's called (s *EtcdServer) Put() function .
from raftRequestOnce The process sees that the final call is (s *EtcdServer) processInternalRaftRequestOnce(…) function , There is a key call in this function s.r.Propose(cctx, data).s yes EtcdServer, r Is its member variable raftNode, That's getting into raft The rhythm of the agreement . Through to Propose Function trace , We can see that the final function comes stepWithWaitOption
// raft/node.go
func (n *node) Propose(ctx context.Context, data []byte) error {
return n.stepWait(ctx, pb.Message{
Type: pb.MsgProp, Entries: []pb.Entry{
{
Data: data}}}) } // Here to Message Combined with the Type by pb.MsgProp,Entry For newcomers PutRequest
func (n *node) stepWait(ctx context.Context, m pb.Message) error {
return n.stepWithWaitOption(ctx, m, true) }
// Step advances the state machine using msgs. The ctx.Err() will be returned, if any.
func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error {
if m.Type != pb.MsgProp {
// It won't go here
select {
case n.recvc <- m: return nil
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
}
ch := n.propc // Take out node Provided by the structure propc passageway
pm := msgWithResult{
m: m}
if wait {
pm.result = make(chan error, 1) }
select {
case ch <- pm: if !wait {
return nil } // Will have msg Of pm The structure is placed in propc passageway
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
select {
case err := <-pm.result:
if err != nil {
return err }
case <-ctx.Done(): return ctx.Err()
case <-n.done: return ErrStopped
}
return nil
}
from raft/node.go Of run The function shows , When from propc Take it out of the channel msgWithResult, Taking messages out of it msg, Set up msg The source node of is this node id. And then call raft Modular Step Function driven state machine .
(2)etcd-raft The module will Entry The record is encapsulated into the above Ready In the example , Return to the upper module for persistence .
(3) When the upper module receives the to be persisted Entry After recording , It will be recorded to WAL Log file , And then do the persistence operation , The final notice etcd-raft Module processing .
(4) here etcd-raft The module will put this Entry Record from unstable Move to storage Kept in .
(5) To be Entry When records are copied to more than half of the nodes in the cluster , The Entry The record will be Leader The node is confirmed as submitted (committed), And encapsulate it into Ready The instance is returned to the upper module .
(6) At this time, the upper module can transfer the Ready To be applied carried in the instance Entry Records are applied to the state machine .
边栏推荐
- 推荐收藏:跨云数据仓库(data warehouse)环境搭建,这货特别干!
- Redis getting started complete tutorial: Key Management
- D3.js+Three. JS data visualization 3D Earth JS special effect
- Qt个人学习总结
- MariaDB's Galera cluster application scenario -- multi master and multi active databases
- [sword finger offer] questions 1-5
- ECCV 2022 | 腾讯优图提出DisCo:拯救小模型在自监督学习中的效果
- SHP data making 3dfiles white film
- Redis入門完整教程:Pipeline
- 该如何去选择证券公司,手机上开户安不安全
猜你喜欢
Redis: redis transactions
Redis getting started complete tutorial: Key Management
Redis入门完整教程:哈希说明
ECCV 2022 | 腾讯优图提出DisCo:拯救小模型在自监督学习中的效果
Set up a website with a sense of ceremony, and post it to 1/2 of the public network through the intranet
高通WLAN框架学习(30)-- 支持双STA的组件
CTF競賽題解之stm32逆向入門
[machine learning] handwritten digit recognition
Talk about Middleware
字体设计符号组合多功能微信小程序源码
随机推荐
Redis: redis message publishing and subscription (understand)
Redis入門完整教程:Pipeline
Analysis of the self increasing and self decreasing of C language function parameters
ffmpeg快速剪辑
Redis getting started complete tutorial: hash description
Question brushing guide public
微软禁用IE浏览器后,打开IE浏览器闪退解决办法
Redis introduction complete tutorial: detailed explanation of ordered collection
Servlet服务器端和客户端中文输出乱码问题
Header file duplicate definition problem solving "c1014 error“
Insert sort, select sort, bubble sort
Redis入门完整教程:有序集合详解
Principle of lazy loading of pictures
A complete tutorial for getting started with redis: understanding and using APIs
A complete tutorial for getting started with redis: Pipeline
微信小程序显示样式知识点总结
A complete tutorial for getting started with redis: hyperloglog
【js】-【排序-相关】-笔记
A complete tutorial for getting started with redis: redis shell
可观测|时序数据降采样在Prometheus实践复盘