ETCD - 必知必会

284 阅读3分钟

etcd是什么

A highly-available key value store for shared configuration and service discovery

etcd 是一个可靠的分布式 KV 存储,其底层使用 Raft 算法保证一致性,主要用于共享配置和服务发现

etcd应用

k8s底层使用etcd来进行集群内节点管理和配置存储

  • 服务发现(Service Discovery)
  • 消息发布与订阅
  • 负载均衡
  • 分布式通知与协调
  • 分布式锁
  • 分布式队列
  • 集群监控与 Leader 竞选

etcd原理

etcd架构

image.png

  1. Server : Communication with other etcd nodes (including heart beats).
  2. WAL : 日志体积不断增大, 这就需要定期生成Snapshot来压缩日志 (like redis AOF log), 当follower宕机许久或有新follower加入,leader发送snapshot entry消息(including snapshot and log)到这个follower, 以恢复状态.
  3. BoltDB :

image.png

etcd节点间通信

etcd server 层分为两种传输通道:

  1. Stream消息通道: 使用HTTP长连接, 发送体积小且频繁的消息, 比如heart beatsvote
  2. Pipeline消息通道: 在传输完成后会直接close掉, 发送体积大且不频繁的消息, 比如snapshot

节点状态转移

  1. leader:负责日志的同步管理,处理来自客户端的请求,与Follower保持这heartBeat的联系
  2. follower:刚启动时所有节点为Follower状态,响应Leader的日志同步请求,响应Candidate的请求,把请求到Follower的事务转发给Leader
  3. candidate:负责选举投票,Raft刚启动时由一个节点从Follower转为Candidate发起选举,选举出Leader后从Candidate转为Leader状态

日志复制

leader在接受客户端一条命令后, 先落到日志里WAL日志, 然后调用RPC接口AppendEntries并发将命令发到followers中, 等大部分followers都完成落盘日志并返回leader结果后, 这条日志才是可提交的(commited), leader再执行然后返回给client

线性一致性

etcd的读和写都是线性一致性

etcd读的线性一致性的实现原理:

image.png

etcd的leader在响应只读 请求前会broadcast心跳, 确保自己还是leader

etcd数据流

image.png

  1. leader收到读请求在取数之前会broadcast, 向所有followers发送heart beats, 获取超半数投票以确保自己是leader

etcd使用

homebrew运行

后台运行- brew services restart etcd 我不用

前台运行- /usr/local/opt/etcd/bin/etcd

安装包运行

前台运行/usr/local/opt/etcd/bin/etcd

etcdctl脚手架命令:

/usr/local/opt/etcd/bin/etcdctl put greeting "fuck world" // 写

/usr/local/opt/etcd/bin/etcdctl get greeting // 读

/usr/local/opt/etcd/bin/etcdctl watch greeting // 当“greeting”被修改时watch的进程会返回修改后的值
//(和zk不同的是,etcd可以一直监听多次变更,直到手动关闭链接)
// 会一直阻塞, 除非手动ctl+c

租约:

/usr/local/opt/etcd/bin/etcdctl lease grant 60
lease 694d85b4a1cfcc17 granted with TTL(60s)
// 创建一个生命周期为60s的租约

/usr/local/opt/etcd/bin/etcdctl lease list
found 2 leases
694d85b4a1cfcc17
694d85b4a1cfcc0b

// 查看剩多长时间
/usr/local/opt/etcd/bin/etcdctl lease timetolive 694d85b4a1cfcc2e
lease 694d85b4a1cfcc2e granted with TTL(120s), remaining(107s)

// 自动续租约, 是一个阻塞的会话, 每隔一定的时间就会自动再重置为120s过期
/usr/local/opt/etcd/bin/etcdctl lease keep-alive 694d85b4a1cfcc31
lease 694d85b4a1cfcc31 keepalived with TTL(120)

/usr/local/opt/etcd/bin/etcdctl put key value --lease=694d85b4a1cfcc17

分布式锁:

/usr/local/opt/etcd/bin/etcdctl lock xylock
xylock/694d85b4a1cfcc23

// 此时另一个客户端再lock xylock, 会阻塞住, 直到第一个客户端断开连接, 另一个客户端会返回:
xylock/694d85b4a1cfcc23

REF

https://byte dance.fei shu.cn/wiki/wikcnaD5xVMwJ9eeNFwybnHsfuc#rI0xJB
tech.byte dance.net/articles/6997240069635440677
zhuanlan.zhihu.com/p/73659512
zhuanlan.zhihu.com/p/42239873