了解etcd

核心:TTL & CAS
TTL(time to live)指的是给一个key设置一个有效期,到期后这个key就会被自动删掉,这在
很多分布式锁的实现上都会用到,可以保证锁的实时有效性。
Atomic Compare-and-Swap(CAS)指的是在对key进行赋值的时候,客户端需要提供一些条
件,当这些条件满足后,才能赋值成功。这些条件包括:
• prevExist:key当前赋值前是否存在
• prevValue:key当前赋值前的值
• prevIndex:key当前赋值前的Index
这样的话,key的设置是有前提的,需要知道这个key当前的具体情况才可以对其设置

了解一下etcd 基于raft是如何选举的,etcd是一个分布式系统,每个节点有三种状态,follower candidater,leader,现在还有learner他不参加选举,只接受数据,在集群初始化完成之后,每个节点都会有一个election timeout的倒计时,它在150到200ms之间,当某个节点的倒计时结束时,他就变成candidater然后给其他节点发送请求成为节点的的信号,当它收到超过半数的投票的时候,他就变成了leader,并且向其他节点发送信号,重置他们的election timeout超时时间,当有请求写入数据的时候都会交给leader,当有半数的节点同意后,这个数据才被commit掉,当这个leader挂掉后,其他节点收不到心跳,就会变成candidater,就可能变成leader,这个时候的leader是term也可以说成任期为2的leader,任期越大,话语权越大,如果是四个节点可能会有两个candidater收到的票数一样,这样的话这次投票作废,如果我们有5个节点,某个时刻网络出现了分区,上面三个节点,下面2个leader,这个时候会出现脑裂,这个时候两个节点的数据是写不进去的,因为他没超过半数同意,最多才两个,而上面三个节点的数据请求才能写进去
在这里插入图片描述当接Leader收到客户端的日志(事务请求)后先把该日志追加到本地的Log中,然后通过heartbeat把该Entry同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送ACK,当Leader收到大多数(n/2+1)Follower的ACK信息后将该日志设置为已提交并追加到本地磁盘中,通知客户端并在下个heartbeat中Leader将通知所有的Follower将该日志存储在自己的本地磁盘中

它的安全性是通过log一致性保持的,失效的leader有可能会成为新的leader,新的leader会包含前一个commit log,wal日志,wal日志是一个二进制的文件,他有很多字段,第一个是type,有两种一种是0 表示正常,一种是1表示的是有变更,第二个字段是term,他随着leader变化而增加,第三个是index,然后是data,下图是etcd存储,watch,和过期机制
在这里插入图片描述etcd的存储有两种状态,一部分是索引,它在内存中是kvindex,另一部分是boltdb,他支持k v存储,key是revision,从而实现多版本也也包含个两个部分,一个是main rev 一个是sub rev,etcd也提供了也提供了命令去控制版本数,
获取以前的版本

etcdctl --endpoints https://localhost:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt get a --rev=62932

在这里插入图片描述当服务端收到写入请求的时候,发到客户端也会交给服务端来处理,首先etcd会做配额检查,配额不够了肯定会直接拒绝,然后如果请求过多的话会做限速处理,然后就是鉴权,etcd有完整的认证机制,最后就是看看你这个包的大小是否超过了1.5m,这些都通过之后,这个请求会到kvserver,它的作用类似一个中央枢纽,kvserver把请求放到一致性模块,请求放入到msgprop 这个input里面,可能是我们设置put a 等于10,然后放到存在于memory raftlog的unstable里,因为它现在是不稳定状态,返回output:ready,kvserver收到这个信息的时候,会通过rpc协议把这个写入请求发给其他follower节点,让他们写入,同时会写wal日志,要做序列化,也是不稳定的,它后台有个fsync周期性的把数据同步到硬盘,这个时候我们是get不到这个数据的,因为还没有经过mvcc模块,当收到半数以上的节点写入了得response的时候,kvserver会把raftlog中的unstable状态变成committed状态,然后进入mvcc模块,首先会写treeindex,它的key就是数据的key,value是版本信息然后写boltdb,日志模块相当于一个临时存储,只有超过半数的人确定了,才写入mvcc模块,这个数据才真正被写到etcd中

