
etcd
文章平均质量分 69
huang_0_3
这个作者很懒,什么都没留下…
展开
-
BlotDB 学习总结(一)
此次阅读 BlotDB 源码的目的主要是为了了解BlotDB如何实现如下功能。1.学习 DB 文件是如何通过字节组织成具体的文件、如何进行读写?2.BoltDB 如何实现事务?3.BlotDB 如何实现 MVCC?4.通过 BlotDB 了解 mmap。本章主要为了阐述“学习DB文件是如何进行通过字节组织成具体的文件,如何进行读写?”。page 介绍在 BlotDB,一个 db 就是一个文件,以 page 为单位进行读写,并且通过 page 来组织 db文 件,具体可以查看pag原创 2022-05-28 08:31:17 · 543 阅读 · 0 评论 -
ETCD 源码学习--Prometheus Client
在本文只是简单对 Prometheus Client 从源码角度做一些简单的介绍,并不对其进行深度研究。主要文件/github.com/prometheus/client_golang/prometheus/desc.go 度量指标,主要功能通过相关统计信息生成唯一的 id 和 dimHash,作为度量的唯一标识。/github.com/prometheus/client_golang/prometheus/metric.go 度量模型,定义统计的接口。/github.com/promet.原创 2021-04-10 08:22:45 · 426 阅读 · 0 评论 -
ETCD 源码学习--watch&lessor的调度
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。lessor 作用是用于控制某个键值的有效期,watch 作用是监控某个 key 值(或者某段范围)的数据变动。数据变动主要有两种情况,一是客户端调用API 对 key 进行修改,二是 key 过期,本章主要介绍的是 lessor 与 watch 直接的调用关系。主要文件/mvcc/kv_view.go 读写事务的实现/mvcc/watchab.原创 2021-04-02 08:45:43 · 296 阅读 · 0 评论 -
ETCD 源码学习--Watch(server)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。主要文件/etcdserver/api/v3rpc/watch.go watch 服务端实现/mvcc/watcher.go 主要封装 watchStream 的实现/mvcc/watchable_store.go watch 版本的 KV 存储实现/mvcc/watchable_store_txn.go 主要实现事务提交后 End(...原创 2021-03-27 09:01:03 · 722 阅读 · 0 评论 -
ETCD 源码学习--Watch(client)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。客户端监控某个key,或某个范围key变化,当被监控的key的值有任何变动,都会主动通知客户端。主要文件/etcd/clientv3/watch.go结构图主要数据结构//对外提供 Watch 接口,同时负责关闭 grpcStream 的流程。type watcher struct {//访问服务的RPC客户端 remote原创 2021-03-13 08:53:55 · 607 阅读 · 0 评论 -
ETCD 源码学习--lease(二)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。本文主要介绍 lessor 如果发现过期键,server 如何处理过期键的过程。过期 lease 发现lessor goroutinefunc (le *lessor) runLoop() { defer close(le.doneC) for { le.revokeExpiredLeases() le.checkpointSchedu原创 2021-03-06 08:38:58 · 626 阅读 · 0 评论 -
ETCD 源码学习--lease(一)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。租赁,在 etcd中主要用于设置 key 的有效期,主要流程:1.获取一个 leaseId,并设置 leaseId 的 有效期,将 key 与 leaseId 绑定。2.ectd 后台启动一个 goroutine, 定时检查过期 leaseId,并且清除。主要文件/lease/lease.go 定义lease & lessor相关的...原创 2021-02-27 08:55:11 · 1460 阅读 · 0 评论 -
ETCD 源码学习--节点数据传输 Transport 源码
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。节点添加/etcdserver/server.go 中,NewServer 会调用如下 AddRemote 和 AddPeer 添加节点//添加远程节点func (t *Transport) AddRemote(id types.ID, us []string) { t.mu.Lock() defer t.mu.Unlock() if t.re原创 2021-02-17 09:58:40 · 320 阅读 · 0 评论 -
ETCD 源码学习--节点数据传输 Transport 简述
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。Transport 主要实现节点之间的数据传输。主要文件/pkg/transport/transport.go 覆写了 net 中 RoundTrip 函数,其他 /pkg/transport/ 下的文件主要作用是实现一些网络连接的参数设置,比如读写超时、连接超时、长连接等。/etcdserver/api/rafthttp/transport.g..原创 2021-02-06 09:56:48 · 500 阅读 · 0 评论 -
ETCD 源码学习--MVCC KV存储实现(二)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。ETCD 的键值存储主要通过 bbolt(键值存储数据库)进行存储,bblot 保证了读事务并发性和写事务的串行性,这里不深究 bbolt 的具体实现。本文只说明 ETCD 如何通过 bbolt和 Index 实现键值的多版本控制存储。key由 revison 组成, 格式为分为 main_sub(t), 如果带 t, 表示元素被删除。/mvcc/.原创 2021-02-06 09:27:42 · 510 阅读 · 0 评论 -
ETCD 源码学习--MVCC 代码实现(一)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。主要文件/mvcc/revision.go mvcc版本号存储定义/mvcc/index.go 索引操作的对外接口定义和具体实现/mvcc/key_index.go key的版本管理及相关操作定义和具体实现/mvcc/kv.go kv接口定义/mvcc/kv_view.go readView与 writeView定义/mv...原创 2021-01-23 10:40:56 · 500 阅读 · 1 评论 -
ETCD 源码学习--MVCC 实现概述
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。MVCC 多版本并发控制,是通过保存多个版本的数据,以实现事务之间彼此独立,即某个事务的增删改,不会影响到其他事务的数据视图。同时在同一个事务中,在事务结束之前,看到的数据视图是一致的(可重复读)。概述ETCD 主要通过版本 ID 实现多版本并发(revision),版本的组成包括一个 main 主版本 ID,在每次进行增删改操作(新事物)时,main+原创 2021-01-16 09:28:27 · 542 阅读 · 0 评论 -
ETCD 源码学习--WAL 实现
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。预写式日志(Write Ahead Log, WAL),其核心思想是,所有的修改在提交之前都要先写入 log,通过日志记录描述好数据的改变后,再写入缓存,等缓存区写满后,再往持久层修改数据。目的在于,在系统崩溃后,能够在日志指导下恢复到崩溃前的状态,避免数据丢失。WAL 详细介绍:https://segmentfault.com/a/119000001805原创 2021-01-08 20:09:48 · 1153 阅读 · 0 评论 -
ETCD 源码学习--Raft 提案消息的旅程(十二)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。消息的来源主要有两种,一个是终端的API请求,另个一是节点内部自动发起的消息,比如心跳。而不同消息类型的处理已经在前面的文章中说明,这里不再累赘,本文只介绍一个提案消息发送到 Leader节点直到被节点应用的流程。主要流程1.将提交消息传递到底层 Node处理(/ectdserver/v3_server.go)。(1) 终端调用API,设置新键值..原创 2021-01-01 16:02:40 · 354 阅读 · 0 评论 -
ETCD 源码学习--Raft 节点实现的代码结构(十一)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。Raft节点在代码上主要通过三个模块,他们包括: raft模块:用于实现底层的 raft 协议。 node模块:封装 raft模块,作为中间层,即将外部的消息提案传递到底层 raft模块,同时将 raft模块中,待上层模块处理的消息传递到 raftNode中。 raftNode模块:用于处理 raft底层的消息,将消息应用到自...原创 2020-12-26 09:38:31 · 508 阅读 · 0 评论 -
ETCD 源码学习--Raft log 的实现(十)
Raft中 log模板主要包括两个部分的存储,一是未持久化的 log,另一个是已持久化的 log。未持久化的 log (unstable log)是客户端进行的提案,当前节点接收到了消息,只是暂时放到了一个 msgs队列,但未进行处理,需要等待上层模块进行持久化和进行相应的处理。持久化 log (stable)是当前节点的上层应用对 msgs队列中的消息进行了相关处理之后,存储到 stable中。并且对 unstable log进行 commit。所以一个 log要么存储在 uns...原创 2020-12-20 11:24:30 · 833 阅读 · 4 评论 -
ETCD 源码学习--Raft 中 progress 的 inFlight 实现(九)
首先需要搞清什么是 inFlight,inFlight在 Raft中存储的是已发送给 Follower的 MsgApp消息,但没有收到 MsgAppResp的消息 Index 值。简单的说就是 Leader 发送一个消息给 Follower,Leader在对应的 Follower状态维护结构(progress)中,将这个消息的 ID记录在 inFlight中,当 Follower收到消息之后,告知 Leader收到了这个 ID的消息,Leader将从 inFlight中删除,...原创 2020-12-12 19:24:25 · 720 阅读 · 0 评论 -
ETCD 源码学习--Raft 中 Leader 如何维护节点状态(八)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。主要文件/raft/tracker/progress.go 在 Leader 节点中,每个节点即是一个 progress 实例。/raft/tracker/tracker.go tracker用于维护所有节点状态、记录投票和选举结算、计算并更新 MatchIndex(被多数节点接收的Index) 等。源码progress数据结构...原创 2020-11-28 10:56:11 · 308 阅读 · 0 评论 -
ETCD 源码学习--Raft 选举的 Quorum 机制实现(七)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。Quorum相关介绍参考:https://blog.youkuaiyun.com/wxb880114/article/details/81604245Quorum在 etcd中主要作用有两个,一是计算已被多数节点接收(Match) 的 Index。二是在进行 Leader 选举时,计算选举结果。主要文件/raft/quorum/majority.go ...原创 2020-11-28 09:43:39 · 766 阅读 · 0 评论 -
ETCD 源码学习--Raft 协议选举过程(六)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习选举触发方式1.Follower 节点选举计数器超时,触发MsgHup 消息, Follower 节点接收此消息时,会发起一轮选举。2.当 Leader 节点选举计数器超时,触发MsgCheckQuorum 消息,且当前节点经过检查之后,发现当前节点不能维持 Leader 状态,Leader 会切换为 Follower 等待选举超时。3. 当 Le..原创 2020-11-21 10:49:42 · 658 阅读 · 1 评论 -
ETCD 源码学习--Raft 协议的逻辑时钟及相关消息类型(五)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。逻辑时钟1.本章主要讲述的是raft协议中的逻辑时钟推进逻辑,就前面章节所提到的,raft 中有两个时间计数器,它们分别是选举计数器 (Follower/Candidate)和心跳计数器 (Leader),它们都依靠 tick 来推进时钟。// etcdserver/raft.go (后台线程)func (r *raftNode) start(r.原创 2020-11-21 09:41:34 · 666 阅读 · 2 评论 -
ETCD 源码学习--Raft 协议实现的消息类型说明(四)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习消息类型注释文档: /ectd/raft/doc.go代码地址: /ectd/raft/raft.go消息 说明 MsgBeat 心跳消息(tickHeartbeat),该消息会触发 Leader 广播心跳消息。 MsgHeartbeat 当 Leader 被触发广播心跳消息时,会发送该类型的消息给 Follower(send原创 2020-11-14 11:13:59 · 326 阅读 · 0 评论 -
ETCD 源码学习--Raft 协议实现的文件说明及 Raft 数据结构解析(三)
在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。主要文件说明在ETCD中,Raft协议实现的源码主要在 etcd/raft 目录下1.raft.go 实现Raft协议的主要逻辑。2.log.go 用于维护日志记录,其中包括两部分 log,持久化 log 和 未持久化 log3.log_unstable.go 用于维护未持久化 log4.stable.go 定义存储接口协议,同时实...原创 2020-11-07 10:42:32 · 567 阅读 · 0 评论 -
ETCD 源码学习--Raft 协议介绍(二)
Raft协议是分布式一致性协议的一种,所以在了解Raft协议之前,我们首先要知道一致性协议的作用。一致性协议1.一致性协议用于解决分布式环境下多副本之间数据一致性的问题的。2.主要包括两个部分,一是 Leader 选举,二是日志同步。3.一致性协议主要包括Paxos、ZAB、Raft及 Gossip 等raft协议1.简图2.状态机Leader:负责处理所有客户端请求,当接收到客户的写入请求时,Leader 节点相应追加日志,然后封装成消息发送给其他 Follower 节原创 2020-10-31 08:42:32 · 391 阅读 · 0 评论 -
ETCD 源码学习--简述(一)
前段时间认真学习了 ETCD 源码实现,往后的一段时间,会陆陆续续的写一些学习记录。ETCD 的使用方法、用途等,可以通过 Google 或者百度查询,这里只是记录源码相关的学习,如有错误,欢迎指正。本章主要介绍 ETCD 的主要几个组成部分。ECTD主要包括以下几个部分:Storage存储包括两部分组成,内存和磁盘。index:键值索引(MVCC 多版本控制)kv:原始键值对(MVCC 多版本控制)snaphot:数据快照metadata:元数据,主要记录当前节点的状态原创 2020-10-24 09:13:34 · 561 阅读 · 0 评论