Masutangu

也許我這一生 始終在追逐那顆九號球

Designing Data-Intensive Applications 读书笔记(一)

Chapter 1. Reliable, Scalable, and Maintainable Applications Thinking About Data Systems Increasingly many applications now have such demanding or wide-ranging requirements that a single tool can...

TiKV 源码阅读(未完成)

TiKV 使用 RocksDB 做持久化存储引擎。将 key 分 range,每一段称为 Region。Region 分散在多台机器上以实现存储的水平扩展。每个 Region 会存放多个副本在不同机器上,使用 raft 算法管理: PD 负责整个 TiKV 集群的调度。 TiKV 使用 version 的方式进行多版本控制(MVCC): 1 2 3 4 5 6 7 Key1-Ver...

raft-rust 初体验

之前分析了使用 golang 实现的 etcd-raft,这几天再读了下 rust 实现的 raft-rs,简单说下对比。rust 版应该是基于 golang 版来实现的,所有的类、方法基本上是一致的。 从样例看起,let (sender, receiver) = mpsc::channel(); 创建了 channel 用于线程之间数据传递(类似 golang 的 channel)。调用...

etcd-raft 源码学习笔记(PreVote)

这篇文章介绍 etcd-raft 的 PreVote 机制,避免由于网络分区导致 candidate 的 term 不断增大。 Election timeout 之后,发送 type 为 pb.MsgHup 的请求,进入选举阶段: 1 2 3 4 5 6 7 8 9 // tickElection is run by followers and candidates after r.el...

etcd-raft 源码学习笔记(Leader Transfer)

这篇文章介绍 etcd-raft 如何实现 leadership transfer,把 leader 身份转移给某个 follower。 应用层调用 TransferLeadership 方法,发送一个 type 为 pb.MsgTransferLeader 的请求给 raft 处理。 1 2 3 4 5 6 7 8 func (n *node) TransferLeadership(c...

etcd-raft 源码学习笔记(Linearizable Read 之 Lease)

这篇文章介绍 etcd-raft 如何实现 linearizable read(linearizable read 简单的说就是不返回 stale 数据,具体可以看这篇文章 《Strong consistency models》)。 除了基于 ReadIndex 之外,raft 论文第 8 节还阐述了另一种基于 heartbeat 的 lease 思路: Alternatively...

etcd-raft 源码学习笔记(Linearizable Read 之 ReadIndx)

这篇文章介绍 etcd-raft 如何实现 linearizable read(linearizable read 简单的说就是不返回 stale 数据,具体可以看这篇文章 《Strong consistency models》)。 raft 论文第 8 节阐述了思路: Read-only operations can be handled without writing anyt...

etcd-raft 源码学习笔记(概览篇)

这篇文章主要整体上介绍 etcd-raft 库,包括各个类的作用,类之间的串联。不涉及 raft 算法。先来看看 etcd-raft 几个结构体的定义: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 type raft struct { id uint64 Term uint64 Vote uint64...

etcd-raft 源码学习笔记(示例篇)

本系列文章为 etcd-raft 源码阅读笔记,采用自顶向下的方式。这篇是开篇,首先来看看 etcd 提供的基于 raft 库实现的 kv store 示例,代码目录位于 contrib/raftexample。 从 main 函数开始读起: 1 2 3 4 5 6 7 8 9 10 11 12 func main() { ... proposeC := make(cha...

Libco 之 coctx_swap

前言 在之前的文章《浅读 Libco》 粗略的介绍了 libco,这篇文章则重点关注协程上下文切换的实现细节(coctx_swap.S)。 首先回顾下函数调用的 stack frame layout: 调用子函数时,父函数从右到左将函数入栈,最后将返回地址入栈保存后,跳到子函数的地址执行。子函数压栈保存父函数的 ebp,并将 ebp 设置为当前 esp。子函数通过 ebp + 4 ...