etcd v3 的watch机制支持watch某个固定的key,也支持watch一个范围,所以 watchGroup 包含两种watcher,一种是 key watchers,数据结构是每个key对应一组watcher,另外一种是 range watchers, 数据结构是一个 IntervalTree,方便通过区间查找到对应的watcher。同时,每个 WatchableStore 包含两种 watcherGroup,一种是synced,一种是unsynced,前者表示该group的watcher数据都已经同步完毕,在等待新的变更,后者表示该group的watcher数据同步落后于当前最新变更,还在追赶。
当 etcd 收到客户端的watch请求,如果请求携带了revision参数,则比较请求的revision和store当前的revision,如果大于当前revision,则放入synced组中,否则放入unsynced组。同时 etcd 会启动一个后台的goroutine持续同步unsynced的watcher,然后将其迁移到synced组。也就是这种机制下,etcd v3 支持从任意版本开始watch,没有v2的1000条历史event表限制的问题
参数配置详解

--name 节点名称
--data-dir 数据存储目录
--wal-dir 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。未设置,共用--data-dir文件所在目录
--snapshot-count 数据快照触发数量,etcd处理指定的次数的事务提交后,生产数据快照
--heartbeat-interval 客户端连接后的心跳间隔
--election-timeout 集群选举的超时时间
--listen-peer-urls 本节点与其他节点进行数据交换(选举,数据同步)的监听地址,地址写法是 scheme://IP:port,可以多个并用逗号隔开,如果配置是http://0.0.0.0:2379,将不限制node访问地址
--listen-client-urls 本节点访问地址,地址写法是 scheme://IP:port,可以多个并用逗号隔开,如果配置是http://0.0.0.0:2379,将不限制node访问地址
--max-snapshots 最大快照数量 0表示不限制,在window平台设置无效。
--max-wals 最大预写日志数量 0表示不限制,在window平台设置无效
--initial-advertise-peer-urls 通知其他节点与本节点进行数据交换(选举,同步)的地址,URL可以使用domain地址
--initial-cluster 集群所有节点配置,多个用逗号隔开
--initial-cluster-state 节点初始化方式,new 表示如果没有集群不存在,创建新集群,existing表示如果集群不存在,节点将处于加入集群失败状态
--initial-cluster-token 集群唯一标识,相同标识的节点将视为在一个集群内
--advertise-client-urls 用于通知其他ETCD节点,客户端接入本节点的监听地址,一般来说advertise-client-urls是listen-client-urls子集
--discovery 集群发现服务地址
--discovery-srv DNS发现服务地址
--cert-file ''
Path to the client server TLS cert file.
--key-file ''
Path to the client server TLS key file.
--client-crl-file ''
Path to the client certificate revocation list file.
--trusted-ca-file ''
Path to the client server TLS trusted CA cert file.
--peer-cert-file ''
Path to the peer server TLS cert file.
--peer-key-file ''
Path to the peer server TLS key file.
--peer-trusted-ca-file ''
Path to the peer server TLS trusted CA file.

下面模拟etcd满了怎样处理

etcd --listen-client-urls 'http://localhost:12379'  --advertise-client-urls 'http://localhost:12379'  --listen-peer-urls 'http://localhost:12380'  --initial-advertise-peer-urls 'http://localhost:12380'  --initial-cluster 'default=http://localhost:12380' --quota-backend-bytes=$((16*1024*1024))
while [ 1 ]; do dd if=/dev/urandom bs=1024 count=1024 | ETCDCTL_API=3 etcdctl --endpoints=http://127.0.0.1:12379  put key || break; done

在这里插入图片描述
在这里插入图片描述etcdctl --endpoints=http://127.0.0.1:12379 alarm lis
在这里插入图片描述etcdctl --endpoints=http://127.0.0.1:12379 defrag

![在这里插入图片描述](https://img-blog.csdnimg.cn/41e6273aa2ef41d495e907728a533af3.png
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值