基本概念
etcd
是一个分布式、强一致性,高可靠性的开源键值对存储系统,通常被用来配置管理或者服务发现,K8s就是用它来存储所有集群的状态信息的。
etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines. It gracefully handles leader elections during network partitions and can tolerate machine failure, even in the leader node.
特点
etcd
根据官方介绍具有以下特点
- 强一致性:使用raft一致性算法来保证各个节点数据的一致性
- HTTP协议简单API:提供了一个简单的HTTP/JSON API和GRPC接口,可以通过接口请求来存储和查找键值对数据
- 安全性:支持通过TLS加密和客户端证书验证来提高系统安全性
- 观察者模式:支持键值对的变更通知机制,使得应用程序可以订阅这些通知并自定义逻辑来处理
- TTL:支持设置键的超时时间,来实现自动删除过期数据
- 高性能:每个实例支持每秒1K次的写操作
安装
大致了解etcd
的特点后,根据官方的安装脚本来尝试一下,macOS系统上的安装步骤如下
1 | // 定义下载版本为3.5.11 |
基本操作
安装好后,我们来试下etcd
的基本使用方法和命令,这里了解和学习的是etcd3
,不同大版本之间存在一些不同特性
1 | // 在A终端启动一下etcd的服务 |
租约lease
在etcd
中有种稍微特殊一点的机制:租约Lease,用于为键值对设置过期时间(TTL,Time To Live)。Lease允许键值对在一段时间后自动过期,除非租约被续约。
PS:一个租约lease可以同时绑定多个键值对,但一个键值在任何时刻对只能对应一个租约lease
1 | // TTL单位是秒,同时被创建时立即生效,执行成功时会返回一个leaseId |
etcd
还支持对某个键或者特定前缀甚至全部键进行监听,当发生新增、修改、删除等操作时,etcd
就会向客户端发送一个时间通知
1 | // 监听某个特定的键 |
修订号revision
etcd
还有个很厉害的revision修订号特性,它用于标识键值存储中数据变动的版本。每当存储在etcd
中的数据发生变化(新增、删除、更新),全局的revision就会递增,revision在整个etcd
集群中是唯一标识。
我们在读取键值对时可以通过指定特定的revision号来读取历史读取,也可以监听某个键时从指定版本号开始。
PS:etcd
中每次操作其实都是通过事务来完成的,一个事务可能包含多个操作,所有操作要么全部成功,要么全部失败。每个成功的事务revision都会递增。
1 | // 存放键值对,通过--write-out="json"可以看到此时revision版本号为22 |
和zookeeper基本比较
可以看到etcd
的基本用法和API和zookeeper类似,他们都被用来做元数据的存储,依靠于云服务和k8s流行,etcd
在新项目中用的越来越多了。
etcd
相对于zookeeper,具有以下优点,
- 更简单的一致性算法(Raft)。
- 提供更现代的API接口(HTTP/gRPC)。
- 容易部署和操作(单个静态的Go二进制文件)。
- 与Kubernetes和其他现代分布式系统紧密集成。
- 支持租约和TTL,适用于服务发现和配置管理。
在k8s中etcd
是一个很重要的组件,他负责存储和管理所有集群数据,来确保集群的一致性和可用性。
- 持久化集群状态: Kubernetes的所有组件状态都存储在
etcd
中。这包括资源对象如Pods、Services、Deployments、ConfigMaps、Secrets等。 - API Server的后端存储: Kubernetes的API Server是与用户和内部组件交互的主要接口。当API Server收到资源的创建、更新或删除请求时,它会将这些更改反映到
etcd
中,以此来持久化这些更改。 - 服务发现和配置:
etcd
用于服务发现,存储内部服务的地址和端口,以便其他组件可以找到并与它们通信。同时,它也用于存储集群配置,如调度信息、节点信息等。 - 分布式锁和领导者选举: Kubernetes中的某些组件(如scheduler和controller manager)需要在多实例部署时进行领导者选举,以确保在任何给定时刻只有一个实例在执行操作。
etcd
提供了分布式锁和领导者选举功能。
Golang接入etcd
库通常使用官方库:go.etcd.io/etcd/client/v3
具体使用文档可看:https://github.com/etcd-io/etcd/tree/main/client/v3