Etcd 是一个分布式的、高可用的键值存储系统,主要用作服务发现和配置共享。它是开源的,由 CoreOS 公司(现在已被 Red Hat 收购)开发,并且是 Kubernetes 等现代分布式系统的基石之一。
Etcd 基于 raft 一致性算法来保证数据在多个节点之间的强一致性。这意味着,即使在集群中的某些节点失败或网络分区的情况下,etcd 也能确保数据的一致性和可靠性。
1. etcd的诞生
etcd 之所以命名为 “etcd”,是因为它最初是为 Linux 系统的 /etc 目录设计的分布式版本,d 则代表分布式(distributed)。
1.1. etc 目录
1. /etc 目录的历史背景
/etc 目录的历史可以追溯到早期的 Unix 系统:
- Unix 系统设计:Unix 系统的设计哲学之一是“万物皆文件”。这意味着系统的配置信息、设备、进程等都可以通过文件系统进行管理。
- 目录结构:Unix 系统将配置文件集中存放在 /etc 目录下,形成了一种约定俗成的规范。这个目录包含了系统各个方面的配置文件,如用户信息、网络配置、服务配置等。
2. /etc 目录的设计理念
- 集中管理:通过将所有配置文件集中存放在 /etc 目录,系统管理员可以更方便地管理和修改系统配置。
- 层次结构:采用文件和子目录的层次结构,便于组织和查找配置文件。
- 文本文件:大部分配置文件采用纯文本格式,便于编辑和操作。
1.2. etcd 的诞生
1. etcd 的历史背景
etcd 诞生于分布式系统的需求背景下:
随着云计算和容器技术的发展,分布式系统变得越来越普遍。这样的系统需要一种可靠的方法来管理分布式环境中的配置和服务发现。
CoreOS 成立于 2013 年,致力于打造用于运行容器的轻量级操作系统和工具。etcd 就是 CoreOS 为了解决分布式配置管理和服务发现问题而开发的项目。
2. etcd 的设计理念
- 分布式一致性:使用 Raft 共识算法,保证数据在多个节点之间的一致性和高可用性。
- 简单易用:提供简单的键值对模型和 RESTful API,用户可以方便地进行数据存储和查询。
- 层次化键名:通过类似文件路径的键名,模拟层次化的配置管理。
- 实时通知:提供 Watch 机制,允许客户端实时监控键或前缀的变化。
1.3. 关联性
etcd 算是对 etc 概念上的继承:
- 配置管理:etcd 的设计初衷之一是作为分布式环境中的配置管理工具,这与 /etc 目录在单机环境中的作用类似。两者都致力于提供一种集中化的配置管理方式。
- 层次化结构:etcd 的键名采用类似文件路径的命名方式,这种层次化结构显然受到 /etc 目录层次化管理理念的启发。
但不要以为二者在技术实现上有什么关联,二者的设计实现完全没关系:
- 实现方式:/etc 目录依赖于文件系统,而 etcd 是一个基于键值对的分布式存储系统,底层实现和技术路径完全不同。
- 一致性保证:/etc 目录的配置文件是一种本地一致性,而 etcd 通过 Raft 共识算法实现了分布式环境下的强一致性。
2. 目录层级概念
但提交 etcd 命名来源于 linux 中 etc 目录,我第一反应是 etcd 不是键值对数据库吗?不是只有 zookeeper 的设计才像 etc 吗?
2.1. 前缀查询/监听
etcd 虽然是一个基于键值对的数据库,但它也支持类似目录层级的概念,使得它可以部分地模拟 /etc 目录的层次结构:
1.键命名:
etcd 的键通常使用类似文件路径的命名方式,这种命名方式使得键值对能够表示出层次结构。例如,/config/database/host
和 /config/database/port
可以分别存储数据库主机和端口的信息。
通过这样的命名约定,用户可以实现类似文件系统的层级结构。
2.前缀操作:
etcd 支持基于前缀的操作,用户可以通过前缀查询来获取某个层级目录下的所有键值。例如,通过查询 /config/database/
前缀,可以获取该前缀下的所有配置项。
这使得 etcd 能够灵活地管理和查询层次化的数据。
3. 递归观察(Watch):
etcd 的 Watch 机制支持前缀监听,这意味着可以监听某个前缀下的所有变化,类似于监听一个目录下所有文件的变化。这对于配置管理和服务发现非常有用。
2.2. 示例
设置层次化键值对
etcdctl put /config/database/host "localhost"
etcdctl put /config/database/port "5432"
etcdctl put /config/api/endpoint "https://api.example.com"
获取带前缀的键值对
etcdctl get /config/database/ --prefix
/config/database/host
localhost
/config/database/port
5432
监听带前缀的键值对
etcdctl watch /config/database/ --prefix
当 /config/database/
下的任何键值对发生变化时,监听器将会收到通知。
2.3. 总结
因此,虽然 Zookeeper 的树形数据模型和路径表示法使得它看起来更像是为 /etc 目录设计的。
但 etcd 也通过键命名约定、前缀操作、递归观察等机制,提供了类似目录层级的功能,以适应分布式配置管理的需求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。