etcd是kubernetes中的一个用于存储k8s元数据信息的存储单元(存储pod node deployment等资源信息),它是类似于redis的存储使用
etcd集群个数推荐或者说必须是奇数个
因为etcd遵循raft协议,需要选主 若为比如4个节点,当有两个节点follower(election time)选举时间到了成为candicate,它们会各自投自己一票,然后还剩两个,如果是一人一票,2比2则要重新投票,所以一般是奇数个etcd节点(http://thesecretlivesofdata.com/raft/)
下一任的leader的任期比上一任的要长。
数据同步是以心跳包的形式,比如etcd leader接受到了数据,它会将数据以心跳包的形式发送到follower上。
每一个key都有ttl,如果不续约就会过期。
raft协议类似下图:
日志复制
当Leader收到客户端的日志(事务请求)后,先把日志追加到本地的log中,然后通过heartbeat把entry同步给follower,follower接收到后像leader发送ACK,当Leader收到(n/2+1)follower的ACK后,将日志设置为以提交,并存到local磁盘中,通过hearbeat通知所有的follower将日志存储到本地磁盘。
安全性
如果leader坏了,那么需要保证新选的leader一定要包含之前的committed log的机制
**
WAL 日志(write ahead log)
**
wal日志是二进制的,解析出来是四个字段
第一个字段 type(0 nomal 1 ConfChange 表示etcd本身配置变更同步,比如有新的节点加入等)
第二个字段 term(任期),
第三个字段是index,递增的
第四个数据是二机制data,是protobuf结构
export ETCDCTL_API=3
目前大部分都是使用的etcd 版本三
etcdctl 是需要认证的一般使用格式如下
etcdctl --endpoints+https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/health-client.crt --key=/etc/health-client.key snapshot save /opt/data.db
可以使用别名
etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key member list -w table
查看所有key值
etcdctl get / --prefix --keys-only
查看集群节点状态
etcdctl endpoint status -w table
etcdctl endpoint health -w table
设置key值
etcdctl put wuyong 18
取key值
etcdctl get wuyong
etcd备份与恢复
etcd
etcdctl --endpoints+https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/health-client.crt --key=/etc/health-client.key snapshot save /opt/data.db
etcdctl restore /opt/data.db