etcd

· 706 words · 2 minute read

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获取,并缓存,以此来实现可重复读。

  可重复读的实现点:

  1. readset缓存已经读过的数据,保持可重复读。
  2. readset中数据的modrevision与server中的modrevision相同,保持事务读到的数据是server中最新的。
  3. 事务提交时做冲突检测。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身份