Etcd

概述

etcd 是一个高可用的分布式键值存储系统,由CoreOS公司开发,主要用于配置共享和服务发现(k8s底层)。作为一个分布式一致性数据库,etcd在分布式系统中起到了核心作用,能够确保数据的一致性和可靠性,特别是在需要协调多个服务或节点的场景中。

特点

作为维护分布式工作负载运行的数据并不是一项小任务。但etcd专为此任务而构建,从头开始设计,具备以下特点:

  • 完全复制:etcd集群中的每个节点都可以访问完整的数据存储;
  • 高度可用:etcd被设计为没有单一故障点,并且能够优雅地容忍硬件故障和网络分区;
  • 可靠一致:每次数据“读取”都会返回所有集群中的最新数据“写入”;
  • 快速:etcd 的性能经过测试,每秒可以写入10,000条数据;
  • 安全:etcd支持自动的传输层安全性(TLS)以及可选的安全套接字层(SSL))客户端证书认证;由于etcd存储着重要且高度敏感的配置数据,管理员应在部署中实施基于角色的访问控制,并确保与etcd交互的团队成员的访问权限限制在执行其工作所需的最低特权级别;
  • 简单:任何应用程序,从简单的Web应用到高度复杂的容器编排引擎(如Kubernetes),都可以使用标准的HTTP/JSON工具读取或写入数据到etcd。

需要注意的是,由于etcd的性能严重依赖存储磁盘速度,强烈建议在etcd环境中使用固态硬盘(SSD)。

运用场景

etcd是一个分布式键值存储系统,可以用于各种应用场景,特别是在构建分布式系统、容器编排和微服务架构时,它具有广泛的应用。以下是一些etcd的常见应用场景:

  1. 容器编排:etcd常用于容器编排系统(如Kubernetes)中,用于存储集群的状态信息、配置数据和服务发现信息;它帮助容器编排系统保持集群的一致性和高可用性,以及动态调整服务的配置。
  2. 服务发现:etcd允许服务在集群中进行注册和发现,使微服务之间能够轻松找到彼此。当服务的IP地址或端口发生变化时,etcd可以自动更新服务注册信息。
  3. 配置管理:etcd可用于存储配置数据,例如数据库连接字符串、API密钥、特性标志等。应用程序可以从etcd中读取这些配置信息,实现动态配置管理。
  4. 分布式锁:etcd提供了分布式锁的支持,可以用于协调多个进程或节点对共享资源的访问。这在分布式系统中实现互斥操作非常有用。
  5. 故障恢复:etcd可以用于保存系统的状态快照,以便在发生故障时快速恢复系统状态。这对于保障高可用性非常关键。
  6. 事件通知:etcd支持观察(watch)机制,可以监视存储中的更改,并在数据更改时触发事件通知,这对于构建实时应用非常有用。
  7. 分布式一致性:etcd的Raft共识算法确保了数据的一致性和可靠性,因此它可以用于各种需要分布式一致性的应用场景。

与Zookeeper的对比

在分布式系统中,etcdZookeeper都是广泛使用的分布式协调服务,它们在设计目标、功能、实现方式以及使用场景上有许多相似之处,但也存在一些关键的差异。以下是对它们的对比分析:

1. 架构和一致性协议

  • etcd:etcd使用Raft一致性算法来管理分布式系统中的数据一致性。Raft是一种设计相对简单且易于理解的算法,主要通过选举出一个Leader节点来管理日志的复制和状态的变更。Raft的设计注重易用性和安全性,在性能和一致性之间做了较好的平衡。
  • Zookeeper:Zookeeper采用了Zab协议(Zookeeper Atomic Broadcast)来实现分布式一致性。Zab协议专门为Zookeeper设计,支持主备(leader-follower)架构。Zab协议的设计更复杂,具有较高的性能和可扩展性,尤其适合在大规模分布式系统中使用。

2. 数据模型和操作

  • etcd:etcd的数据模型是一个简单的键值存储,支持通过层次化的路径组织数据,但其本质上仍然是一个扁平的KV存储系统。etcd的操作集中在CRUD(创建、读取、更新、删除)操作上,并且支持监听键值对的变化(Watch机制),这使得它在动态配置管理和服务发现中非常高效。
  • Zookeeper:Zookeeper使用的是一种类似文件系统的树形结构,数据存储在称为“znodes”的节点中,每个节点可以存储数据并作为子节点的父节点。Zookeeper支持更复杂的操作,比如创建有序节点(sequential nodes)、临时节点(ephemeral nodes),这在分布式锁和Leader选举场景中非常有用。

3. 使用场景

  • etcd:etcd通常被用作分布式系统中的配置管理和服务发现工具,特别是在云原生应用中,如Kubernetes。在Kubernetes中,etcd被用作集群的状态存储,跟踪所有节点和Pod的状态变化。此外,etcd还可以用于实现分布式锁和Leader选举,但这些功能通常是通过简单的API封装实现的,较为基础。
  • Zookeeper:Zookeeper在分布式系统中的使用更为广泛,尤其是在Hadoop生态系统中。它被广泛用于分布式锁、Leader选举、集群管理和服务注册等场景。Zookeeper的节点特性和丰富的操作集,使其在需要复杂协调的场景中表现得更加出色。例如,Kafka使用Zookeeper来管理集群元数据和协调生产者与消费者。

4. 易用性和性能

  • etcd:etcd以易用性著称,具有简单的API和较低的学习曲线。其设计使得开发者可以很容易地将etcd集成到应用中进行配置管理和服务发现。然而,在性能上,由于Raft协议的设计,etcd可能在写操作频繁的场景下表现得不如Zookeeper。
  • Zookeeper:Zookeeper在性能上更为强大,特别是在大规模集群和复杂操作场景中。然而,由于其Zab协议和复杂的数据模型,Zookeeper的学习曲线较高,配置和管理也更加复杂。Zookeeper需要手动管理集群节点的状态和配置,这对于新手来说可能有些挑战。
  • etcd的支持增量快照,避免了zookeeper的快照暂停问题
  • 堆外存储,没有垃圾回收暂停问题
  • 无需像zookeeper那样为每个watch 都做个socket连接,可以复用
  • zookeeper每个 watch只能收到一次事件通知,etcd可以持续监控,在一次watch触发之后无需再次设置一次 watch
  • zookeeper 会丢弃事件,etcd3持有一个事件窗口,在client断开连接后不会丢失所有事件

5. 社区和生态系统

  • etcd:etcd是云原生计算基金会(CNCF)的一部分,得到了广泛的社区支持,特别是在云原生和Kubernetes生态系统中。etcd的文档详细且更新频繁,适合现代云原生应用的开发和运维。
  • Zookeeper:Zookeeper是Apache基金会的项目,拥有长时间的开发历史和稳定的社区支持。它广泛应用于Hadoop生态系统、Kafka、HBase等大数据平台。Zookeeper的生态系统成熟,文档和工具链丰富,但其相对较老的设计在现代云原生应用中可能显得不够灵活。