etcd是什么
A highly-available key value store for shared configuration and service discovery
etcd 是一个可靠的分布式 KV 存储,其底层使用 Raft 算法保证一致性,主要用于共享配置和服务发现
etcd应用
k8s底层使用etcd来进行集群内节点管理和配置存储
- 服务发现(Service Discovery)
- 消息发布与订阅
- 负载均衡
- 分布式通知与协调
- 分布式锁
- 分布式队列
- 集群监控与 Leader 竞选
etcd原理
etcd架构
- Server : Communication with other etcd nodes (including
heart beats). - WAL : 日志体积不断增大, 这就需要定期生成
Snapshot来压缩日志 (likeredis AOF log), 当follower宕机许久或有新follower加入,leader发送snapshot entry消息(includingsnapshotand log)到这个follower, 以恢复状态. - BoltDB :
etcd节点间通信
etcd server 层分为两种传输通道:
Stream消息通道: 使用HTTP长连接, 发送体积小且频繁的消息, 比如heart beats和votePipeline消息通道: 在传输完成后会直接close掉, 发送体积大且不频繁的消息, 比如snapshot
节点状态转移
leader:负责日志的同步管理,处理来自客户端的请求,与Follower保持这heartBeat的联系follower:刚启动时所有节点为Follower状态,响应Leader的日志同步请求,响应Candidate的请求,把请求到Follower的事务转发给Leadercandidate:负责选举投票,Raft刚启动时由一个节点从Follower转为Candidate发起选举,选举出Leader后从Candidate转为Leader状态
日志复制
leader在接受客户端一条命令后, 先落到日志里WAL日志, 然后调用RPC接口AppendEntries并发将命令发到followers中, 等大部分followers都完成落盘日志并返回leader结果后, 这条日志才是可提交的(commited), leader再执行然后返回给client
线性一致性
etcd的读和写都是线性一致性
etcd读的线性一致性的实现原理:
etcd的leader在响应只读 请求前会broadcast心跳, 确保自己还是leader
etcd数据流
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