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的主要应用场景:
Etcd的一致性对于正确安排和运行服务至关重要。
Kubernetes API服务器将集群状态持久化在etcd中,使用etcd的watch API监视集群,并发布关键的配置。
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来定位数据。
Etcd主要分为四个部分:


其中etcd.exe时服务端,etcdctl.exe是客户端


etcd

etcdctl是一个命令行客户端,可以对etcd服务进行测试或者手动修改数据库内容。另外,etcdctl还支持HTTP API。etcdctl支持的命令大体上可以分为数据库操作和非数据库操作两类。
数据库操作围绕对键值和目录的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/

非数据库操作包括:备份、监测、节点管理等
# 在一个终端运行
etcdctl watch key1
# 在2个终端运行put/get/del
etcdctl put key1 "zzz"
etcdctl get key1 # 因为get操作不改变值,所有watch没反应
etcdctl del key1
