etcd使用场景 🔗
- 共享配置
- 服务发现
- 选主
- 分布式锁
读多写少。
etcd arch 🔗

etcd中的事务隔离级别的实现 🔗
分别在server的mvcc基础上、在client上事务(stm.go 在客户端实现的事务框架)上实现隔离级别。
client v3中concurrency包。
//stm(software transactional memory)
type STM interface {
Get(key) // 返回value,并insert到txn的read set中。
Put(key, value) //写kv,并insert到txn的write set中。
......
}
struct stm实现了repeat read隔离级别,STM接口。
读请求: 先以本地为准,没有则去server获取,并缓存,以此来实现可重复读。
可重复读的实现点:
- readset缓存已经读过的数据,保持可重复读。
- readset中数据的modrevision与server中的modrevision相同,保持事务读到的数据是server中最新的。
- 事务提交时做冲突检测。rset readset, wset writeset, conflicts func() []v3.Cmp 。
读已提交(read committed)实现上 仅仅是conflicts没有做检测。
MVCC 的实现: 内存treeIndex(B树), boltdb(B+树)
treeIndex 原理: B树 (google开源的go版本codebase) key在内存中的布局, 节点的定义:
type treeIndex struct{
tree *btree.BTree
}
type KeyIndex struct {
key []byte
modified reversion // 最后一次修改的版本
generations []generation // 多次轮的create delete
}
type generation {
ver int //修改次数
created revision
revs []revision //一轮从创建到删除的过程
}
mutex.go 分布式锁的实现
leader 选举
- 发起投票
- 每个节点为follower, 每个节点均有election timeout到期时间,随机几百毫秒, 到期后身份变为candidate
- candidate 发起投票
- 投票过程
- term 大
- 日志最新
- 当选后 发心跳包维护leader身份