1. 简介
https://etcd.io/
https://github.com/etcd-io/etcd
Etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。Etcd内部采用raft协议作为一致性算法,Etcd基于Go语言实现。
etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用,持久性数据存储和检索而准备。
Etcd的主要应用场景:
- 服务发现:服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或者服务如何找到对方并建立连接。
- 消息发布于订阅
- 负载均衡
- 分布式通知与协调
- 分布式锁
Etcd的一致性对于正确安排和运行服务至关重要。
Kubernetes API服务器将集群状态持久化在etcd中,使用etcd的watch API监视集群,并发布关键的配置。
2. 关键术语
Raft: etcd所采用的保证分布式系统强一致性的算法。
Node:一个Raft状态机实例。
Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
Cluster: 由多个Member构成可以协同工作的etcd集群。
Peer:对同一个etcd集群中另外一个Member的称呼
Client: 向etcd集群发送HTTP请求的客户端。
WAL:预写式日志,etcd用于持久化存储的日志格式。
snapshot: etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
Leader(领导者): Raft算法中通过竞选而产生的处理所有数据提交的节点
Follower(跟随者): 竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
Candidate: 当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选
Term: 某个节点成为Leader到下一次竟选开始的时间周期,称为一个Term。
Index:数据项编号。Raft中通过Term和Index来定位数据。
3. 工作原理
Etcd主要分为四个部分:
- 第1部分是HTTP server: 用于处理用户发送的API请求,以及其它etcd节点的同步与心跳信息请求。
- 第2部分是Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是Etcd对用户提供的大多数API功能的具体实现。
- 第3部分是Raft: Raft强一致性算法的具体实现,是Etcd的核心。
- 第4部分是WAL:Write Abead Log(预写式日志),是etcd的数据存储方式除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。 在WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照,Entry麦示存储具体日志内容。
- 通常,一个用户的请求发送过来,会经由HTTP Server转发给Store,以进行具体的事务处理。如果涉及到节点修改,则交给Raft模块进行状态变更、日志记录; 然后,再同步给别的etcd节点,以确认数据提交;最后,进行数据提交,再次同步。
4. 安装etcd
- 下载发布版本,下载地址:https://github.com/etcd-io/etcd/releases
- 将文件解压到指定目录
其中etcd.exe时服务端,etcdctl.exe是客户端
- 将该目录配置到环境变量
- 查看etcd版本
- 启动etcd
etcd
5. etcd的基本使用
etcdctl
是一个命令行客户端,可以对etcd服务进行测试或者手动修改数据库内容。另外,etcdctl
还支持HTTP API。etcdctl
支持的命令大体上可以分为数据库操作和非数据库操作两类。
5.1 数据库操作
数据库操作围绕对键值和目录的CRUD完整生命周期的管理。
Etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如:testkey。
# 帮助命令
etcdctl -h
# put:指定某个键的值
etcdctl put /testdir/testkey "Hello World"
# get:获取指定键的值
etcdctl get /testdir/testkey
# del:清空数据,删除所有/test前缀的节点
etcdctl del /test --prefix
# 其他命令
update/rm/mk/mkdir/setdir/updatedir/rmdir/ls/
5.2 非数据库操作
非数据库操作包括:备份、监测、节点管理等
- backup 备份etcd的数据
- watch 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
# 在一个终端运行
etcdctl watch key1
# 在2个终端运行put/get/del
etcdctl put key1 "zzz"
etcdctl get key1 # 因为get操作不改变值,所有watch没反应
etcdctl del key1
- member通过list、add、remove命令列出、添加和删除etcd实例节点到etcd集群中。