简介
特点优势
etcd是一个强一致性的、分布式 key-value 存储系统,它支持数据可靠性存储和优雅的选举机制。
- 接口简单:通过标准的HTTP工具读写数据。
- 数据表示简单:存储key-value数据,可理解为一个有序的map。
- 安全:支持HTTPS方式的访问。
- 方便数据订阅:支持watch机制。watch机制指的是应用方可以针对存储在etcd中特定范围的数据创建watch监听器,在watch过程中,当对应数据发生变化时,etcd会根据watch记录追溯到应用方,对变更事件进行同步。
- 性能:基准压测支持1000w/sec写入
当使用 Kubernetes 声明式 API 部署服务的时候,Kubernetes 的控制器通过 etcd Watch 机制,会实时监听资源变化事件,对比实际状态与期望状态是否一致,并采取协调动作使其一致。
当Kubernetes 更新数据的时候,通过 CAS 机制保证并发场景下的原子更新,并通过对 key 设置 TTL 来存储 Event 事件,提升Kubernetes 集群的可观测性,基于 TTL 特性,Event 事件 key 到期后可自动删除。
架构
系统架构
etcd集群
通常由3个或者5个节点组成etcd集群。当中会有一个leader节点,用于处理写请求;leader先将数据操作保存成日志形式,并定时的将日志发往其他节点保存。当超过1/2节点成功保存了日志,则leader会将事务最终提交。
etcd的功能模块
- HTTP Server:用于接收客户端发出的API请求以及其他etcd节点的同步与心跳信息请求。
- Store:用于处理etc支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
- Raft强一致算法:是etcd的核心算法,多etcd节点通过Raft协议进行leader选举与数据备份,并保证了每个节点维护的数据都是一致的。
- WAL: Write ahead log,预写式日志。用于持久化存储。在WAL体系中,所有的数据在提交之前都会进行日志记录。在etcd的持久化存储目录中,有两个子目录。一个是WAL,存储着所有事物的变化记录;另一个是snapshot,用于存储某一个时刻etcd所有目录的数据。通过WAL和snapshot相结合的方式,etcd可以有效的进行数据存储和节点故障恢复等操作。
应用架构
Etcd 概述及运维实践
etcd watch 机制源码解析——客户端篇
部署
集群
常用命令
集群管理
# 检验etcd集群是否存在
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt member list
# 检验etcd集群是否正常
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints=https://192.168.0.143:2379,https://192.168.0.204:2379,https://192.168.0.78:2379 endpoint health --cluster
# 以表格形式展示
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl -w table --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints=https://192.168.0.143:2379,https://192.168.0.204:2379,https://192.168.0.78:2379 endpoint status --cluster
# 告警列表
alarm list
# 解除所有告警
alarm disarm
# 碎片整理
defrag
# 创建快照进行备份
snapshot save snapshot.db
# 快照恢复
snapshot restore
# 快照状态
snapshot status
Etcd备份与还原
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /srv/data/etcd-snapshot.d
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /srv/data/etcd-snapshot.d
增删改查
# 增 & 改
put foo bar
# 查
get foo
# 根据前缀查询
get --prefix "/demo"
# 查询所有 keys
get --prefix "" --keys-only
# 删
del foo
# 事务,多个操作合并为一个事务
txn <<<'mod("key1") > "0"
put key1 "overwrote-key1"
put key1 "created-key1"
put key2 "some extra key"
'
# 压缩
compaction 1234
# 监听
watch foo