Etcd 是 CoreOS 团队发起的一个管理配置信息和服务发现(Service Discovery)的项目。
它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。etcd 目前在 github.com/etcd-io/etcd 进行维护。
受到 Apache ZooKeeper 项目和 doozer 项目的启发,etcd 在设计的时候重点考虑了下面四个要素:
简单:具有定义良好、面向用户的 API (gRPC)
安全:支持 HTTPS 方式的访问
快速:支持并发 10 k/s 的写操作
可靠:支持分布式结构,基于 Raft 的一致性算法
Apache ZooKeeper 是一套知名的分布式系统中进行同步和一致性管理的工具。
doozer 是一个一致性分布式数据库。
Raft 是一套通过选举主节点来实现分布式系统一致性的算法,相比于大名鼎鼎的 Paxos 算法,它的过程更容易被人理解,由 Stanford 大学的 Diego Ongaro 和 John Ousterhout 提出。更多细节可以参考 raftconsensus.github.io。
一般情况下,用户使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性。
安装
二进制文件方式下载
编译好的二进制文件都在 github.com/etcd-io/etcd/releases 页面,用户可以选择需要的版本:
下载解压:
1 | [root@VM_0_3_centos ~]#curl -L https://github.com/etcd-io/etcd/releases/download/v3.4.0/etcd-v3.4.0-linux-amd64.tar.gz -o etcd-v3.4.0-linux-amd64.tar.gz |
复制到目录,并且复制到bin,etcd 是服务主文件,etcdctl 是提供给用户的命令客户端。
1 | [root@VM_0_3_centos etcd3.4]# cp etcd* /usr/local/bin/ |
启动
默认 2379 端口处理客户端的请求,2380 端口用于集群各成员间的通信。启动 etcd 显示类似如下的信息:
1 | [root@VM_0_3_centos etcd3.4]# etcd |
测试:
1 | #使用 etcdctl 命令进行测试,设置和获取键值 testkey: "hello world",检查 etcd 服务是否启动成功: |
也可以通过 HTTP 访问本地 2379 或 4001 端口的方式来进行操作,例如查看 testkey 的值:curl -L http://localhost:4001/v2/keys/testkey
Docker 镜像方式运行
镜像名称为 quay.io/coreos/etcd,可以通过下面的命令启动 etcd 服务监听到 2379 和 2380 端口。
1 | $ docker run \ |
打开新的终端按照上一步的方法测试 etcd 是否成功启动。
macOS 中运行
$ brew install etcd
$ etcd
$ etcdctl member list
Etcd 集群
使用 Docker Compose 模拟启动一个 3 节点的 etcd 集群。
docker-compose.yml 文件
1 | version: "3.6" |
使用 docker-compose up 启动集群之后使用 docker exec 命令登录到任一节点测试 etcd 集群。
1 | [root@VM_0_3_centos tmp]# docker ps |
使用 etcdctl
etcdctl 支持如下的命令,大体上分为数据库操作和非数据库操作两类。
1 | NAME: |
数据库操作
数据库操作围绕对键值和目录的 CRUD (符合 REST 风格的一套操作:Create)完整生命周期的管理。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如 testkey,此时实际上放在根目录 / 下面,也可以为指定目录结构,如 cluster1/node2/testkey,则将创建相应的目录结构。
注:CRUD 即 Create, Read, Update, Delete,是符合 REST 风格的一套 API 操作。
put/set
1 | $ etcdctl put /testdir/testkey "Hello world" |
get
获取指定键的值。例如
1 | $ etcdctl put testkey hello |
支持的选项为
–sort 对结果进行排序
–consistent 将请求发给主节点,保证获取内容的一致性
del
删除某个键值。例如
1 | $ etcdctl del testkey |
update
当键存在时,更新值内容。例如
1 | $ etcdctl set testkey hello |
当键不存在时,则会报错。例如
1 | $ etcdctl update testkey2 world |
非数据库操作
watch
监测一个键值的变化,一旦键值发生更新,就会输出最新的值。
例如,用户更新 testkey 键值为 Hello world。
$ etcdctl watch testkey
PUT
testkey
2
member
通过 list、add、update、remove 命令列出、添加、更新、删除 etcd 实例到 etcd 集群中。
例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。
1 | $ etcdctl member list |